1.均值哈希算法
用于分析两张图片的相似度
首先将视频按帧保存为图片到文件夹中
import os
import cv2
v_path='ghz.mp4'
image_save='./pic'#需要新建一个名为‘pic’的文件夹
cap=cv2.VideoCapture(v_path)
frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
for i in range(int(frame_count)):
_,img=cap.read()
#img=cv2.cvtColor(img,cv2.cv2.COLOR_BGR2GRAY)
cv2.imwrite('./pic/image{}.jpg'.format(i),img)
(1)两帧画面进行均值哈希分析
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
def aHash(img):
plt.imshow(img)
plt.axis('off')
plt.show()
img=cv2.resize(img,(8,8))
plt.imshow(img)
plt.axis('off')
plt.show()
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
s=0
hash_str=''
for i in range(8):
for j in range(8):
s=s+gray[i,j]
avg=s/64
for i in range(8):
for j in range(8):
if gray[i,j]>avg:
hash_str=hash_str+'1'
else:
hash_str=hash_str+'0'
return hash_str
def cmpHash(hash1,hash2):
n=0
print(hash1)
print(hash2)
if len(hash1)!=len(hash2):
return-1
for i in range(len(hash1)):
if hash1[i]!=hash2[i]:
n=n+1
return n
img1=cv2.imread('./pic/image0.jpg')
img2=cv2.imread('./pic/image1.jpg')
hash1=aHash(img1)
hash2=aHash(img2)
n=cmpHash(hash1,hash2)
print('均值哈希算法相似度:',n)
结果:
(2)遍历每一帧图片进行分析并保存不同镜头的图片
import os
from PIL import Image
print(os.getcwd())
for i in range(549):
img1=cv2.imread('./pic/image{}.jpg'.format(i))
img2=cv2.imread('./pic/image{}.jpg'.format(i+1))
hash1=aHash(img1)
hash2=aHash(img2)
n=cmpHash(hash1,hash2)
if(n>20):
print('均值哈希算法相似度:',n/64)
cv2.imwrite('./shot/image{}.jpg'.format(i+1),img2)
结果:
2.三直方图算法相似度
通过画面颜色对比进行相似度分析
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
def classify_hist_with_split(image1,image2,size=(256,256)):
image1=cv2.resize(image1,size)
image2=cv2.resize(image2,size)
plt.imshow(image1)
plt.show()
plt.axis('off')
plt.imshow(image2)
plt.show()
plt.axis('off')
sub_image1=cv2.split(image1)
sub_image2=cv2.split(image2)
sub_data=0
for im1,im2 in zip(sub_image1,sub_image2):
sub_data+=calculate(im1,im2)
sub_data=sub_data/3
return sub_data
def calculate(image1,image2):
hist1=cv2.calcHist([image1],[0],None,[256],[0.0,255.0])
hist2=cv2.calcHist([image2],[0],None,[256],[0.0,255.0])
plt.plot(hist1,color="r")
plt.plot(hist2,color="g")
plt.show()
degree=0
for i in range(len(hist1)):
if hist1[i]!=hist2[i]:
degree=degree+(1-abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
else:
degree=degree+1
degree=degree/len(hist1)
return degree
img1=cv2.imread('./pic/image158.jpg')
img2=cv2.imread('./pic/image159.jpg')
n=classify_hist_with_split(img1,img2)
print('三直方图算法相似度:',n)
结果:
3.截取1分钟视频进行实验
我使用了一个空镜合集视频作为材料,其中有很多不同的空镜镜头
输入以下命令截取视频的前1分钟
ffmpeg -i /Users/tiankaichun/Desktop/test.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:01:00 ./out1.mp4 -y
结果:
将视频按帧保存成图片
import os
import cv2
v_path='out1.mp4'
image_save='./pic2'#需要新建一个名为‘pic2’的文件夹
cap=cv2.VideoCapture(v_path)
frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
for i in range(int(frame_count)):
_,img=cap.read()
#img=cv2.cvtColor(img,cv2.cv2.COLOR_BGR2GRAY)
cv2.imwrite('./pic2/image{}.jpg'.format(i),img)
得到文件夹pic2
用哈希算法计算相邻两帧画面的相似度,得到结果
再使用哈希算法保存不同镜头的画面,保存到shot2文件夹中
再尝试使用三直方图进行相似度计算