使用Python進行視頻相似度比較實例
更新時間:2023年07月28日 11:09:43 作者:培根芝士
這篇文章主要介紹了使用Python進行視頻相似度比較實例,本文通過漢明距離算法與圖片比較等方法對比兩個視頻流的相似度,文中提供了部分實現(xiàn)代碼與解決思路,需要的朋友可以參考下
Python視頻相似度比較
1、安裝依賴庫
pip3 install numpy pip3 install opencv-python
2、獲取圖片哈希值
def pHash(img): # 縮放圖片為32x32灰度圖片 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.resize(img, (32, 32), interpolation=cv2.INTER_CUBIC) # 創(chuàng)建二維列表 h, w = img.shape[:2] vis0 = np.zeros((h,w), np.float32) vis0[:h,:w] = img # 二維Dct變換 vis1 = cv2.dct(cv2.dct(vis0)) vis1 = vis1[:8, :8] # 把二維list變成一維list img_list = vis1.flatten().tolist() # 計算均值, 得到哈希值 avg = sum(img_list) * 1. / 64 avg_list = [0 if i < avg else 1 for i in img_list] return avg_list
3、求漢明距離
def hanming_dist(s1, s2): return sum([ch1 != ch2 for ch1, ch2 in zip(s1, s2)])
4、輸入比較的兩個視頻流,返回是否相似。
幀相似度>=0.85返回True,否則返回False
def compare(video1: cv2.VideoCapture = None, video2: cv2.VideoCapture =None) -> bool:
# 獲取較短視頻的幀數(shù)
min_frame_count = min(video1.get(cv2.CAP_PROP_FRAME_COUNT),
video2.get(cv2.CAP_PROP_FRAME_COUNT))
# 獲取視頻FPS
fps1 = video1.get(cv2.CAP_PROP_FPS)
similar = 0
frame_cnt = int(min_frame_count / fps1)
# 截幀
for _ in range(frame_cnt):
for _ in range(int(fps1)): # 按視頻一間隔1s
retval1 = video1.grab()
retval2 = video2.grab()
if not retval1 or not retval2:
grab_failure_cnt += 1
if grab_failure_cnt >= 10:
raise Exception('Grab failed too much >= {} times, could be endless loop.'.format(10))
else:
grab_failure_cnt = 0
flag1, frame1 = video1.retrieve()
flag2, frame2 = video2.retrieve()
# 提phash特征
if flag1 & flag2:
phash1 = pHash(frame1)
phash2 = pHash(frame2)
# 比較漢明距離
if hanming_dist(phash1, phash2) < 12:
similar += 1
print("similar:", similar/frame_cnt, frame_cnt)
return similar / frame_cnt5、調(diào)用示例
def compareVideo(srcVideo, dstVideo): video1 = cv2.VideoCapture(srcVideo) video2 = cv2.VideoCapture(dstVideo) return compare(video1, video2)
到此這篇關(guān)于使用Python進行視頻相似度比較實例的文章就介紹到這了,更多相關(guān)Python視頻相似度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python上下文管理器的用法(Context Manager)
上下文管理器是Python中管理資源分配與釋放的重要機制,通過with語句實現(xiàn)資源的自動管理,它適用于文件操作、數(shù)據(jù)庫連接、線程鎖管理等場景,可保證資源正確釋放,本文總結(jié)了上下文管理器的實現(xiàn)方式、應(yīng)用場景、最佳實踐和高級用法,旨在幫助開發(fā)者更好地掌握這一強大工具2026-04-04
Python正則表達式?r'(.*)?are?(.*?)?.*'的深入理解
日常的開發(fā)工作中經(jīng)常會有處理字符串的需求,簡單的字符串處理,我們使用python內(nèi)置的字符串處理函數(shù)就可以了,但是復(fù)雜的字符串匹配就需要借助正則表達式了,這篇文章主要給大家介紹了關(guān)于Python正則表達式?r‘(.*)?are?(.*?)?.*‘的相關(guān)資料,需要的朋友可以參考下2022-07-07
Python項目報錯ModuleNotFoundError的終極解決方案
在?Python?項目開發(fā)中,很多同學都會遇到ModuleNotFoundError的問題報錯,下面小編就和大家詳細介紹一下具體的實現(xiàn)方法,希望對大家有所幫助2026-01-01
使用python執(zhí)行shell腳本 并動態(tài)傳參 及subprocess的使用詳解
這篇文章主要介紹了使用python執(zhí)行shell腳本 并動態(tài)傳參 及subprocess的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

