使用Python進行視頻相似度比較實例
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_cnt
5、調(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中pandas.DataFrame排除特定行方法示例
這篇文章主要給大家介紹了關(guān)于python中pandas.DataFrame排除特定行的方法,文中給出了詳細的示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03詳解Python的數(shù)據(jù)庫操作(pymysql)
這篇文章主要介紹了Python的數(shù)據(jù)庫操作(pymysql),非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-04-04python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作
這篇文章主要介紹了python 讀txt文件,按‘,’分割每行數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07python機器學(xué)習(xí)實現(xiàn)神經(jīng)網(wǎng)絡(luò)示例解析
這篇文章主要為大家介紹了python機器學(xué)習(xí)python實現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例解析,在同樣在進行python機器學(xué)習(xí)的同學(xué)可以借鑒參考下,希望能夠有所幫助2021-10-10基于python3.7利用Motor來異步讀寫Mongodb提高效率(推薦)
Motor是一個異步mongodb driver,支持異步讀寫mongodb。它通常用在基于Tornado的異步web服務(wù)器中。這篇文章主要介紹了基于python3.7利用Motor來異步讀寫Mongodb提高效率,需要的朋友可以參考下2020-04-04