从提取的前景中删除阴影

时间:2013-05-03 06:09:15

标签: opencv foreground background-subtraction computer-vision shadow-removal

我是OpenCV + C ++ + Visual Studio 2012的新手。现在我需要学习它们。 这是背景减法/前景提取的代码,我需要从前景中删除阴影,并将它们包含在背景模型中。

    include opencv2/opencv.hpp
    include iostream
    include vector

int main(int argc, char *argv[]) { cv::Mat frame; cv::Mat back; cv::Mat fore; cv::VideoCapture cap(0); cv::BackgroundSubtractorMOG2 bg; bg.nmixtures = 3; bg.bShadowDetection = true; bg.nShadowDetection = 0; //resolved! bg.fTau = 0.5; //resolved! std::vector<std::vector<cv::Point> > contours; cv::namedWindow("Frame"); cv::namedWindow("Background"); for(;;) { cap >> frame; bg.operator ()(frame,fore); bg.getBackgroundImage(back); cv::erode(fore,fore,cv::Mat()); cv::dilate(fore,fore,cv::Mat()); cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); cv::drawContours(frame,contours,-1,cv::Scalar(0,0,255),2); cv::imshow("Frame",frame); cv::imshow("Background",back); if(cv::waitKey(30) >= 0) break; } return 0; }

我已经更改了 bshadowdetection = true false 但没有任何反应。所以我该怎么做? 谢谢。 :)

NB:抱歉我的英语不好。 :d

=====

解决!

如果你想从前景中删除阴影,只需在bg.bShadowDetection = True之后添加以下代码:

bg.nShadowDetection = 0和bg.fTau = 0.5,请参阅上面的代码! :d

如果仍然检测到阴影,则可以调整该值。

bg.fTau = 0.5意味着如果像素比暗2倍,那么它不是阴影。

bg.nShadowDetection默认值为127.如果你想删除阴影,只需将前景min.threshold设置为127.或者你可以像我一样将bg.nShadowDetection设置为0。

干杯! :d

2 个答案:

答案 0 :(得分:2)

解决!

如果你想从前景中删除阴影,只需在bg.bShadowDetection = True之后添加以下代码:

bg.nShadowDetection = 0和bg.fTau = 0.5,请参阅问题中的上述代码! :d

如果仍然检测到阴影,您可以调整该值。

bg.fTau = 0.5意味着如果像素的颜色深2倍以上则不是阴影。

bg.nShadowDetection默认值为127.如果你想删除阴影,只需将前景min.threshold设置为127.或者你可以像我一样将bg.nShadowDetection设置为0。

干杯! :d

答案 1 :(得分:0)

您是否尝试过opencv中提供的所有不同的背景减法方法?首先,如果它们都没有解决您的阴影问题,您可能需要自己编写或使用不同的库。但是,如果你是计算机视觉和c ++的新手,这将是一个挑战。

无论哪种方式,我的建议是直接观察色调(没有强度的颜色)而不是颜色值。阴影通常不会改变色调,只改变强度,因此这是一种将两者分开的方法。色调很容易计算。

您可以尝试通过将彩色图像转换为HSL颜色空间来在opencv中执行此操作。然后提取H通道(H - 代表色调,S - 饱和度,L - 亮度)作为灰度图像并将其提供给背景减法器。