对于 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() 得到的结果,右图是分割后的图像,然后我尝试在其上找到轮廓......
因此,如果一个大物体移动得足够快,它就可以正常工作……即自行车……但是在步行的人中,它并不总是能得到很好的结果……有什么想法吗?