编程语言
首页 > 编程语言> > ORB特征点提取与直方图相似度结合算法过滤视频关键帧

ORB特征点提取与直方图相似度结合算法过滤视频关键帧

作者:互联网

import cv2
import os
from PIL import Image

similary = 0.4 # 相似度值,可根据初步结果进行调整

# 读取并比较文件夹下的图片,同时删除相似图片
def read_dir(dir_name):
    if os.path.exists(dir_name):
        dir = os.listdir(dir_name)
        for file_name1 in range(len(dir)):
            for file_name2 in range(file_name1 + 1, len(dir)):
                img1 = dir_name + "\\" + dir[file_name1]
                img2 = dir_name + "\\" + dir[file_name2]
                if os.path.exists(img1) and os.path.exists(img2):# 循环中有部分内容会被删除,在此处进行判断
                    # print("{}与{}进行比较".format(img1, img2))
                    result1 = float(ComImg(img1, img2))
                    result2 = float(RGBImg(img1, img2))
                    if result1 >= similary or result2 >= similary:
                        os.remove(img2)

def ComImg(img1_path,img2_path):
    try:
        # 读取图片
        img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
        img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)

        # 初始化ORB检测器
        orb = cv2.ORB_create()
        kp1, des1 = orb.detectAndCompute(img1, None)
        kp2, des2 = orb.detectAndCompute(img2, None)

        # 提取并计算特征点
        bf = cv2.BFMatcher(cv2.NORM_HAMMING)
        # knn筛选结果
        matches = bf.knnMatch(des1, trainDescriptors=des2, k=2)

        # 查看最大匹配点数目
        good = [m for (m, n) in matches if m.distance < 0.75 * n.distance]
        similary = len(good) / len(matches)
        return similary
    except:
        return '0'

# 直方图相似度
def RGBImg(img1_path, img2_path):
    img1 = Image.open(img1_path).convert('RGB')
    img2 = Image.open(img2_path).convert('RGB')

    def hist_similar(lh, rh):
        assert len(lh) == len(rh)
        return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)
    result = hist_similar(img1.histogram(), img2.histogram())
    return result


dir_name = 'C:\\Users\\Desktop\\frame'
read_dir(dir_name)

文件夹路径下的内容为:素材视频中每隔10帧抽取的图片,为避免后期大量处理,通过ORB特征提取计算相似度算法与直方图相似度算法过滤并删除大部分重复内容。

经初步测试,直方图相似度可以过滤同一镜头下不同对焦产生的重复图像,但具体效果因素材而异。

结果示例:

过滤前

 

 

 过滤后

 

标签:关键帧,name,cv2,直方图,path,img2,img1,ORB,dir
来源: https://www.cnblogs.com/hortz/p/15933315.html