【问题标题】:How compare two edges images in opencv (not matchShapes)如何比较opencv中的两个边缘图像(不匹配形状)
【发布时间】:2014-11-07 15:01:39
【问题描述】:

关于我在做什么的一点介绍...... 出于学术目的,我正在使用 opencv 在 C++ 中创建一个应用程序,用于检测场景中的静态对象。 该应用程序基于背景减除和跟踪的组合方法,并且与对象遗弃相关的事件检测工作正常。 但是目前我有一个我无法解决的问题;我必须实现一个有限状态机来检测对象移除事件,无论是在对象进入后台之前还是之后。 为此,我的上级命令我使用物体的边缘。

现在问题来了。 检测到沿路非法停放的车辆后,我需要对比各种图像的边缘(报警时拍摄的背景、当前背景、当前帧)以了解车辆在做什么(拾取运动,在后台后保持停放或拾取运动)。 我在有车辆的场景区域上运行这些比较(车辆通常具有不同的大小),我使用 canny 算法通过获得二值化的 CV_8UC1 cv::Mat 来拉边。 在这一点上,我必须比较它们。 我试图用 findContours 检测轮廓并将它们与 matchShapes 进行比较,但这似乎不是正确的方法,我会将第一个图像的每个轮廓与第二个图像的每个轮廓进行比较,此外通常两个图像到 campare 有不同轮廓数(例如原始背景和当前背景,因为当前背景的边缘随着车辆进入背景而增加)。

我还尝试创建一个新图像,其中每个像素对应于其他两个的绝对差异,然后我计算差异图像的白色像素(wPx),并使用这个数字进行比较:如果 wPxthr2*perim 图像不同,我设置了两个阈值(thr1 和 thr2),并计算了车辆边界矩形(perim)的像素。 (我设置百分比阈值,并使用边界框的周长对它们进行修正,以使阈值适应车辆尺寸。) 然而,这个解决方案似乎不太健壮。

你有什么简单的建议吗? 无论如何,非常感谢您,StackOverflow 用户不止一次帮助过我!

PS:THIS 是我必须比较的图像示例

  • 第一个是没有车辆静止的背景,包含街道的边缘;

  • 第二个是原始背景,即检测到静止车辆时捕获的背景;

  • 第三个是当前背景(在这种情况下等于原始背景是同一帧,但随后发生变化);

  • 第四个是视频的当前帧;

【问题讨论】:

    标签: c++ opencv matching contour


    【解决方案1】:

    您可能想看看这篇论文:A Novel SIFT-Like-Based Approach for FIR-VS Images Registration。阿奎莱拉等人。提出一个面向边缘的直方图描述符 (EOH-SIFT)
    本文旨在将多光谱图像、可见光和红外图像相互配准。由于图像的不同特征,作者首先在两张图像中提取边缘/轮廓,从而得到与您的图像相似的图像。
    因此,您可以使用此描述符来描述您的图像补丁,如下图所示(取自上述论文):

    1. 将图像补丁细分为 4x4 区域
    2. 为 16 个子区域中的每一个组成一个轮廓方向的直方图(5 个 bin)
    3. 将直方图放在一个大小为 16x5=80 个 bin 的描述符向量中
    4. 归一化特征向量

    因此,您要比较的每个图像(在您的案例 4 中)都由其 80 维特征向量描述。您可以通过计算和评估它们之间的欧几里得距离来将它们相互比较。

    注意:这里建议使用大小为 80x80 或 100x100 (NxN) 像素的补丁。您可能需要将尺寸调整为您的图像尺寸。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 2014-11-18
      • 2023-03-20
      • 1970-01-01
      • 2019-08-27
      • 2011-08-23
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多