以上是我从代码中获得的输出,但是图像中存在大量阴影,请问有什么方法可以去除阴影?还要添加对象跟踪以创建用于移动汽车的盒子?非常感谢
//create Background Subtractor objects
Ptr<BackgroundSubtractor> pBackSub;
if (parser.get<String>("algo") == "MOG2")
pBackSub = createBackgroundSubtractorMOG2();
VideoCapture capture(parser.get<String>("input")); //input video
Mat frame, fgMask;
while (true) {
capture >> frame;
if (frame.empty()) //break if frame empty
break;
//update the background model
pBackSub->apply(frame, fgMask);
//erode the frame with 3x3 kernel
Mat frame_eroded_with_3x3_kernel;
erode(fgMask, frame_eroded_with_3x3_kernel, getStructuringElement(MORPH_RECT, Size(3,3)));
//dilate the frame with 2x2 kernel
Mat frame_dilate_with_2x2_kernel;
dilate(frame_eroded_with_3x3_kernel, frame_dilate_with_2x2_kernel, getStructuringElement(MORPH_RECT, Size(2,2)));
//show the current frame and the fg mask
imshow("Frame", frame);
imshow("FG Mask", fgMask);
imshow("After eroded with 3x3 kernel", frame_eroded_with_3x3_kernel);
imshow("After dilate with 2x2 kernel", frame_dilate_with_2x2_kernel);
//get the input from the keyboard
int keyboard = waitKey(30);
if (keyboard == 'q' || keyboard == 27)
break;
}
return 0;
}
答案 0 :(得分:0)
您的输出可能正确。首先不要使用移动摄像机视频。场景也需要在良好的光照条件下保持稳定。您可以尝试MOG2设置的不同参数。历史会影响以前的帧如何影响当前帧。 varThreshold可以极大地帮助您。 detectShadows = false更好,您可以尝试使用false和true来查看区别。您可以删除检测到的阴影,但是这些方法有局限性。
cv::createBackgroundSubtractorMOG2 (int history=500, double varThreshold=16, bool detectShadows=true)
您可以通过使用其他滤波和形态运算来增强输出,例如在噪声有用的情况下。搜索有关以下两个功能的信息,然后尝试应用。
cv::dilate
cv::erode
重点很简单。不要指望奇迹。这不适用于计算机视觉中的许多任务。 在大多数应用程序中,检测和其他任务并非基于背景扣除。在下图中,由于车灯变化的条件和阴影,背景扣除失败。
检测基于代表汽车的特征而不是检测不是背景的特征。对于大多数应用程序来说,这是更好的方法。 Haar,LBP检测或深度学习。您可以在我的页面funvision
上找到许多可供检测的教程。答案 1 :(得分:0)
我认为erosion function in opencv应该可以解决此问题。此函数使用大小为3x3的矩形结构元素删除白点。我认为元素的大小可以作为参数给出。
使用fgMask作为侵蚀输入。