视频相似度对比 python opencv sift flann

 提取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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go--协程

协程 协程是Go语言最大的特色之一。 1、协程的概念 协程并不是Go发明的概念&#xff0c;支持协程的变成语言有很多。Go在语言层面直接提供对协程的支持称为goroutine。 1.1 基本概念 进程 进程是应用程序启动的实例&#xff0c;每个进程都有独立的内存空间&#xff0c;不同…

WEB组态编辑器(BY组态)介绍

BY组态是一款非常优秀的纯前端的【web组态插件工具】&#xff0c;可无缝嵌入到vue项目&#xff0c;react项目等&#xff0c;由于是原生js开发&#xff0c;对于前端的集成没有框架的限制。同时由于BY组态只是一个插件&#xff0c;不能独立运行&#xff0c;必须嵌入到你方软件平台…

如何在报表工具 FastReport Cloud 中使用 ClickHouse

FastReport Cloud 是一项云服务 (SaaS)&#xff0c;旨在为您的企业存储、编辑、构建和发送报告。您的整个团队可以从世界任何地方访问这些报告&#xff0c;并且无需创建自己的应用程序。 FastReport Cloud 试用&#xff08;qun&#xff1a;585577353&#xff09;https://chat8.…

高翔《自动驾驶与机器人中的SLAM技术》第九、十章载入静态地图完成点云匹配重定位

修改mapping.yaml文件中bag_path&#xff1a; 完成之后会产生一系列的点云文件以及Keyframe.txt文件&#xff1a; ./bin/run_frontend --config_yaml ./config/mapping 生成拼接的点云地图map.pcd文件 &#xff1a; ./bin/dump_map --pose_sourcelidar 。、 完成第一次优…

数据清洗、特征工程和数据可视化、数据挖掘与建模的主要内容

1.4 数据清洗、特征工程和数据可视化、数据挖掘与建模的内容 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.4节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学…

JVM 虚拟机(二)类的生命周期

类的声明周期描述了一个类加载、使用和卸载的整个过程。 一个类的声明周期包括五个阶段&#xff1a;加载、连接、初始化、使用、卸载&#xff0c;其中连接部分分为验证、准备和解析阶段。 加载阶段 加载阶段是第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式…

CAN总线协议编程实例

1. can.h #ifndef __CAN_H #define __CAN_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/ /* CAN 引脚 定义 */#define CAN_RX_GPIO_PORT GPIOA #define CAN_RX_GPI…

【Maven】未找到有效的 Maven 安装。在配置对话框中设置主目录,或者在系统上设置 M2_HOME 环境变量。

错误显示 今天导入工程&#xff0c;进行clean的时候报错&#xff1a; 解决方法 重新设置一下maven的目录即可

微机原理14

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 字符’A’的 ASCI 码是&#xff08;&#xff09; A. OAH B. 41H C. 61H D. OAOH 2, 8086微处理器的地址线有(&#xff09; A. 16条…

RabbitMQ-学习笔记(初识 RabbitMQ)

本篇文章学习于 bilibili黑马 的视频 (狗头保命) 同步通讯 & 异步通讯 (RabbitMQ 的前置知识) 同步通讯&#xff1a;类似打电话&#xff0c;只有对方接受了你发起的请求,双方才能进行通讯, 同一时刻你只能跟一个人打视频电话。异步通讯&#xff1a;类似发信息&#xff0c…

根据既定数组创建数组的方法汇总 (第3讲)

根据既定数组创建数组的方法 &#xff08;第3讲&#xff09;         &#x1f379;博主 侯小啾 感谢您的支持与信赖。☀️ &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔…

2021年第十届数学建模国际赛小美赛A题气道阻力的评估解题全过程文档及程序

2021年第十届数学建模国际赛小美赛 A题 气道阻力的评估 原题再现&#xff1a; 气道阻力的定义是通过肺气道产生单位气流所需的经肺压力的变化。更简单地说&#xff0c;它是嘴和肺泡之间的压力差&#xff0c;除以气流。影响气道阻力的因素是多方面的&#xff0c;我们需要探讨这…

python 数据分析

数据分析 数据分析是指用适当的方法对收集的数据进行分析,提取有用信息并且形成结论. 广义的数据分析包括狭义的数据分析和数据挖掘.狭义的数据分析是指根据目的,采用对比分析,分组分析,交叉分析,回归分析等分析方法,对数据进行分析和处理,得到特征统计量的过程.数据挖掘是指…

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 参考资料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

[FPGA 学习记录] 快速开发的法宝——IP核

快速开发的法宝——IP核 文章目录 1 IP 核是什么2 为什么要使用 IP 核3 IP 核的存在形式4 IP 核的缺点5 Quartus II 软件下 IP 核的调用6 Altera IP 核的分类 在本小节当中&#xff0c;我们来学习一下 IP 核的相关知识。 IP 核在 FPGA 开发当中应用十分广泛&#xff0c;它被称为…

Spark RDD惰性计算的自主优化

原创/朱季谦 RDD&#xff08;弹性分布式数据集&#xff09;中的数据就如final定义一般&#xff0c;只可读而无法修改&#xff0c;若要对RDD进行转换或操作&#xff0c;那就需要创建一个新的RDD来保存结果。故而就需要用到转换和行动的算子。 Spark运行是惰性的&#xff0c;在…

UE Http笔记

c参考链接 UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客 虚幻引擎:UEC如何对JSON文件进行读写?-CSDN博客 UE4 HTTP使用 官方免费插件 VaRest 在代码插件创建的VaRest - 虚幻引擎商城 UE5在蓝图中使用Varest插件Get&#xff0c;Post两种常见请求方式…

C# Solidworks二次开发:三种获取SW设计结构树的方法-第二讲

今天这篇文章是接上一篇文章的&#xff0c;主要讲述的是获取SW设计结构树节点的第二种方法。 这个方法获取节点的逻辑是先获取最顶层节点&#xff0c;然后再通过获取顶层节点的子节点一层一层的把所有节点都找出来&#xff0c;也就是需要递归。想要用这个方法就要了解下面几个…

常见的校验码

在计算机领域中&#xff0c;校验码是一种用于检测或纠正数据传输或存储中错误的技术。校验码通常通过在数据中添加一些冗余信息来实现。其主要目的是确保数据的完整性和准确性。 奇偶校验码&#xff08;Parity Check&#xff09; 奇校验&#xff1a; 确保数据中二进制位中的1的…

JWT安全及WebGoat靶场

JWT 安全 cookie(放在浏览器) cookie 是一个非常具体的东西&#xff0c;指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie 由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把 cookie 以 kv 形式保存到某个目录下的…