ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-24 20:02:49  阅读:194  来源: 互联网

标签:关键帧 name cv2 直方图 path img2 img1 ORB dir


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有