我面临的困难是现场背景减法。尝试了很多方法但无济于事。我试图实现的任务是删除相机拍摄的背景图像,其中包含相机正在流式传输的实时视频。
absdiff
是我目前用于背景扣除的方法,因为它似乎产生了迄今为止最好的结果。
我的代码如show:
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图像,那么我哪里出错?
答案 0 :(得分:0)
cv2.absdiff确实适用于彩色图像。我验证了这一点。您的错误在其他地方。