1

我正在尝试使用函数 cvAbsDiff(img1, img2, dest) 减去 2 个图像;它可以工作,但有时当我将手放在我的头或身体前时,手并不清楚,背景进入画面......背景图像(头部)覆盖了我的前景。(手)..

它可以在普通表面上正常工作,即当背景甚至像墙壁时。

请查看我的图片...以便您更好地了解我的问题...!!!!

http://www.2shared.com/photo/hJghiq4b/bg_overlays_foreground.html

如果您有任何解决方案/提示,请帮助我.......

4

2 回答 2

1

输入相关代码会有所帮助。也知道你真正想要达到的目标。

你减去哪两个图像?我已经减去了随后的图像(因此,延迟了几分之一秒的图像),背景减法通常会导致移动物体的边缘,例如手的边缘,而不是整个轮廓一只手。我猜你正在考虑当前帧和静态启动帧的差异。部分可能不够不同(皮肤+皮肤)。

今晚我遇到了一些计算机问题,明天我会测试它(请至少提出您实际执行的步骤)并让您知道。


我仍然不确定你的最终目标是什么,虽然我猜你想做一些手势识别(因为你有一个叫做“手指”的向量)。正如 Manpreet 所说,您最大的问题是鲁棒性,那就是来自具有相似颜色的主题。

我通过将我的脸放在静态比较图像中,然后移动它来复制您的图像。如果我只从背景开始,它已经更加强大,并且无论如何都没有显示任何“覆盖”。

快速修复是,确保有一个干净的无主题静态图像。否则,您将需要动态比较图像,最简单的方法是将 frame_n 与 frame_n-1 进行比较。不过,这通常只会为您提供移动边缘,因此如果您想要整个轮廓,您可以:

1)使用不同的分割算法(我推荐。背景减法很快,您可以使用它来确定要搜索的小得多的 ROI,然后使用不同的算法进行更稳健的分割。)

2)尝试在静态和动态比较图像之间做出折衷,例如作为过去 10 帧的平均值或类似的东西。我不知道这有多好用,但实现起来很简单,值得一试:)。

另外,尝试使用 CV_THRESH_OTSU 而不是 30 作为阈值,看看你是否更喜欢它。

另外,我经常注意到输出耀斑(没有从黑色变为白色的区域)。检查实时流,我很确定这是因为网络摄像头自动对焦/调整白平衡等。如果你也得到了,关闭自动对焦等应该会有所帮助(顺便说一句,这不是通过 openCV 完成的,而是取决于相机。可能检查这个:如何以编程方式禁用网络摄像头的自动对焦?

于 2012-03-17T20:10:07.967 回答
1

你的代码没有问题。背景减法不是运动检测或剪影检测的首选方法,因为它不是很健壮。问题来了,因为背景和前景在许多区域的颜色相似,减法将前景推到后面。您可以尝试使用 - 用于运动检测的光流 - 如果您的任务只是检测剪影或手动尝试训练 HOG 分类器

如果您不想尝试新方法。您可以尝试使用阈值(在您的情况下为 30)。因此,当您减去相似的彩色图像时,差异小于 30 。后来你用 30 阈值,所以它只是变黑了。您也可以尝试 HSV 或其他一些色彩空间。

于 2012-03-18T10:34:16.663 回答