【发布时间】: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