我正在使用 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);
它在鱼停留在梭子里时有效,但在他外出时无效。
问题是,在飞梭外面的尾部部分应该和里面的部分有相同的强度。
如果有人可以帮助我,我将不胜感激。
提前致谢。
最佳答案
每一个 Action 总是有一个平滑的模式。视频处理的最佳方法是找到视频中的移动和变化。
你的问题是航天飞机在移动,鱼在里面游泳。
1) 计算大小为 8 或 16 的小块的运动矢量(如果图像是低分辨率的,则为 4)。
2)使用许多小块的运动矢量和它们之间的相关性,您可以识别几个靠近 block 在特定方向上的运动,这是您的对象/鱼(您将知道鱼的近似大小和大小变化:P)
3)场景/背景/穿梭正在大屏幕的其余部分。因此,如果您发现许多具有相同方向和大小的 MV block ,那么它就是背景。您也可以怀疑有拐角的穿梭机。
通过在靠近最后位置的区域中搜索而不是在整个图像中搜索来跟踪鱼的最后位置以避免大量处理。 (正如我所说的 Action 是平滑的,因此下一步将非常接近前一个,因此无需搜索整个图像)。
关于opencv - 减去两个图像以使用 OpenCV 去除背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17794471/