c++ - 如何比较 opencv 中的两个边缘图像(不是 matchShapes)

标签 c++ opencv matching contour

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

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

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

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

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

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

  • 第二个是原始背景,检测到静止车辆时抓取的那个;

  • 第三个是当前背景(此时相当于原来是同一帧,然后改变);

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

最佳答案

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

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

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

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

关于c++ - 如何比较 opencv 中的两个边缘图像(不是 matchShapes),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825116/

相关文章:

opencv - 在 opencv 中使用 HoughLines 进行线检测

c++ - 缩小转换和初始化列表,哪个编译器是对的?

python - 如何使用 python 3.x 检测字符的位置

c++ - 在opencv和C++中获取图像的对比度值;

r - 如何解释 R 中倾向匹配(matchIT)的输出

MYSQL - 检测具有共同三列的行

javascript - Javascript 如何检查两个字符串是否包含相同的字符?

c++ - 何时:std::abs(x -y) < std::numeric_limits<double>::min()

c++ - 使用虚拟继承时初始化基类

c++ - 我可以使用带有 SDL2 图像扩展名的 SDL-1.2.15 吗?