首页 文章

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

提问于
浏览
0

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

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

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

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

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

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

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

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

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

1 回答

  • 2

    您可能需要查看本文:A Novel SIFT-Like-Based Approach for FIR-VS Images Registration . Aguilera等 . 建议 Edge Oriented Histogram descriptor (EOH-SIFT) .
    本文旨在将多光谱图像,可见光和红外图像相互记录 . 由于图像的不同特征,作者首先提取两个图像中的边缘/轮廓,这导致图像与您的相似 .
    因此,您可以使用此描述符描述您的图像补丁,如下图所示(摘自上文):
    EOH-SIFT descriptor taken from the above paper

    • 将图像补丁细分为4x4区域

    • 对于16个子区域中的每一个,构成轮廓方向的直方图(5个区间)

    • 将直方图放在一起,形成一个大小为16x5 = 80个二进制位的描述符向量

    • 标准化特征向量

    因此,您要比较的每个图像(在您的情况下为4)都由其80维特征向量描述 . 您可以通过计算和评估它们之间的欧几里德距离来比较它们 .

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

相关问题