使用OpenCV调整背景减法

时间:2016-06-14 18:28:32

标签: c++ opencv video

我的问题是最后一段。

我正在尝试使用OpenCV的背景减法器之一作为检测人手的方法。尝试执行此操作的代码如下:

cv::Ptr<cv::BackgroundSubtractor> pMOG2 = cv::createBackgroundSubtractorMOG2();
cv::Mat fgMaskMOG2;
pMOG2->apply(input, fgMaskMOG2, -1);
cv::namedWindow("FG Mask MOG 2");
cv::imshow("FG Mask MOG 2", fgMaskMOG2);

当我最初在我自己的测试视频上运行该程序时,我受到了欢迎(忽略最右边窗口的名称): The left image is the mask calculated by the MOG2 algorithm 正如你所看到的那样,我的移动手根本没有检测到遮罩,因为我视频中的背景是完全静止的(掩模中一次可能有一两个白色像素)。所以我尝试使用一个不同的视频,许多例子似乎使用的视频正在移动流量。 Attempt at traffic background subtraction

你可以看到它在轻微的移动车上捡到了。我尝试过(对于这两个视频)将apply方法的“学习阈值”设置为0到1之间的许多值,并且您可以从上面看到的结果中得到很多变化。

我是否错过了关于设置背景减法的任何内容,还是视频特别难以处理?我在哪里可以调整背景减法的设置以支持我的设置(如果有的话)?我将重复这样一个事实:在两个视频中,相机都是静止的。

2 个答案:

答案 0 :(得分:0)

我的答案是在python中,但请转换并尝试。批准是否可行。

   if (cap.isOpened() == False):
        print("Error opening video stream or file")
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    min_thresh=800
    max_thresh=10000
    fgbg = cv2.createBackgroundSubtractorMOG2()
    connectivity = 4
    # Read until video is completed
    while (cap.isOpened()):
        # Capture frame-by-frame
        ret, frame = cap.read()
        if ret == True:
            print("Frame detected")
            frame1 = frame.copy()  
            fgmask = fgbg.apply(frame1)

            fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
            output = cv2.connectedComponentsWithStats(
                fgmask, connectivity, cv2.CV_32S)
            for i in range(output[0]):
                if output[2][i][4] >= min_thresh and output[2][i][4] <= max_thresh:
                    cv2.rectangle(frame, (output[2][i][0], output[2][i][1]), (
                        output[2][i][0] + output[2][i][2], output[2][i][1] + output[2][i][3]), (0, 255, 0), 2)
            cv2.imshow('detection', frame)
            cv2.imshow('detection', fgmask)

通过更改历史记录,varThreshold和detectShadows = True更新cv2.createBackgroundSubtractorMOG2。您还可以更改内核大小,消除噪音等。

答案 1 :(得分:-1)

尝试使用MOG减法器而不是MOG2背景减法器。它可能对你有帮助。

因为大多数时候MOG减法器会很方便。但最糟糕的是MOG减法器已被转移到bgsegm包。这是一个贡献包。它可以在OpenCv git中心页面中找到。

https://github.com/Itseez/opencv_contrib