我面临的困难是实时背景扣除。尝试了许多方法,但无济于事。我要实现的任务是用相机正在流式传输的实时视频删除相机捕捉的背景图像。absdiff
是我目前用于背景扣除的方法,因为到目前为止看来效果最好。
我的代码如下所示:
while(1)
{
capture>>imagef;
imshow("image with foreground", imagef);
imagef.convertTo(imagef, CV_8UC3);
//cvtColor(imagef, imagef, CV_BGR2GRAY);
absdiff(imagef,imageb, imageFinal); //imageb is the background image
imshow("after diff", imageFinal);
//cvtColor(imageFinal, imageFinal, CV_BGR2GRAY); //change to grayscale
threshold(imageFinal, imageFinal, 20, 255, CV_THRESH_BINARY); // change to grayscale
imshow("Camera Window",imageFinal); //show video
int key = cvWaitKey(10); //Capture Keyboard stroke
if (char(key) == 27)
{
break; //If you hit ESC key loop will break.
}
}
但是,无论摄像机视频中是否引入了新图像,此代码都将返回空白图像。
请注意,如果我取消注释
cvtColor
,则在处理之前将imagef(视频帧)和imageb(静态图像)都转换为灰度,则我可以检索新图像之间的差异,但是,由于强度相似,会造成信息丢失,但是如果我降低阈值,则视频具有水平移动线(在明亮的条件下,因此我可以将其设置得太低)。我想问一下,absdiff是否仅适用于灰度图像?如果它也适用于BGR图像,那我哪里出错了?
最佳答案
cv2.absdiff确实可以在彩色图像上使用。我验证了这一点。您的错误在其他地方。