如何比较opencv中的两个边缘图像(不匹配形状)

时间:2014-09-13 16:13:09

标签: c++ opencv matching contour

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

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

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

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

PS:THIS是我要比较的图像的一个例子

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

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

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

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

1 个答案:

答案 0 :(得分:2)

您可能需要查看一下这篇文章:A Novel SIFT-Like-Based Approach for FIR-VS Images Registration。 Aguilera等。提出 面向边缘的直方图描述符(EOH-SIFT)
本文旨在将多光谱图像,可见光和红外图像相互记录。由于图像的不同特征,作者首先在两幅图像中提取边缘/轮廓,从而产生与您相似的图像。
因此,您可以使用此描述符描述您的图像补丁,如下图所示(摘自上面的论文): EOH-SIFT descriptor taken from the above paper

  1. 将您的图片补丁细分为4x4区域
  2. 对于16个子区域中的每一个,构成轮廓方向的直方图(5个区间)
  3. 将直方图放在一起,形成一个大小为16x5 = 80 bins的描述符向量
  4. 规范化特征向量
  5. 因此,您要比较的每个图像(在您的情况下为4)都由其80维特征向量描述。您可以通过计算和评估它们之间的欧氏距离来比较它们。

    注意:建议使用尺寸为80x80或100x100(NxN)像素的色块。您可能需要根据图像尺寸调整尺寸。

相关问题