2 回答
TA贡献1825条经验 获得超4个赞
当您删除它并看到您在定位球时遇到性能问题时,我正在处理您的另一个相关问题。由于您的球看起来在漂亮、简单的白色背景上(除了得分和close右上角的按钮),有更容易/更快的方法找到球。
首先,在灰度中工作,以便您只有 1 个通道,而不是 3 个 RGB 通道来处理 - 这通常更快。
然后,用白色像素覆盖右上角的分数和菜单,以便图像中唯一剩下的就是球。现在反转图像,使所有白色变为黑色,然后您可以使用findNonZero()找到任何不是背景的东西,即球。
现在找到 y 方向上的最低和最高坐标,并将它们平均为球的中心,同样在 x 方向上以另一种方式。
#!/usr/bin/env python3
# Load image - work in greyscale as 1/3 as many pixels
im = cv2.imread('ball.png',cv2.IMREAD_GRAYSCALE)
# Overwrite "Current Best" with white - these numbers will vary depending on what you capture
im[134:400,447:714] = 255
# Overwrite menu and "Close" button at top-right with white - these numbers will vary depending on what you capture
im[3:107,1494:1726] = 255
# Negate image so whites become black
im=255-im
# Find anything not black, i.e. the ball
nz = cv2.findNonZero(im)
# Find top, bottom, left and right edge of ball
a = nz[:,0,0].min()
b = nz[:,0,0].max()
c = nz[:,0,1].min()
d = nz[:,0,1].max()
print('a:{}, b:{}, c:{}, d:{}'.format(a,b,c,d))
# Average top and bottom edges, left and right edges, to give centre
c0 = (a+b)/2
c1 = (c+d)/2
print('Ball centre: {},{}'.format(c0,c1))
这给出了:
a:442, b:688, c:1063, d:1304
Ball centre: 565.0,1183.5
其中,如果我在节目中画一个红色框:
在我的 Mac 上处理需要 845 微秒,或者不到一毫秒,相当于每秒 1,183 帧。显然你有时间抢屏幕,但我无法控制。
请注意,您还可以在每个方向上将图像缩小 4(或者 8 或 16)倍,并且仍然可以确保找到球,这可能会使其更快。
关键词:球、跟踪、跟踪、定位、查找、位置、图像、图像处理、python、OpenCV、numpy、边界框、bbox。
添加回答
举报