【发布时间】:2019-09-16 18:00:50
【问题描述】:
我是一个编程新手,我需要编写代码以在实时视频中使用 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()
我在输出中看到了混乱的视频,并且在输出中出现了很多我不知道如何理解它们的值。
【问题讨论】:
-
您使用
print(fgmask)显示图像中所有像素的值。然后你把它放在for-loop 中,这样你就可以多次打印相同的图像。如果你必须使用print(fgmask),那么只使用一次,不要在for-loop 中使用。 -
如果您想在
for-loop 中打印,那么print(j)会更好,您应该会看到可以与 0-255 进行比较的灰度像素 -
您还可以使用
fgmask==255或fgmask > 10将数组中的所有元素与2进行比较,将二维数组与True/False 匹配,然后您可以计算每行中有多少值为Truesum(fgmask > 10)以及所有数组中有多少值为 Truesum(sum(fgmask > 10))。然后你可以认为当价值更大时,即。 1000然后有移动。 -
@furas 确实有帮助,现在的问题是视频超级滞后,因为它每帧运行 500*500 像素,有什么解决方案吗?
-
第一:在
waitKey()中使用较小的值,不需要等待这么长时间的key。第二:您不需要img_arr,因为fgmask已经是数组。我使用带有 640x480 相机的旧笔记本,它运行速度非常快。也许相机无法更快地创建图像。
标签: python python-3.x popup-balloons