如何检测一个2D数组是否在另一个2D数组中? [英] How to detect if a 2D array is inside another 2D array?

查看:48
本文介绍了如何检测一个2D数组是否在另一个2D数组中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,在一个堆栈溢出成员的帮助下,我有以下代码:

So with the help of a stack-overflow member, I have the following code:

data = "needle's (which is a png image) base64 code goes here"
decoded = data.decode('base64')
f = cStringIO.StringIO(decoded)
image = Image.open(f)
needle = image.load()

while True:
    screenshot = ImageGrab.grab()
    haystack = screenshot.load()
    if detectImage(haystack, needle):
        break
    else:
        time.sleep(5)

我编写了以下代码来检查针是否在干草堆中:

I've written the following code to check if the needle is in the haystack:

def detectImage(haystack, needle):
    counter = 0
    for hayrow in haystack:
        for haypix in hayrow:
            for needlerow in needle:
                for needlepix in needlerow:
                    if haypix == needlepix:
                        counter += 1

    if counter == 980: #the needle has 980 pixels
        return True
    else:
        return False

问题是我在第3行遇到此错误:"PixelAccess"对象不可迭代

The issue is that I get this error for line 3: 'PixelAccess' object is not iterable

有人建议,将针和干草堆复制到一个numpy/scipy数组中会更容易.然后我可以使用一个函数来检查2D阵列针是否在2D阵列干草堆中.

It was suggested to me that it would be easier to copy both needle and haystack into a numpy/scipy array. And then I can just use a function that checks to see if the 2D array needle is inside the 2D array haystack.

我需要帮助:

1)将这些数组转换为numpy数组.

1) converting those arrays to numpy arrays.

2)用于检查2D阵列针是否在2D阵列干草堆内部的函数.我的功能不起作用.

2) a function that checks to see if the 2D array needle is inside the 2D array haystack. My function doesn't work.

这些是图像:
针:

干草堆:

These are the images:
Needle:

Haystack:

推荐答案

您可以在opencv中使用matchTemplate来检测位置:

You can use matchTemplate in opencv to detect the position:

import cv2
import numpy as np
import pylab as pl

needle = cv2.imread("needle.png")
haystack = cv2.imread("haystack.jpg")

diff = cv2.matchTemplate(haystack, needle, cv2.TM_CCORR_NORMED)
x, y = np.unravel_index(np.argmax(diff), diff.shape)

pl.figure(figsize=(12, 8))
im = pl.imshow(haystack[:,:, ::-1])
ax = pl.gca()
ax.add_artist(pl.Rectangle((y, x), needle.shape[1], needle.shape[0],  transform=ax.transData, alpha=0.6))

这是输出:

这篇关于如何检测一个2D数组是否在另一个2D数组中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆