了解如何部署 python 代码来弹出气球

Understanding how to deploy python code to pop up balloons

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

抱歉问题无知。

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

问题是,我不知道如何获取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()

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

我会用

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


编辑: 使用 how to detect region of large # of white pixels using opencv? 中的答案并添加可以找到白色区域并绘制矩形的代码。程序打开两个 window - 一个具有灰度 fgmask,另一个具有 RGB frame,它们可以一个隐藏在另一个后面。你必须移动一个 window 才能看到另一个。

编辑: 我添加了使用 cv2.contourArea(cnt)(x,y,w,h) = cv2.boundingRect(cnt) 的代码来创建包含项目(面积、x、y、w、h)的列表all counturs 然后得到 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()