2

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

    包括 opencv2/opencv.hpp
    包括 iostream
    包括向量

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 = truefalse但什么也没发生。所以我该怎么做?谢谢。:)

注意:对不起我的英语不好。: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

4

2 回答 2

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

于 2013-05-08T02:23:07.360 回答
0

您是否尝试过 opencv 中可用的所有不同背景减法方法?首先这样做,如果它们都不能解决你的影子问题,你可能不得不自己编写或使用不同的库。但是,如果您不熟悉计算机视觉和 C++,这将是一个挑战。

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

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

于 2013-05-03T12:10:45.163 回答