OpenCV:图像数组:如何识别已找到的图像?
OpenCV: An Array of images: How can I identify which image has been found?
我正在通过为 2d 宇宙飞船游戏编写机器人来学习 OpenCV 和 Python。
基本原理就是我的飞船有可以打败的目标,也有不能打败的目标。一次在屏幕上显示一个目标,您可以单击 next
或 attack
,具体取决于您要执行的操作。在这样做时,您可以循环选择目标,直到找到您想要攻击的目标。
目前我的代码:
- 将它无法打败的船只图像加载到 numpy 数组中
- 跳过菜单的一些 pyautigui 交互
- 检查 numpy 数组以确定它是要攻击还是跳过给定的目标
- 点击攻击或使用pyautogui跳过
一切正常,机器人愉快地搜索并点击跳过或攻击。
我的问题:
正在加载的图像的名称是人类可读的,例如Ship 1.jpg, Ship 2.jpg, Ship 3.jpg
当我将它们加载到 numpy 数组中时,它们会丢失人类可读的组件。
我的问题:
我希望能够记录被攻击的内容以改进检测,目前我能够输出实际的数组 array([[106, 106, 106, ..., 42, 41, 42],
但我似乎无法弄清楚如何保持人类可读的元素。如何保留人类可读的元素?
我正在加载这样的图片:
# Load Images
def loadImages(directory):
# Intialise empty array
image_list = []
# Add images to array
for i in directory:
img = cv.imread(i, cv.IMREAD_REDUCED_GRAYSCALE_2)
image_list.append(img)
return image_list
物体检测是用cv.matchTemplate
完成的
def objectDetection(image_list):
# Object Detection
for i in image_list:
needle_img = i
result = cv.matchTemplate(haystack, needle_img, cv.TM_CCORR_NORMED)
更新错误答案:
我用 image_list.append((img, i))
更新了我的 loadImages
函数并且它起作用了,我现在可以在调试器中看到附加到数组的附加文件名。我还使用 for i in image_list[i][2]:
将对象检测更新为 select 数组对象,但随后出现以下错误:
Exception has occurred: UnboundLocalError
local variable 'i' referenced before assignment
File "C:\Users\test6.py", line 65, in objectDetection
for i in image_list[i][2]:
File "C:\Users\test6.py", line 202, in <module>
objectDetection(ships_to_avoid, 0.9)
您可以将元组附加到列表中。
其中第一个元素是名称,第二个元素是图像。
image_list.append((img, i))
现在 'i' 代表文件名,'img' 代表图像文件。
您现在可以访问图像的名称或以 j 为索引(例如 0)的图像,如下所示:
img_name = image_list[j][1]
img = image_list[j][0]
编辑 1:
如果您想访问列表中的图像以进行对象检测,请按以下方式重写它:
def objectDetection(image_list):
# Object Detection
for i in image_list:
needle_img = i[0]
needle_name = i[1]
result = cv.matchTemplate(haystack, needle_img, cv.TM_CCORR_NORMED)
编辑 2:修复了索引
我正在通过为 2d 宇宙飞船游戏编写机器人来学习 OpenCV 和 Python。
基本原理就是我的飞船有可以打败的目标,也有不能打败的目标。一次在屏幕上显示一个目标,您可以单击 next
或 attack
,具体取决于您要执行的操作。在这样做时,您可以循环选择目标,直到找到您想要攻击的目标。
目前我的代码:
- 将它无法打败的船只图像加载到 numpy 数组中
- 跳过菜单的一些 pyautigui 交互
- 检查 numpy 数组以确定它是要攻击还是跳过给定的目标
- 点击攻击或使用pyautogui跳过
一切正常,机器人愉快地搜索并点击跳过或攻击。
我的问题:
正在加载的图像的名称是人类可读的,例如Ship 1.jpg, Ship 2.jpg, Ship 3.jpg
当我将它们加载到 numpy 数组中时,它们会丢失人类可读的组件。
我的问题:
我希望能够记录被攻击的内容以改进检测,目前我能够输出实际的数组 array([[106, 106, 106, ..., 42, 41, 42],
但我似乎无法弄清楚如何保持人类可读的元素。如何保留人类可读的元素?
我正在加载这样的图片:
# Load Images
def loadImages(directory):
# Intialise empty array
image_list = []
# Add images to array
for i in directory:
img = cv.imread(i, cv.IMREAD_REDUCED_GRAYSCALE_2)
image_list.append(img)
return image_list
物体检测是用cv.matchTemplate
def objectDetection(image_list):
# Object Detection
for i in image_list:
needle_img = i
result = cv.matchTemplate(haystack, needle_img, cv.TM_CCORR_NORMED)
更新错误答案:
我用 image_list.append((img, i))
更新了我的 loadImages
函数并且它起作用了,我现在可以在调试器中看到附加到数组的附加文件名。我还使用 for i in image_list[i][2]:
将对象检测更新为 select 数组对象,但随后出现以下错误:
Exception has occurred: UnboundLocalError
local variable 'i' referenced before assignment
File "C:\Users\test6.py", line 65, in objectDetection
for i in image_list[i][2]:
File "C:\Users\test6.py", line 202, in <module>
objectDetection(ships_to_avoid, 0.9)
您可以将元组附加到列表中。 其中第一个元素是名称,第二个元素是图像。
image_list.append((img, i))
现在 'i' 代表文件名,'img' 代表图像文件。 您现在可以访问图像的名称或以 j 为索引(例如 0)的图像,如下所示:
img_name = image_list[j][1]
img = image_list[j][0]
编辑 1: 如果您想访问列表中的图像以进行对象检测,请按以下方式重写它:
def objectDetection(image_list):
# Object Detection
for i in image_list:
needle_img = i[0]
needle_name = i[1]
result = cv.matchTemplate(haystack, needle_img, cv.TM_CCORR_NORMED)
编辑 2:修复了索引