使用OpenCV减去两个图像以删除背景

时间:2013-07-22 18:11:49

标签: opencv

我正在使用OpenCV 2.4.5实时跟踪鱼类。鱼在穿梭,也在移动。 我只从灰度相机中获得帧。

我尝试只使用这两张图片获得鱼。 在应用阈值之前,我想删除背景 我试图减去这两个图像,但它不适用于航天飞机外的部件。

以下是2个框架,以及我的两个结果:https://app.box.com/s/3iug7wan8vz75j3usv7w

我的代码就像那样简单:

Mat fg = imread("fg.tif",1);
Mat bg = imread("bg.tif",1);

Mat result1 = abs(fg-bg);
imwrite("withoutMask.tif",result1);

Mat result2;
bitwise_and(fg, result1, result2);
imwrite("withMask.tif",result2);

当鱼停留在航天飞机时它会起作用,但是当它停在外面时则不行。 问题是梭子外部的尾部应该与部件的强度相同。

如果有人能帮助我,我真的很感激。

提前致谢。

2 个答案:

答案 0 :(得分:0)

opencv中有一个视频模块提供了一些很好的背景减法算法,请看一下:http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractor

此外,这里有一个有用的讨论:http://answers.opencv.org/question/7998/object-detection-using-background-subtraction/

答案 1 :(得分:0)

每一个动作都有一个平滑的模式。视频处理的最佳方式是查找视频中的移动和移位。

你的问题是航天飞机在移动,鱼在里面游动。

1)计算尺寸为8或16的小块的运动矢量(如果图像为低分辨率,则为4)。

2)使用许多小块的运动矢量以及它们之间的相关性,你可以识别出特定方向上几个关闭块的运动它是你的物体/鱼(你会知道你的鱼的近似大小和大小变化:P)

3)场景/背景/班车正在制作大屏幕的其余部分。因此,如果你发现很多具有相同方向和幅度的MV的块,那么它就是背景。你也可以怀疑有角落的班车。

通过搜索靠近最后位置的区域而不是搜索整个图像来跟踪鱼的最后位置以避免大量处理。 (正如我所说,动作是平滑的,因此下一步动作将非常接近,因此无需搜索整个图像。)