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