为了账号安全,请及时绑定邮箱和手机立即绑定

我如何获得opencv中显示的图像坐标

我如何获得opencv中显示的图像坐标

慕容森 2021-10-05 16:21:16
对不起,但标题没有意义我正在尝试制作一个点击球使其反弹的人工智能。对于上下文这里是应用程序的图片在游戏中,当您点击球时,它会上升然后又下降,游戏的目的是保持它。我写了一些代码,用opencv将图像转换成蒙版,这是结果的图片我现在需要做的是找到以像素/坐标为单位的球的位置,这样我就可以让鼠标移动到它并单击它。顺便说一下,球在它的左右两边都有一个边距,所以它不仅上下而且左右也很窄。球也没有动画,只是一个移动的图像。我如何获得以像素/坐标为单位的球位置,以便我可以将鼠标移动到它。
查看完整描述

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

其中,如果我在节目中画一个红色框:

//img1.sycdn.imooc.com//615c0b3e00017ec317131301.jpg

在我的 Mac 上处理需要 845 微秒,或者不到一毫秒,相当于每秒 1,183 帧。显然你有时间抢屏幕,但我无法控制。

请注意,您还可以在每个方向上将图像缩小 4(或者 8 或 16)倍,并且仍然可以确保找到球,这可能会使其更快。

关键词:球、跟踪、跟踪、定位、查找、位置、图像、图像处理、python、OpenCV、numpy、边界框、bbox。


查看完整回答
反对 回复 2021-10-05
  • 2 回答
  • 0 关注
  • 452 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信