Удалить тень с переднего плана
Я новичок в OpenCV + C++ + Visual Studio 2012. И теперь мне нужно изучить их. Вот код для извлечения фона / извлечения переднего плана, и мне нужно удалить тень от переднего плана и включить их в фоновую модель.
включайте opencv2/opencv.hpp
включить iostream
включить вектор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. Если вы хотите удалить тень, просто установите минимальный порог переднего плана на 127. или вы можете установить bg.nShadowDetection на 0, как я.
Ура!:D
2 ответа
Решено!
Если вы хотите удалить тень с переднего плана, просто добавьте следующий код после bg.bShadowDetection = True:
bg.nShadowDetection = 0 и bg.fTau = 0.5, см. код выше в вопросе!:D
Если тень все еще обнаружена, вы можете отрегулировать значение.
bg.fTau = 0.5 означает, что если пиксель более чем в 2 раза темнее, он не является тенью.
Значение по умолчанию для bg.nShadowDetection равно 127. Если вы хотите удалить тень, просто установите минимальный порог переднего плана на 127. или вы можете установить bg.nShadowDetection на 0, как я.
Ура!:D
Вы пробовали все различные методы вычитания фона, доступные в opencv? сначала сделайте это, если ни одна из них не решит вашу проблему с тенью, вам, возможно, придется написать свою собственную или использовать другую библиотеку. однако, если вы новичок в компьютерном зрении и C++, это будет проблемой.
В любом случае, я бы посоветовал взглянуть на оттенок (цвет без интенсивности), а не на значения цвета напрямую. тени обычно не меняют оттенок, только интенсивность, так что это способ разделить их. оттенок легко рассчитать.
Вы можете попытаться сделать это в opencv, преобразовав свое цветное изображение в цветовое пространство HSL. затем извлеките канал H (H - обозначает оттенок, S - насыщенность, L - яркость) как изображение в оттенках серого и подайте его на фоновый вычитатель.