absdiff工作在灰度而不是BGR colourspace

时间:2014-03-15 17:52:09

标签: opencv image-processing computer-vision

我面临的困难是现场背景减法。尝试了很多方法但无济于事。我试图实现的任务是删除相机拍摄的背景图像,其中包含相机正在流式传输的实时视频。

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图像,那么我哪里出错?

1 个答案:

答案 0 :(得分:0)

cv2.absdiff确实适用于彩色图像。我验证了这一点。您的错误在其他地方。