gpt4 book ai didi

python - 如何在云引起的不同光照(照明)条件下检测移动物体 - openCV

转载 作者:太空宇宙 更新时间:2023-11-03 22:21:03 27 4
gpt4 key购买 nike

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

我已经在这里上传了我的输入视频 --> 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

  • 背景减法器MOG2 : enter image description here

  • 背景减法器GMG : enter image description here

  • **背景减法器KNN:** enter image description here

  • BackgroundSubtractorCNT enter image description here

最佳答案

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 之间

------------------------更新---------------- --------------------------

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

关于python - 如何在云引起的不同光照(照明)条件下检测移动物体 - openCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49461314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com