第五节课 视频分镜

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文件夹中

 再尝试使用三直方图进行相似度计算

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值