我是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
答案 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 - 亮度)作为灰度图像并将其提供给背景减法器。