尝试实施 cv2.findContours 进行人员检测

try to implement cv2.findContours for person detection

我是 opencv 的新手,我正在尝试通过 cv2.findContours 对视频进行形态学转换来检测人物。这是代码片段..

import numpy as np
import imutils 
import cv2 as cv
import time
cap = cv.VideoCapture(0)

while(cap.isOpened()):
    ret, frame = cap.read()

    #frame = imutils.resize(frame, width=700,height=100)

    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    gray = cv.GaussianBlur(gray, (21, 21), 0)



    cv.accumulateWeighted(gray, avg, 0.5)
    mask2 = cv.absdiff(gray, cv.convertScaleAbs(avg))
    mask = cv.absdiff(gray, cv.convertScaleAbs(avg))

    contours0, hierarchy = cv.findContours(mask2,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
    for cnt in contours0:
       .
       .    
       .

其余代码具有等高线传递一条线并递增计数的逻辑。

我遇到的问题是,cv.findContours 检测帧中的每个 movement/change(包括人物)。我想要的是 cv.findContours 只检测人而不是任何其他运动。我知道可以通过 harrcasacade 实现人员检测,但有什么方法可以使用 cv2.findContours?

实现检测

如果没有,那么有没有办法我仍然可以进行形态转换并检测人物,因为我正在从事的项目需要过滤噪音和大部分背景来检测人物并增加它对通过线的计数.

我将向您展示执行此操作的两个选项。

我在评论中提到的可以与Yolo一起使用来检测人类的方法:

  1. 使用显着性检测视频的突出部分
  2. 应用 K-Means 聚类将对象聚类成单独的聚类。
  3. 应用背景减法和侵蚀或膨胀(或两者都取决于视频,但都尝试一下,看看哪一个做得最好)。
  4. 裁剪对象
  5. 将裁剪后的对象发送到 Yolo
  6. 如果 class 名字是行人或人类,则在其上绘制边界框。

使用OpenCV的内置行人检测更容易:

  1. 将帧转换为黑白
  2. 在灰色帧上使用 pedestrian_cascade.detectMultiScale()。
  3. 在每个行人上方绘制一个边界框

第二种方法要简单得多,但这取决于您对该项目的期望。