在 OpenCV 中使用 SURF 测量模式识别的准确性

2024-01-06

我目前正在 OpenCV 中使用 SURF 进行模式识别。到目前为止我有什么:我已经用 C# 编写了一个程序,我可以在其中选择源图像和我想要查找的模板。之后,我将两张图片传输到 C++-dll 中,在其中使用 OpenCV-SURFDetector 实现了一个程序,该程序将所有关键点和匹配项返回到我的 C# 程序,在其中我尝试在匹配项周围绘制一个矩形。

现在我的问题是:模式识别是否有通用的准确性衡量标准?例如匹配数量与模板中关键点数量的比例?或者也许我的匹配矩形和模板图像的原始尺寸之间的尺寸差异?用于判断匹配是否“真实”和“良好”匹配的常用参数有哪些?

Edit:为了让我的问题更清楚。我有一堆匹配点,它们已经通过 minHessian 和距离值设定了阈值。之后,我在赛点周围画了一个类似矩形的东西,正如你在我的图片中看到的那样。这是我的比赛。我现在怎么知道这场比赛有多精彩?我已经在计算现在找到的匹配项与模板之间的角度、大小和颜色差异。但我认为这太模糊了。


我不能 100% 确定你真正要问的是什么,因为你所谓的“匹配”是模糊的。但既然你说你已经匹配了你的 SURF 点并提到了模式识别和模板的使用,我假设你最终想要本地化图像中的模板,并且你正在询问本地化分数来决定你是否找到了模板是否在图像中。

这是一个具有挑战性的问题,我不知道是否已经找到了一个好的且始终合适的解决方案。

但是,根据您的方法,您可以做的是分析图像中匹配点的密度:将局部或全局最大值视为模板的可能位置(如果您知道模板在图像中只出现一次,则为全局,如果可以,则为局部)出现多次)并使用密度阈值来决定模板是否出现。该算法的草图可能是这样的:

  1. 分配图像大小的浮点密度图
  2. 通过将每个匹配点的邻域中的密度图增加固定量来计算密度图(例如,对于每个匹配点,添加一个固定值epsilon在您问题中显示的矩形中)
  3. 找到密度图的全局或局部最大值(可以使用 opencv 函数 MinMaxLoc 找到全局最大值,可以使用形态数学找到局部最大值,例如如何在 MATLAB 中找到图像中的局部最大值? https://stackoverflow.com/questions/1856197/how-can-i-find-local-maxima-in-an-image-in-matlab)
  4. 对于获得的每个最大值,将相应的密度值与阈值进行比较tau,来决定你的模板是否存在

如果您喜欢研究文章,您可以查看以下文章以改进此基本算法:

  • “具有用于实时车辆视觉检测的关键点存在功能的 ADABOOST”,作者:T.Bdiri、F.Moutarde、N.Bourdis 和 B.Steux,2009 年。 http://arxiv.org/pdf/0910.1273

  • “交错对象分类和分割”,B.Leibe 和 B.Schiele,2006 年。 ftp://ftp.vision.ee.ethz.ch/publications/bookchapters/eth_biwi_00422.pdf

EDIT:解决问题的另一种方法是尝试删除意外匹配的点,以便仅保留那些真正与模板图像相对应的点。这可以通过强制紧密匹配点之间的一致性约束来完成。以下研究文章提出了这样的方法:“上下文相关的徽标匹配和检索”,作者:H.Sahbi、L.Ballan、G.Serra、A.Del Bimbo,2010 年 http://perso.telecom-paristech.fr/~sahbi/publication-193.pdf(但是,这可能需要一些背景知识......)。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OpenCV 中使用 SURF 测量模式识别的准确性 的相关文章

随机推荐

  • 添加故事板视图作为以编程方式创建的视图的子视图

    我创建了一个特殊的 UIView 类 它具有某些属性 并且我以编程方式执行此操作 因为它通常是空白的 但有时会包含其他视图 我知道如果我以编程方式创建 UIView 我可以做类似的事情 specialView addSubview aVie
  • CKEditor + Yii 加载 AJAX:$_POST 不包含更新的值

    简而言之 我正在使用 Yii 框架 我的页面上有一个 Ckeditor 窗口 php yii 框架 工作正常 当我点击按钮时 会生成一个新的 CKeditor 窗口并通过 AJAX 调用显示 问题 这个新的 CKEditor 窗口正确显示数
  • 如何隐藏 HTML 页面的源代码

    我创建了一个 HTML 页面 现在想隐藏源代码并对其进行加密 我怎样才能做到这一点 您可以禁用右键单击 但这是一个坏主意 因为专家可以从您的页面读取任何内容 您无法完全隐藏页面源 这是不可能的 互联网上没有什么是足够安全的 无论如何 您都可
  • 等高列和垂直对齐列中的图像?

    想知道是否有人可以向我展示在图像列中垂直对齐图像并使列的高度等于文本列的最佳方法 CSS padding 0 margin 0 col width 50 float left height 100 col text background s
  • Mac 上的 Qt MySQL

    我浪费了大约 6 个小时试图按照网上的各种说明让 MySQL 与 Qt 一起工作 我现在就想把自己的手腕砍掉 有谁对如何将 QMYSQL 驱动程序安装到 Qt 中有简单和详细的解释吗 我有 Mac 10 6 我是初学者 我将衷心感谢您的帮助
  • Android 中的 Facebook Like 按钮集成

    我想在我的 Android 应用程序中集成 Facebook Like 按钮 请告诉我如何将其集成到 Android 中的步骤 我会尝试使用包含您从中获得的标准 html 集成的 webview 来完成此操作facebook http de
  • scp 或 sftp 使用单个命令复制多个文件

    我想将文件从远程服务器复制到不同的目录中 例如 我想同时运行这 4 个命令 scp remote A 1 txt local A 1 txt scp remote A 2 txt local A 2 txt scp remote B 1 t
  • 解析推送通知最终在 Android 后台崩溃

    我正在使用 Parse 在 android 中推送通知 但当我关闭 wifi 时 它最终会在后台崩溃 它给了我错误 java lang RuntimeException 无法启动接收器 com parse ParseBroadcastRec
  • 从单个 Hive UDF 创建多个列

    我正在使用 Amazon EMR 和 Hive 0 11 我正在尝试创建一个 Hive UDF 它将从一个 UDF 调用返回多个列 例如 我想调用如下所示的 UDF 并返回几个 命名的 列 SELECT get data columnnam
  • 在 Android 中使用工具栏实现正确的后退导航和主页按钮处理

    我在同一活动中使用单个活动和多个片段 附有屏幕截图 来提供无缝导航 但是在实现了最新的工具栏和导航视图之后 似乎很难处理导航和主页按钮 我在以下方面遇到麻烦 Managing the Hamburger Back button at lef
  • System.Drawing.Point' 到 'System.Windows.Point 的转换器

    我正在尝试在 WPF 中绘制一些实体 我的集合包含 System Drawing Rectangle 对象 当我尝试在 WPF XAML 中访问这些对象的位置时 出现以下错误 无法创建默认转换器来执行类型 System Drawing Po
  • 如何创建带有标签和值的 Winforms 组合框?

    我主要是一名 ASP NET 开发人员 但我正在开发 WinForms 应用程序 并注意到 ASP NET 组合框 html 选择 和 WinForms 之间存在很大差异 我发现 也许是错误的 WinForm 的组合框只有一个 标签 而 A
  • github 操作上下文的完整列表

    在调查如何在 github 操作中 我可以将存储库中特定文件的 基本 版本与文件的拉取请求 头 版本进行比较 在调查这一点时 我发现了各种来源 例如 github community https github community t how
  • Apollo Server Express:请求实体太大

    我需要在 GraphQL 突变中发布大量有效负载 如何提高 Apollo Server 的主体大小限制 我在用着apollo server express版本 2 9 3 我的代码 简化 const myGraphQLSchema new
  • 使用(非类型)枚举参数定义内部类成员函数模板

    我在定义和专门化成员函数时遇到困难update 内部类的Outer
  • 序言中不能有内容

    我正在尝试转换xml到 html 使用xslt 我正在使用java xml transform在java中执行此操作 它工作得很好 直到我遇到了一些xml 它说以下错误 Fatal Error 1 1 Content is not allo
  • 哪个 Linux 进程处理系统调用?

    这可能是一个愚蠢的问题 但我正在使用 gdb 调试一个二进制文件 试图对其进行 逆向工程 并到达一条指令 该指令进行系统调用 之后出现我想要逆向工程的效果 我假设另一个进程正在接管并完成这项工作 所以我想知道是否可以调试使用 gdb 处理系
  • 如何将整数四舍五入到接近百位?

    我不知道我的命名是否正确 无论如何 这些是我拥有的整数 例如 76 121 9660 我想将它们四舍五入到接近一百 例如它们必须变成 100 100 9700 如何在 C 中更快地完成此操作 我想到了一种算法 但也许 C 上有一些实用程序
  • 为什么大多数序列化器使用流而不是字节数组?

    我目前正在开发套接字服务器 我想知道 为什么序列化器喜欢 Xml序列化器 https msdn microsoft com en us library system xml serialization xmlserializer v vs
  • 在 OpenCV 中使用 SURF 测量模式识别的准确性

    我目前正在 OpenCV 中使用 SURF 进行模式识别 到目前为止我有什么 我已经用 C 编写了一个程序 我可以在其中选择源图像和我想要查找的模板 之后 我将两张图片传输到 C dll 中 在其中使用 OpenCV SURFDetecto