如何在云层变化的光(照明)条件下探测移动物体 - openCV

时间:2018-03-24 04:45:37

标签: python opencv background-subtraction

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

我已在此处上传了我的输入视频 - > 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可以减少一些照明,但不是全部,因为照明的持续时间是可变的 enter image description here

  • BackgroundSubtractorMOG2: enter image description here

  • BackgroundSubtractorGMG: enter image description here

  • ** BackgroundSubtractorKNN:** enter image description here

  • BackgroundSubtractorCNT enter image description here

1 个答案:

答案 0 :(得分:1)

1]通过OpenCV背景扣除改善结果

  • 对于不同的光线条件,将像素值标准化为0到1是很重要的。在你的代码中我看不到这种情况发生了
  • 背景减法不适用于单个图像(在您的代码中正在阅读图像)
  • 如果您在帧序列上应用背景减法,那么背景减法结果的第一帧是没有用的
  • 你可能想要调整你传递的cv2.bgsegm.createBackgroundSubtractorMOG()的参数以获得最佳效果...玩弄阈值并查看你得到的结果
  • 您还可以对各个帧应用高斯滤波器以降低噪音并获得更好的效果cv2.GaussianBlur()
  • 您可以在单个框架上尝试cv2.equalizeHist(),以便提高框架的对比度

无论如何,你说你正试图探测移动物体。如今有许多现代方法使用深度学习来进行物体检测

2]使用tensorflow object detection api

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

  • 以下是Tensorflow对象检测api的结果: enter image description here

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绑定
  • 其他实时技术可以是张量流对象检测api已经具有的RCNN ....我已经在上面提到了
  • 如果您想使用传统的计算机视觉方法,那么您可以尝试使用hog和svm来获取头盔数据,然后您可以尝试使用滑动窗口技术在您的框架中找到头盔(这不是实时的)