Как обновить окно OpenCV, когда я комбинирую его с pyAutoGui - PullRequest
0 голосов
/ 23 апреля 2019

Поэтому я пытаюсь создать программу, которая перемещает мой курсор мыши и щелкает каждый черный пиксель, найденный на экране.

Я дошел до того, что могу ввести экран, увидеть его в окне и даже позволить мышке щелкнуть по черным пикселям.Без щелкающей части в программе я вижу изменения окон в реальном времени, но если я добавлю щелкающую часть, она перестанет обновляться.

 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

1 Ответ

0 голосов
/ 23 апреля 2019

Экран не обновляется / не обновляется, потому что программа все еще работает в двойном цикле for, который щелкает все черные пиксели. Если вы хотите использовать это для видео в реальном времени, это, очевидно, способ замедлить процесс. Вы можете посмотреть в findContours, кликнуть один раз на каждую черную область. Это будет намного быстрее и даст поведение, которое, я думаю, вы хотите.

Ниже приведен пример кода, который показывает, как работает findContours. Здесь - дополнительная информация / примеры.

Результат:
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()    
...