我试图使用函数cvAbsDiff(img1,img2,dest)减去2个图像; 它工作但有时当我把手伸到我的头或身体之前,手不清楚,背景进入画面......背景图像(头部)覆盖我的前景。(手)..
它在平面上正常工作,即背景甚至像墙一样。
请查看我的图片...以便您可以更好地了解我的问题...... !!!!
http://www.2shared.com/photo/hJghiq4b/bg_overlays_foreground.html
如果您有任何解决方案/提示请帮帮我.......
答案 0 :(得分:1)
加入相关代码会有所帮助。也知道你实际想要实现的目标。
你减去哪两个图像?我已经完成了后续图像的减去(因此,延迟时间为几分之一秒拍摄的图像),背景减法通常会导致移动物体的边缘,例如手的边缘,而不是整个轮廓。一只手。我猜你正在考虑当前帧和静态启动帧的区别。零件可能没有足够的差异(皮肤+皮肤)。
我今晚遇到了一些电脑问题,我明天会测试一下(至少会把你实际携带的步骤放在一边)然后告诉你。
我仍然不确定你的最终目标是什么,虽然我猜你想做一些手势识别(因为你有一个叫做“手指”的矢量)。 正如Manpreet所说,你最大的问题是稳健性,那就是来自具有相似颜色的主题。
我通过将我的脸放在静态比较图像中然后移动它来复制您的图像。如果我只从背景开始,它已经非常强大,并且在任何情况下都没有显示任何“重叠”。
快速修复,确保拥有干净的无主题静态图像。 否则,您将需要动态比较图像,最简单的方法是将frame_n与frame_n-1进行比较。这通常会为您提供移动边缘,所以如果您想要整个轮廓,您可以:
1)使用不同的分段算法(我推荐的。背景减法很快,您可以使用它来确定要搜索的小得多的ROI,然后使用不同的算法进行更强大的分割。)
2)尝试在静态和动态比较图像之间进行折衷,例如作为过去10帧的平均值或类似的东西。我不知道它的效果如何,但实现起来非常简单,值得一试:)。
另外,尝试使用CV_THRESH_OTSU而不是30作为您的阈值,看看您是否更喜欢。
另外,我经常注意到输出光斑(没有改变的区域从黑色切换到白色)。检查实时流,我很确定它是因为网络摄像头自动对焦/调整白平衡等。如果你也是这样,关闭自动对焦等应该有帮助(哪个btw不通过openCV但是取决于相机。可能会检查:How to programatically disable the auto-focus of a webcam?)
答案 1 :(得分:1)
您的代码没有任何问题。背景减法不是用于运动检测或silhoutte检测的优选方式,因为它不是非常稳健。问题是因为背景和前景在许多区域的颜色相似,在减去时将前景推回到后面。你可以尝试使用 - 用于运动检测的光流 - 如果您的任务只是检测silhoutte或手动尝试训练HOG分类器
如果您不想尝试新方法。您可以尝试使用阈值(在您的情况下为30)。因此,当您减去相似的彩色图像时,差异小于30。之后你的门槛为30,所以它只是黑掉了。您也可以尝试HSV或其他一些颜色空间。