【问题标题】:How to detect moving object in varying light(illumination) conditions due to clouds - openCV如何在云引起的不同光线(照明)条件下检测移动物体 - openCV
【发布时间】:2018-03-25 08:52:05
【问题描述】:

我一直在尝试检测移动的车辆。但是由于云层的光照条件不同(不是云的阴影,只是照明),背景减法失败了。

我已经在这里上传了我的输入视频 --> Youtube (30secs)

这是我使用 opencv 中可用的各种可用背景减法方法得到的结果

import numpy as np
import cv2

cap = cv2.VideoCapture('traffic_finalns.mp4')
#fgbgKNN = cv2.createBackgroundSubtractorKNN()
fgbgMOG = cv2.bgsegm.createBackgroundSubtractorMOG(100,5,0.7,0)
#fgbgGMG = cv2.bgsegm.createBackgroundSubtractorGMG()
#fgbgMOG2 = cv2.createBackgroundSubtractorMOG2()
#fgbgCNT = cv2.bgsegm.createBackgroundSubtractorCNT(15,True,15*60,True)

 while(1):
    ret, frame = cap.read()
#   fgmaskKNN = fgbgKNN.apply(frame)
    fgmaskMOG = fgbgMOG.apply(frame)
#   fgmaskGMG = fgbgGMG.apply(frame)
#   fgmaskMOG2 = fgbgMOG2.apply(frame)
#   fgmaskCNT = fgbgCNT.apply(frame)
#   
#   cv2.imshow('frame',frame)
#   cv2.imshow('fgmaskKNN',fgmaskKNN)
    cv2.imshow('fgmaskMOG',fgmaskMOG)
#   cv2.imshow('fgmaskGMG',fgmaskGMG)
#   cv2.imshow('fgmaskMOG2',fgmaskMOG2)
#   cv2.imshow('fgmaskCNT',fgmaskCNT)

    k = cv2.waitKey(20) & 0xff
    if k == 27:
        break


cap.release()
cv2.destroyAllWindows()

(下图 -> 帧数 - 977)

  • BackgroundSubtractorMOG : 通过改变输入参数history 可以减少一些照明,但不是全部,因为照明的持续时间是可变的

  • BackgroundSubtractorMOG2:

  • 背景减法器GMG:

  • **BackgroundSubtractorKNN:**

  • BackgroundSubtractorCNT

【问题讨论】:

    标签: python opencv background-subtraction


    【解决方案1】:

    1] 通过 OpenCV 背景减法改善结果

    • 对于不同的光照条件,将像素值标准化在 0 和 1 之间很重要。在您的代码中,我没有看到这种情况发生
    • 背景减法不适用于单个图像(在您的代码中,您正在读取图像)
    • 如果你对帧序列应用背景减法,那么背景减法结果的第一帧是没有用的
    • 您可能需要调整您传递的cv2.bgsegm.createBackgroundSubtractorMOG() 的参数以获得最佳结果... 调整阈值,看看您会得到什么结果
    • 您还可以对单个帧应用高斯滤波器以减少噪声并获得更好的结果cv2.GaussianBlur()
    • 您可以在单个帧上尝试cv2.equalizeHist(),以提高帧的对比度

    无论如何,您都说您正在尝试检测移动物体。现在有许多现代方法使用深度学习进行目标检测

    2] 使用张量流object detection api

    • 它会实时检测物体,并为您提供检测到的物体的边界框坐标

    • 以下是 Tensorflow 对象检测 api 的结果:

    3] 试试Opencv怎么样Optical Flow

    4] 简单的减法

    • 您的环境是静态的
    • 因此,获取环境的框架并将其存储在变量中,例如 environment_frame
    • 现在读取视频中的每一帧,然后从环境帧中减去它results = environment_frame - current_frame
    • 现在,如果np.sum(results) 大于阈值,则我们说存在对象
    • 现在如果np.sum(results) 大于阈值,那么我们就知道有一个移动的物体,但是在哪里???
    • 移动对象是存在聚集的杂乱像素的地方,您可以通过一些聚类算法轻松找到这些像素
    • 不要忘记将像素值标准化为 0 到 1 之间

    ----------------已更新--------------- -------------------------

    • 如果您想实时找到头盔,那么最好的选择是深度学习
    • 您可以使用像 YOLO 这样较新版本的 OpenCV 具有的深度学习技术......但我认为他们没有针对 OpencV 中的 YOLO 的 python 绑定
    • 另一种实时技术可以是 RCNN,TensorFlow 对象检测 api 已经有......我上面已经提到过
    • 如果您想使用传统的计算机视觉方法,那么您可以尝试使用 hog 和 svm 获取头盔数据,然后您可以尝试使用滑动窗口技术在您的框架中找到头盔(这不是实时的)李>

    【讨论】:

    • 谢谢 :) ,我会尝试规范化。顺便说一句,我已经注释掉了 while 循环,现在更正
    • 我的主要意图不是检测运动物体,我正在尝试开发一个“摩托车头盔检测”,为此我想到的是运动物体检测-->分类-->提取每个摩托车的 ROI -> 检测头盔并记录。你认为这是正确的方法吗?有什么现代工具可以帮助我吗?谢谢
    • @SeverusTux ....我已经更新了我的答案...如果我的解决方案有用并回答了您的问题,那么不要忘记将其标记为正确
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多