因此,我试图制作一个移动鼠标光标的程序,然后点击屏幕上的每个黑色像素。
我到了可以输入屏幕的位置,在窗口中看到它,甚至让鼠标点击黑色像素。没有程序中的点击部分,我可以看到窗口实时更改,但如果我添加点击部分,它会停止刷新。
import numpy as np
import pyautogui as py
from PIL import ImageGrab
import cv2 as cv
while(True):
# Record location of the program
screen_size = [1293, 171, 1647, 769]
screen = np.array(ImageGrab.grab(bbox=screen_size))
cv.imshow("window", cv.cvtColor(screen, cv.COLOR_BGRA2GRAY))
# Quit
if cv.waitKey(25) & 0xFF == ord("q"):
cv.destroyAllWindows()
break
for y in range(len(screen)):
for x in range(len(screen[y])):
if np.any(screen[y][x]) == 0:
py.click(x+1293,y+171)
我想屏幕刷新或类似的东西,所以让我们看它看一个黑点的视频,它可以看到它们并点击所有这些。现在它只是停留在起始图像上,即使它们不再可见,也会一直点击起始点。
这是一个问题的视频:
https://www.youtube.com/watch?v=QIrEnCgxe6E&feature=youtu.be
你可以在这里看到它如何完美地跟随黑线,但是OpenCV创建的窗口没有变化,当我绘制一些黑色部分时,它仍然会覆盖它。
这是我看到的窗口以及它如何转换颜色
屏幕不刷新/更新,因为程序仍在处理点击所有黑色像素的双重for循环。如果你想将它用于实时视频,显然是减缓进程的方法。你可以查看findContours,在每个黑色区域点击一次。这将更快,并提供我认为你想要的行为。
下面是一些示例代码,显示了findContours的工作原理。 Here是其他信息/示例。
码:
# load image
img = cv2.imread("image.png")
# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# create a mask that hold only black values (below 10)
ret,thresh1 = cv2.threshold(gray,10,255,cv2.THRESH_BINARY_INV)
# find contours in mask
ret, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# draw outline of contour on image
for cnt in contours:
cv2.drawContours(img, [cnt], 0, (255,0,0), 2)
#show image
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()