输入相关代码会有所帮助。也知道你真正想要达到的目标。
你减去哪两个图像?我已经减去了随后的图像(因此,延迟了几分之一秒的图像),背景减法通常会导致移动物体的边缘,例如手的边缘,而不是整个轮廓一只手。我猜你正在考虑当前帧和静态启动帧的差异。部分可能不够不同(皮肤+皮肤)。
今晚我遇到了一些计算机问题,明天我会测试它(请至少提出您实际执行的步骤)并让您知道。
我仍然不确定你的最终目标是什么,虽然我猜你想做一些手势识别(因为你有一个叫做“手指”的向量)。正如 Manpreet 所说,您最大的问题是鲁棒性,那就是来自具有相似颜色的主题。
我通过将我的脸放在静态比较图像中,然后移动它来复制您的图像。如果我只从背景开始,它已经更加强大,并且无论如何都没有显示任何“覆盖”。
快速修复是,确保有一个干净的无主题静态图像。否则,您将需要动态比较图像,最简单的方法是将 frame_n 与 frame_n-1 进行比较。不过,这通常只会为您提供移动边缘,因此如果您想要整个轮廓,您可以:
1)使用不同的分割算法(我推荐。背景减法很快,您可以使用它来确定要搜索的小得多的 ROI,然后使用不同的算法进行更稳健的分割。)
2)尝试在静态和动态比较图像之间做出折衷,例如作为过去 10 帧的平均值或类似的东西。我不知道这有多好用,但实现起来很简单,值得一试:)。
另外,尝试使用 CV_THRESH_OTSU 而不是 30 作为阈值,看看你是否更喜欢它。
另外,我经常注意到输出耀斑(没有从黑色变为白色的区域)。检查实时流,我很确定这是因为网络摄像头自动对焦/调整白平衡等。如果你也得到了,关闭自动对焦等应该会有所帮助(顺便说一句,这不是通过 openCV 完成的,而是取决于相机。可能检查这个:如何以编程方式禁用网络摄像头的自动对焦?)