8

对于 OpenCV 中的一个项目,我想尽可能好地分割移动物体,当然噪音最小。

为此,我想使用图像减法算法。我已经有一个正在运行的程序,但今天没有找到一种方法来获得足够公平的结果。

我已经给出了以下(灰度)图像:

IplImage* grayScale;
IplImage* lastFrame;
IplImage* secondLastFrame;
IplImage* thirdLastFrame;

到目前为止,我已经尝试用cvSub();或用减去当前帧图像和最后一帧cvAbsDiff();以获得移动部件。

但不幸的是,那里仍然有很多噪音(即由于有风时树木轻微移动),如果移动的物体很大并且颜色相同(比如说一个穿着白色或黑色衬衫的人),减法只检测人左右两侧图像的变化,而不是身体本身,所以一个物体有时会被检测为两个物体......

cvAbsDiff(this->lastFrame,grayScale,output);
cvThreshold(output,output,10,250, CV_THRESH_BINARY);
cvErode(output,output, NULL, 2);
cvDilate(output,output, NULL, 2);

为了消除这种噪音,我尝试用它来腐蚀和膨胀图像,cvErode()但这cvDilate()很慢,如果屏幕上的移动物体很小,腐蚀会删除相当多的物体,所以在去除后我并不总是得到一个好的结果或分裂的对象。

在此之后,我会cvFindContours()获取轮廓,检查大小以及是否适合在移动对象周围绘制一个矩形。但是结果很差,因为由于分割不好,一个对象经常被分成几个矩形。

一位朋友现在告诉我,我可能会尝试使用两个以上的帧进行减法,因为这可能已经减少了噪音......但我真的不知道他的意思是什么以及我应该如何添加/减去帧以获得一张几乎没有噪点并显示出足够大的物体斑点的图像。

有人可以帮我吗?如何使用多个帧来获得具有尽可能最小噪声但具有足够大的斑点用于移动对象的图像?我会感谢任何提示...

补充:

我在这里上传了一个当前视频:http: //temp.tinytall.de/也许有人想在那里尝试...

这是其中的一个框架:左图显示了我从 cvFindContours() 得到的结果,右图是分割后的图像,然后我尝试在其上找到轮廓......

分割结果

因此,如果一个大物体移动得足够快,它就可以正常工作……即自行车……但是在步行的人中,它并不总是能得到很好的结果……有什么想法吗?

4

3 回答 3

2

给定三个相邻的帧 A、B、C,您可以获得两个帧差异 X 和 Y。通过组合 X 和 Y(例如通过阈值处理和逻辑AND运算),您可以减少噪声的影响。一个不希望的副作用是运动检测区域将比理想区域略小(AND操作将减少该区域)。

由于图像序列运动估计已经研究了几十年,您可能想了解更复杂的运动检测方法,例如使用运动矢量场。在这种情况下,谷歌学术是你的朋友。

于 2011-04-09T00:10:24.587 回答
2

看起来你有一个固定的背景。一种可能的解决方案是让计算机学习背景,例如。随着时间的推移取平均值。然后计算平均图像与当前图像之间的差异。差异可能源于移动的物体。

于 2011-04-11T18:44:59.453 回答
1

嗯,这是一个非常冒险的话题。运动估计是相当复杂的。所以尽量找到好的文献,避免发明算法:)

我的建议是:

搜索用于运动估计的捆绑图像。捆绑使用许多图像来降低噪声和错误率。

最后,如果你想变得更健壮,请研究一下所谓的卡尔曼滤波器。如果您正在跟踪对象,您不希望它们在您的帧之间进行“无限速度跳跃”(这通常是噪声或未命中)。这是我强烈建议使用卡尔曼滤波器的一个 C++ 库

最后,MonoSLAM,我有点推 :) Andrew Davison:研究

于 2011-04-09T15:44:59.917 回答