0

我是编程新手,我需要编写代码以在实时视频中使用 numpy 和 openCV 检测固定背景上的气球并返回对象 [气球] 的中心。

对问题的无知感到抱歉。

由于我是新手,我在思考这样做的逻辑时遇到了麻烦,我没有资源来“教机器”并创建级联 XML 来检测气球,所以我想到了一种可能的解决方案:使用 cv2.createBackgroundSubtractorMOG2 () 来检测具有相同背景的运动,一旦有某个对象 [气球],计算实时视频中的所有白色像素并返回其中心,白色像素的阈值数量正确。

问题是,我不知道如何从 0-255 获取像素的值来知道它是白色还是黑色并同时显示视频,我认为有一种更简单的方法我做不到'找不到它的指南。

import numpy as np

import cv2

cap = cv2.VideoCapture(0)

fgbg = cv2.createBackgroundSubtractorMOG2()

while(1):

    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    fgmask = fgbg.apply(gray)
    img_arr = np.array(fgmask)
    cv2.imshow('frame',fgmask)
    for i in fgmask:
        for j in i:
            print(fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

我在输出上得到了混乱的视频和很多我不知道如何在输出上理解它们的值。

4

1 回答 1

0

我会用

changes = (fgmask>200).sum()

比较具有几乎白色值(> 200)的所有像素并计算这些像素。

然后我可以将结果与某个值进行比较以将其视为移动。

import numpy as np

import cv2

cap = cv2.VideoCapture(0)

fgbg = cv2.createBackgroundSubtractorMOG2()

while True:

    ret, frame = cap.read()

    if frame is None:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    fgmask = fgbg.apply(gray)

    #changes = sum(sum(fgmask>200))
    changes = (fgmask>200).sum() 
    is_moving = (changes > 10000)
    print(changes, is_moving)

    cv2.imshow('frame', fgmask)

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

cv2.destroyAllWindows()
cap.release()

print()需要一些时间来显示文本,因此打印所有像素(循环多次)会减慢程序的速度。所以我跳过这个。我不必知道所有像素的值。


编辑:在如何使用opencv检测大#白色像素区域中使用答案?并添加可以找到白色区域并绘制矩形的代码。程序打开两个窗口 - 一个是灰度的fgmask,另一个是 RGB 的frame,它们可以一个接一个地隐藏。您必须移动一个窗口才能看到另一个窗口。

编辑:我添加了代码,该代码使用cv2.contourArea(cnt)(x,y,w,h) = cv2.boundingRect(cnt)为所有计数创建包含项目(面积、x、y、w、h)的列表,然后获得max(items)具有最大面积的轮廓。然后它(x + w//2, y + h//2)用作红色圆圈的中心。

import numpy as np

import cv2

cap = cv2.VideoCapture(0)

fgbg = cv2.createBackgroundSubtractorMOG2()

while True:

    ret, frame = cap.read()

    if frame is None:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    fgmask = fgbg.apply(gray)

    #changes = sum(sum(fgmask>200))
    changes = (fgmask>200).sum() #
    is_moving = (changes > 10000)
    print(changes, is_moving)


    items = []

    contours, hier = cv2.findContours(fgmask, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if 200 < area:
            (x,y,w,h) = cv2.boundingRect(cnt)
            cv2.rectangle(fgmask, (x,y),(x+w,y+h),255, 2)
            cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0), 2)
            items.append( (area, x, y, w, h) )

    if items:
        main_item = max(items)
        area, x, y, w, h = main_item
        if w > h:
            r = w//2
        else:
            r = h//2
        cv2.circle(frame, (x+w//2, y+h//2), r, (0,0,255), 2)

    cv2.imshow('fgmask', fgmask)
    cv2.imshow('frame', frame)

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

cv2.destroyAllWindows()
cap.release()

在此处输入图像描述

于 2019-09-16T19:44:21.650 回答