在视频OpenCV C ++中删除阴影并添加跟踪

时间:2019-02-20 05:02:41

标签: c++ opencv

Previous output

以上是我从代码中获得的输出,但是图像中存在大量阴影,请问有什么方法可以去除阴影?还要添加对象跟踪以创建用于移动汽车的盒子?非常感谢

//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;

}

2 个答案:

答案 0 :(得分:0)

您的输出可能正确。首先不要使用移动摄像机视频。场景也需要在良好的光照条件下保持稳定。您可以尝试MOG2设置的不同参数。历史会影响以前的帧如何影响当前帧。 varThreshold可以极大地帮助您。 detectShadows = false更好,您可以尝试使用false和true来查看区别。您可以删除检测到的阴影,但是这些方法有局限性。

cv::createBackgroundSubtractorMOG2 (int history=500, double varThreshold=16, bool detectShadows=true)

您可以通过使用其他滤波和形态运算来增强输出,例如在噪声有用的情况下。搜索有关以下两个功能的信息,然后尝试应用。

cv::dilate
cv::erode

重点很简单。不要指望奇迹。这不适用于计算机视觉中的许多任务。 在大多数应用程序中,检测和其他任务并非基于背景扣除。在下图中,由于车灯变化的条件和阴影,背景扣除失败。 Car detection

检测基于代表汽车的特征而不是检测不是背景的特征。对于大多数应用程序来说,这是更好的方法。 Haar,LBP检测或深度学习。您可以在我的页面funvision

上找到许多可供检测的教程。

答案 1 :(得分:0)

我认为erosion function in opencv应该可以解决此问题。此函数使用大小为3x3的矩形结构元素删除白点。我认为元素的大小可以作为参数给出。

使用fgMask作为侵蚀输入。