OpenCV BackgroundSubtractor在颜色与背景颜色相似的对象上产生较差的结果

时间:2017-09-01 12:33:05

标签: python opencv computer-vision background-subtraction

我有一些具有挑战性的任务,花了很多时间,但没有令人满意的结果。

感觉是为将来的人数计数执行背景减法。我正在使用Python 3和OpenCV 3.3。我申请cv2.createBackgroundSubtractorMOG2但面临两个主要困难:

  1. 由于背景几乎是黑暗的,一些走在视频上的人穿着黑暗的工作人员,减法器有时无法正确检测到它们,它只是跳过它们(看看下面的图像)。将图像从BGR转换为HSV几乎没有变化,但我期望更好的结果。 enter image description here 如你所见,穿着灰色衣服的男人检测不好。怎么可能改善这个?如果有更有效的方法,请提供此信息,我感谢并欢迎任何帮助!也许有意义使用立体相机并尝试使用图像深度处理对象?

  2. 令我担心的另一个问题是,如果交通拥挤,有几个人会彼此靠近怎么办?该区域将简单地合并并计算为简单。在这种情况下可以做些什么?

  3. 提前感谢您提供任何信息!

    UPD:

    我使用HSV色彩空间在图像的每个通道上执行直方图均衡,但即使是现在我也无法吸收一些颜色接近背景颜色的人。

    以下是代码更新:

    import cv2
    import numpy as np
    import imutils
    
    
    cap = cv2.VideoCapture('test4.mp4')
    clahe = cv2.createCLAHE(2.0, (8,8))
    
    history = 50
    fgbg = cv2.createBackgroundSubtractorMOG2(history=history, detectShadows=True)
    
    while cap.isOpened():
        frame = cap.read()[1]
        width, height = frame.shape[:2]
        frame = imutils.resize(frame, width=min(500, width))
        origin = frame.copy()
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
        for channel in range(3):
             hsv[:,:,channel] = clahe.apply(hsv[:,:,channel])
    
        fgmask = fgbg.apply(hsv, learningRate=1 / history)
        blur = cv2.medianBlur(fgmask, 5)
    
        cv2.imshow('mask', fgmask)
        cv2.imshow('hcv', hsv)
        cv2.imshow('origin', origin)
        k = cv2.waitKey(30) & 0xff
        if k == 27 or k == ord('q'):
            break
    
    cap.release()
    cv2.destroyAllWindows()
    

    enter image description here

1 个答案:

答案 0 :(得分:2)

我相信按照以下步骤将在很大程度上解决您的第一个问题:

1.Preprocessing:

图像预处理非常重要,因为计算机看不到我们人类感知的图像。因此,总是建议寻找增强图像的方法而不是直接处理它。

对于给定的图像,夹克中的男人看起来与背景颜色相同。我将 直方图均衡 应用于图像的所有三个通道,并合并它们以获得以下内容:

enter image description here

这名男子比以前略显可见。

2。色彩空间:

您选择使用HSV色彩空间是正确的。但为什么要一起限制三个频道呢?我获得了 色调频道 并获得了以下内容:

enter image description here

3。微调

现在,对于上图,您必须应用一些 最佳阈值 ,然后使用 形态侵蚀进行跟进操作以在框架中获得更好的人物轮廓。

注意: 为了解决您的第二个问题,您还可以在应用阈值后进行一些形态学操作。