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