2

我是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 =真情况没有变化。所以我该怎么做? 谢谢。 :)

注意:对不起我的英语不好。 :d

================

解决!

如果你想删除从前景的影子,只是添加下面的代码bg.bShadowDetection =真后:

bg.nShadowDetection = 0和bg.fTau = 0.5,见上面的代码! :D

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

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

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

干杯! :D

回答

2

已解决!

如果你想从前台删除的影子,只是添加的代码下面后= bg.bShadowDetection真:

bg.nShadowDetection = 0和bg.fTau = 0.5时,看到上面的代码中的问题! :D

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

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

bg.nShadowDetection默认值是127。如果要删除阴影,只需将前景最小阈值设置为127即可。或者,您可以像我一样将bg.nShadowDetection设置为0。

干杯! :D

0

你是否尝试过opencv中的所有不同的背景减法方法?先做这件事,如果他们都不解决你的阴影问题,你可能需要自己写或使用不同的库。然而,如果你对计算机视觉和C++还不熟悉,这将是一个挑战。

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

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

+0

我试过一些背景减法方法,它们都不包含背景模型中的阴影。也许是因为背景减法需要背景的最佳结果,我的意思是没有任何前景元素的纯背景。我想我需要一个单独的影子检测代码。 LOL 顺便说一句,好主意!我会尝试你的建议。谢谢! :) – Shabanzo 2013-05-05 17:30:27