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

对不起,但标题没有意义

我正在尝试制作一个点击球使其反弹的人工智能。对于上下文这里是应用程序的图片

http://img4.mukewang.com/615c0b0f00016b2a16761049.jpg

在游戏中,当您点击球时,它会上升然后又下降,游戏的目的是保持它。

我写了一些代码,用opencv将图像转换成蒙版,这是结果的图片

http://img3.mukewang.com/615c0b1c0001d13516771052.jpg

我现在需要做的是找到以像素/坐标为单位的球的位置,这样我就可以让鼠标移动到它并单击它。顺便说一下,球在它的左右两边都有一个边距,所以它不仅上下而且左右也很窄。球也没有动画,只是一个移动的图像。

我如何获得以像素/坐标为单位的球位置,以便我可以将鼠标移动到它。


慕容森
浏览 453回答 2
2回答

凤凰求蛊

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

相关分类

Python