我是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