所以在堆栈溢出成员的帮助下,我有以下代码:
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)我写了下面的代码来检查针是否在大海捞针:
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'对象不可迭代
有人告诉我,将针和干草堆复制成numpy / scipy阵列会更容易。 然后我可以使用一个函数来检查2D阵列针是否在2D数组haystack中。
我需要帮助:
1)将这些数组转换为numpy数组。
2)检查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 FalseThe issue is that I get this error for line 3: 'PixelAccess' object is not iterable
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.
I need help with:
1) converting those arrays to numpy arrays.
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来检测位置:
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))这是输出:
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))here is the output:
更多推荐
发布评论