视频相似度对比 python opencv sift flann

news2024/11/27 20:55:19

 提取SIFT特征的代码,返回关键点kp及特征描述符des

def SIFT(frame):
    # 创建SIFT特征提取器
    sift = cv2.xfeatures2d.SIFT_create()

    # 提取SIFT特征
    kp, des = sift.detectAndCompute(frame, None)

    return kp, des

这行代码是使用SIFT(Scale-Invariant Feature Transform)算法在图像中检测关键点并计算对应的特征描述符。

在这行代码中,sift是一个SIFT特征提取器的实例,detectAndCompute是它的一个方法,用于在给定的图像中检测关键点并计算特征描述符。

这个方法有两个参数:第一个参数是输入的图像,第二个参数是一个掩码,用于指定在哪些地方检测关键点。在这个例子中,我们没有使用掩码,所以第二个参数是None

这个方法返回两个值:kpdes

  • kp是一个列表,包含了在图像中检测到的所有关键点。每个关键点是一个KeyPoint对象,包含了关键点的位置、大小、角度、响应度等信息。

  • des是一个NumPy数组,包含了每个关键点的特征描述符。每个特征描述符是一个128维的向量,可以用于比较不同关键点(或来自不同图像的关键点)的相似性。

总的来说,这行代码的作用就是使用SIFT算法提取图像的关键点和特征描述符,这些关键点和特征描述符可以用于图像匹配、物体检测、图像识别等任务。


特征描述匹配算法

FlannBasedMatcher 是 OpenCV 中的一个特征匹配方法,它使用了近似最近邻搜索算法(Approximate Nearest Neighbors,简称 FLANN)来寻找特征之间的匹配。这种方法的主要优点是它在大规模数据集上的性能非常好,尤其是在处理高维特征(例如 SIFT 或 SURF)时。

FLANN 是一种优化的最近邻搜索算法,它可以在高维空间中快速找到查询点的最近邻。传统的最近邻搜索算法(例如暴力搜索)在高维空间中的性能往往很差,因为它们需要对每一个可能的匹配进行计算,这在处理大规模数据集时会变得非常慢。FLANN 通过使用一种叫做 k-d 树的数据结构,以及一种叫做优先级搜索的策略,来大大加快搜索速度。

FLANN 的另一个优点是它可以自动选择最优的搜索算法和参数,这使得它可以在各种不同的数据集和特征类型上都有很好的性能。然而,这也意味着 FLANN 可能需要一些时间来调整这些参数,因此在小规模数据集上,FLANN 可能不如其他更简单的方法(例如暴力搜索或基于哈希的方法)快。

总的来说,FlannBasedMatcher 的主要优势是它在处理大规模、高维特征数据集时的性能和效率。然而,这也意味着它可能不适合所有的应用场景,尤其是在数据集较小或特征维度较低的情况下。

# 近似匹配
# 近似最近邻搜索算法来找到最佳匹配
def FlannMatcher(des1, des2):
    # 创建FLANN匹配器
    FLANN_INDEX_KDTREE = 1
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)  # KD树索引 树的数量5
    search_params = dict(checks=50)  # 回溯查找的次数
    flann = cv2.FlannBasedMatcher(index_params, search_params)

    # 使用FlannBasedMatcher比较特征描述符
    matches = flann.knnMatch(des1, des2, k=2)

    # 应用比例测试(ratio test)来选择好的匹配
    good_matches = []
    for m, n in matches:
        if m.distance < 0.7 * n.distance:
            good_matches.append([m])

    return good_matches

根据视频流取帧进行特征对比
def process(path1, path2):
    # 读取视频
    cap1 = cv2.VideoCapture(path1)
    cap2 = cv2.VideoCapture(path2)
    index = 0
    # matches_over_time 根据时序得到特征匹配结果
    # scores 记录每个匹配的得分情况 根据 最佳匹配/提取特征数 计算
    matches_over_time, scores = [], []
    while True:
        index = index + 1
        # 读取第一帧
        ret1, frame1 = cap1.read()
        ret2, frame2 = cap2.read()
        if not ret1:
            break
        if not ret2:
            break
        if index % 25 != 0:  # 每秒一帧进行采样
            continue
        # 如果成功读取帧
        if ret1 and ret2:
            kp1, des1 = SIFT(frame1)
            kp2, des2 = SIFT(frame2)
            good_matches = FlannMatcher(des1, des2)
            matches_over_time.append(good_matches)
            # 计算得分
            score = len(good_matches) / min(des1.shape[0], des2.shape[0])
            scores.append(score)
    # 释放资源
    cap1.release()
    cap2.release()
    return matches_over_time, scores

# 主函数调用
if __name__ == '__main__':
    path1 = 'video_base.mp4'
    path2 = 'video_origin.mp4'
    t1 = int(time.time() * 1000)
    matches, scores = process(path1, path2)
    t2 = int(time.time() * 1000)
    print(f"用时 {(t2-t1)/1000.0}s")
    total_score = sum(scores) / len(scores)
    print(f"相似度得分 {round(total_score, 7)}")
    # cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1291348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode:1466. 重新规划路线 | DFS + 图 + 树】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

SE考研真题总结(一)

本帖开始分享考研真题中设计【软件工程】的部分&#xff0c;预计会出5期左右&#xff0c;敬请期待~ 一.单选题 1.程序编写不是软件质量保障过程~ 静态代码扫描是今年来多数被人提及的软件应用安全解决方案之一&#xff0c;指程序员在编写好代码后无需进行编译&#xff0c;直接…

校园外卖小程序源码系统 附带完整的搭建教程

随着大学生消费水平的提高&#xff0c;对于外卖服务的需求也在不断增加。很多学生都面临着课业繁重、时间紧张等问题&#xff0c;无法亲自到餐厅就餐。因此&#xff0c;开发一款适合校园外卖市场的应用软件&#xff0c;将为广大学生提供极大的便利。 以下是部分代码示例&#…

WSL2+tensorflow-gpu 2.3.0 C++ 源码编译(Linux)

一. gcc版本 wsl2已有gcc 版本为9.4.0,但tensorflow2.3.0需对应gcc7.3.1 tensorflow与cuda cudnn python bazel gcc版本对应关系 故需下载一个低版本的gcc,但同时还想保留较高版本的gcc,那么参考文章:深度学习环境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切换解…

网络安全(一)--网络环境构成,系统的安全

2. 网络攻防环境 目标 了解攻防环境构成了解入侵检测系统&#xff08;平台&#xff09;的部署位置 2.1. 环境构成 2.1.1. 环境框图 一个基本的网络攻防实验环境包括&#xff1a;靶机、攻击机、入侵检测分析系统、网络连接四部分组成。 一个基础的网络攻防实验环境需要如下…

SpringSecurity6 | 默认用户生成(下)

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

visionOS空间计算实战开发教程Day 9 打造“任意门”

我们在​​Day 8​​中演示了attachment的实现&#xff0c;本节的知识点是portal。portal相当于哆啦A梦里的任意门&#xff0c;它让我们可以打开另一个世界&#xff0c;这个世界独立于当前的世界&#xff0c;具有单独的光照系统并且由portal几何图形进行遮罩。 要创建portal&a…

利器|一款集成的BurpSuite漏洞探测插件

本着市面上各大漏洞探测插件的功能比较单一&#xff0c;因此与TsojanSecTeam成员决定在已有框架的基础上修改并增加常用的漏洞探测POC&#xff0c;它会以最少的数据包请求来准确检测各漏洞存在与否&#xff0c;你只需要这一个足矣。 1、加载插件 2、功能介绍 &#xff08;1&a…

pure::variants—产品平台化及变体管理工具

产品概述 pure::variants是德国pure-systems公司的产品&#xff0c;其目的是帮助企业实现对产品线的变体管理&#xff0c;提高企业项目资产的复用效率。pure::variants的核心理念是运用产品线管理方法对项目资产&#xff08;项目计划、需求、模型、功能模块、代码、测试用例&am…

【C语言】用户空间使用非缓存内存

在用户空间使用非缓存内存通常不是标准做法&#xff0c;因为非缓存内存的操作与硬件平台紧密相关&#xff0c;并且通常被保留给内核模块或设备驱动程序使用。 一、方法 用户空间程序一般不直接处理非缓存内存问题&#xff0c;因为它们依赖于操作系统来管理内存缓存一致性。尽…

外包干了3个月,技术倒退2年。。。

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

《C++ Primer》第12章 动态内存(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 我们的程序目前只用过静态内存和栈内存。静态内存用来保存局部 static 对象、类 static 成员、定义在任何函数之外的变量&#xff1b;栈内存用来保存定义在函数内的非 static 对象。分配在静态内存和栈内存的…

GPT 中文提示词技巧:参照 OpenAI 官方教程

前言 搜了半天什么 prompt engineering 的课&#xff0c;最后会发现 gpt 官方其实是有 prompt 教程的。因此本文主要是学习这篇教程。 概述 - OpenAI API 部分案例是参考&#xff1a;根据吴恩达老师教程总结出中文版prompt教程_哔哩哔哩_bilibili up主的内容。 一、尽可能清…

批量AI创作文案的工具,批量AI创作文章的软件

人工智能&#xff08;AI&#xff09;的应用不断拓展&#xff0c;其中批量AI创作逐渐成为许多文本创作者和企业编辑的热门选择。面对海量的文章需求&#xff0c;批量AI创作工具能够高效、快速地生成大量文本内容&#xff0c;从而减轻创作者的工作负担。本文将专心分享批量AI创作…

一对一互相聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

day14_java中的IO流(详解)

IO流 学习IO&#xff0c;我们必须要知道硬盘上的文件(文件夹)在java中的表现形式 一、File文件 Java中 提供了一个类 File 供我们使用; File &#xff1a; 文件和目录&#xff08;文件夹&#xff09;路径名的抽象表示 1、构造方法&#xff1a; File(File parent, String …

【环境搭建】ubuntu22安装ros2

基于某种特殊需求&#xff0c;从Ubuntu16到22目前都尝试过安装ros、ros2 参考1&#xff1a;http://t.csdnimg.cn/DzvSe 参考2&#xff1a;http://t.csdnimg.cn/sOzr1 1.设置locale sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 s…

Linux---逻辑卷管理

本章主要介绍逻辑卷的管理。 了解什么是逻辑卷创建和删除逻辑卷扩展逻辑卷缩小逻辑卷逻辑卷快照的使用 前面介绍了分区的使用&#xff0c;如果某个分区空间不够&#xff0c;想增加空间是非常困难的。所以&#xff0c;建议尽可能使用逻辑卷而非普通的分区&#xff0c;因为逻辑卷…

VideoAssembler 一种新颖的方法,生成具有多样化内容的视频的方法

文章目录 摘要方法代码 VideoAssembler: Identity-Consistent Video Generation with Reference Entities using Diffusion Model 本文提出了VideoAssembler&#xff0c;一种新颖的方法&#xff0c;生成具有多样化内容的视频。它可以保留实体的保真度&#xff0c;并生成可控的内…

从零开始的c语言日记day40——字符函数和字符串函数——内存函数

常用函数介绍 求字符串长度 strlen 长度不受限制的字符串函数 Strcpy Strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查找 Strstro strtok 错误信息报告 strerror 字符操作 内存操作函数 memcpy memmove memset Memcmp 使用Asser…