我希望您能为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()中得出的结果,右图则是分割后的图像,在其上我尝试找到轮廓...
所以,如果它们移动得足够快,一个大对象就可以很好地工作...例如自行车...但对于步行的人来说,它并不总是得到良好的结果...有什么想法吗?