当我将它与pyAutoGui结合使用时,如何刷新OpenCV窗口

问题描述 投票:0回答:1

因此,我试图制作一个移动鼠标光标的程序,然后点击屏幕上的每个黑色像素。

我到了可以输入屏幕的位置,在窗口中看到它,甚至让鼠标点击黑色像素。没有程序中的点击部分,我可以看到窗口实时更改,但如果我添加点击部分,它会停止刷新。

 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创建的窗口没有变化,当我绘制一些黑色部分时,它仍然会覆盖它。

这是我看到的窗口以及它如何转换颜色

Window

python numpy opencv pyautogui
1个回答
0
投票

屏幕不刷新/更新,因为程序仍在处理点击所有黑色像素的双重for循环。如果你想将它用于实时视频,显然是减缓进程的方法。你可以查看findContours,在每个黑色区域点击一次。这将更快,并提供我认为你想要的行为。

下面是一些示例代码,显示了findContours的工作原理。 Here是其他信息/示例。

结果: enter image description 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()    
© www.soinside.com 2019 - 2024. All rights reserved.