检测视频有没有被剪辑

原来选题叫队友坑了
新的题目好像非常简单!
主要是检测帧之间的画面变化 用了dHash算法

import cv2
import numpy as np
from PIL import Image

print("input the video name")
FILE_NAME=input()
TO_WRITE="pic.jpg"
CHECK_FLAG = 0
FAIL_POS = 0.77
vidget=cv2.VideoCapture(FILE_NAME)

writename = 0
def dHash(image):

    hash = []
    for i in range(8):
        for j in range(8):
            if image[i,j]>image[i,j+1]:
                hash.append(1)
            else:
                hash.append(0)
    return hash

def ham_distance(hash1,hash0):
    num = 0
    for i in range(len(hash1)):
        if hash1[i] != hash0[i]:
            num += 1
    return num


if __name__ == "__main__":
    while True:
        #截取
        success, pic = vidget.read()
        if not success:
            break
        filename=str(writename)+TO_WRITE
        writename ^= 1
        millisecond=vidget.get(cv2.CAP_PROP_POS_MSEC)
        second = millisecond // 1000
        minute = second // 60
        minute = int(minute)
        second = int(second)
        second %= 60
        cv2.imwrite(filename,pic)
        #比较 dHash algorithm
        '''
        将图片缩小为9*8大小
        灰度化处理
        计算差异值,获得最后哈希值(与aHash主要区别处)。
        比较每行左右两个像素,
            如果左边的像素比右边的更亮(左边像素值大于右边像素值),则记录为1,否则为0。
        因为每行有9个像素,左右两个依次比较可得出8个值,所以8行像素共可以得出64个值,
        因此此时哈希值为长度是64的0-1序列。
        计算汉明距离。
        '''
        image0 = Image.open('0pic.jpg')
        image1 = Image.open('1pic.jpg')
        image1 = np.array(image1.resize((9,8),Image.ANTIALIAS).convert('L'),'f')
        image0 = np.array(image0.resize((9, 8), Image.ANTIALIAS).convert('L'), 'f')
        hash0=dHash(image0)
        hash1=dHash(image1)
        distance=ham_distance(hash1,hash0)
        similarity=1.0 - distance/64.0
        if similarity < FAIL_POS:
            
            print(minute,' minute',second,' second detected with similarity',similarity)
			CHECK_FLAG = 1
			
    if CHECK_FLAG == 0:
        print("no edit detected")

过几天有时间的话也许会调调FAIL_POS的数据…除非故意给跳跃的视频录屏,效果还是可以的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值