【问题标题】:Remove Shadow from Extracted Foreground从提取的前景中移除阴影
【发布时间】:2023-07-16 23:04:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    已解决!

    如果要去除前景的阴影,只需在 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】:

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

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

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

      【讨论】:

      • 我尝试了一些背景减法方法,但它们都没有在背景模型中包含阴影。可能是因为背景减法需要背景的最佳结果,我的意思是没有任何前景元素的纯背景。而且我认为我需要一个单独的阴影检测代码。哈哈顺便说一句,好主意!我会试试你的建议。谢谢! :)
      最近更新 更多