微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenCV背景噪声扣除和运动检测中面临的问题

如何解决OpenCV背景噪声扣除和运动检测中面临的问题

我正在研究一个需要对人员进行检测的项目,由于系统的复杂性,我决定使用移动检测。

我遇到了一些问题,在询问堆栈溢出时,this answer似乎是最好的。

所以我通过以下步骤实现了算法:

  1. 对输入视频的显着性
  2. 应用的K均值聚类
  3. 背景扣除
  4. 形态转化

这是代码

import cv2
import time
import numpy as np

cap=cv2.VideoCapture(0)

#i wanted to try different background subtractors to get the best result.
fgbg=cv2.createBackgroundSubtractormog2()
fgbg1 = cv2.bgsegm.createBackgroundSubtractormog()

h = cap.get(4)
w = cap.get(3)
frameArea = h*w
areaTH = frameArea/150


while(cap.isOpened()):
    #time.sleep(0.05)

    _,frame=cap.read()
    cv2.imshow("frame",frame)
    image=frame 

    ################Implementing Saliency########################
    saliency = cv2.saliency.StaticSaliencySpectralResidual_create()
    (success,saliencyMap) = saliency.computeSaliency(image)
    saliencyMap = (saliencyMap * 255).astype("uint8")
    #cv2.imshow("Image",image)
    #cv2.imshow("Output",saliencyMap)

    saliency = cv2.saliency.StaticSaliencyFineGrained_create()
    (success,saliencyMap) = saliency.computeSaliency(image)
    saliencyMap = (saliencyMap * 255).astype("uint8")

    threshMap = cv2.threshold(saliencyMap.astype("uint8"),255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    # show the images
    #cv2.imshow("Image",image)
    #cv2.imshow("saliency",saliencyMap)
    #cv2.imshow("Thresh",threshMap)
    
    kouts=saliencyMap
    #cv2.imshow("kouts",kouts)
    ##############implementing k-means clustering#######################
    
    clusters=12
    z=kouts.reshape((-1,3))

    #covert to np.float32
    z=np.float32(z)

    #define criteria and accuracy
    criteria= (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,5,1.0)

    #apply k-means
    ret,label,center=cv2.kmeans(z,clusters,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

    #converting back the float 32 data to unit 8 and making the image
    center=np.uint8(center)
    res=center[label.flatten()]
    kouts=res.reshape((kouts.shape))
    

    cv2.imshow('clustered image',kouts)

    ############applying background subtraction#######################
    fgmask=fgbg.apply(kouts)
    fgmask1=fgbg1.apply(kouts)
    cv2.imshow('fg',fgmask)
    cv2.imshow('fgmask1',fgmask1)
    #as i said earlier,i wanted to get the best background subtractor
    
    #########################morphological transformation#####################
    #Below i tried varIoUs techniques to get the best possible result
    
    kernel=np.ones((5,5),np.uint8)
    
    erosion=cv2.erode(fgmask1,kernel,iterations=1)
    cv2.imshow('erosion',erosion)
    dilation=cv2.dilate(fgmask1,iterations=1)
    cv2.imshow('dilation',dilation)

    gradient = cv2.morphologyEx(fgmask1,cv2.MORPH_GRADIENT,kernel)
    cv2.imshow("gradient",gradient)

    opening=cv2.morphologyEx(fgmask1,cv2.MORPH_OPEN,kernel)
    closing=cv2.morphologyEx(fgmask1,cv2.MORPH_CLOSE,kernel)

    cv2.imshow('opening',opening)
    cv2.imshow('closing',closing)
    
     #########for detection of contours##################
    contours0,hierarchy = cv2.findContours(erosion,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours0:
        area = cv2.contourArea(cnt)
        if area > areaTH and area<frameArea*0.50:                        
            M = cv2.moments(cnt)
            x,y,f,g = cv2.boundingRect(cnt)
            img = cv2.rectangle(frame,(x,y),(x+f,y+g),(0,0),2)
            cv2.imshow('Original',frame)

    k = cv2.waitKey(1) & 0xff
    if k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

我在video上尝试了该算法,但是输出中仍然有很多噪声。我以前认为问题可能出在视频质量上,但是当我执行cv2.VideoCapture(0)时,问题仍然存在,并且代码似乎并没有消除噪音和我正在处理的情况,有时噪音很大。

请告诉我任何建议或我在哪里出错了,或者采用其他解决方法

谢谢。

解决方法

我花了一些时间来尝试是否可以通过降噪来解决问题,但是我相信您已经尝试了OpenCV中的许多已知技术。我的观点是使用神经网络来解决您的问题,因为它们可以更准确地检测物体。

我创建了一个Colab笔记本,以说明这一点: https://colab.research.google.com/drive/1rBrcu46sfo0F7fsQf4BC9hKoXTk_wNBk?usp=sharing

即使采用这种简单的方法,也可以检测物体:人物和衣服。您可以设置一个仅考虑前10个项目的条件。由于巴士入口处的人数有限,只能同时进入。

这不是最终解决方案,因为我正在使用通用检测器。通过使用视频输入训练网络,可以改善您的应用程序。标签将是必需的,但我相信这将为您提供最准确的结果。

我还认为应对跟踪公交车内人员和进入人员的挑战。为此,您可以跟踪矩形。有一个使用dlib的出色示例:https://www.pyimagesearch.com/2018/10/22/object-tracking-with-dlib/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。