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

2022/2/24 20:51:46

本文主要是介绍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特征提取计算相似度算法与直方图相似度算法过滤并删除大部分重复内容。

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

结果示例:

过滤前

 

 

 过滤后

 



这篇关于ORB特征点提取与直方图相似度结合算法过滤视频关键帧的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程