Нахождение правильного второго изображения, меньшим представлением первого - PullRequest
0 голосов
/ 28 февраля 2020

Давайте посмотрим на эту шахматную доску (https://prnt.sc/r8vjth). Как видите, есть два квадрата greeni sh (g8 и f6), которые указывают на движение противника. Квадрат g8 пуст и довольно легко найти с помощью функции locateOnScreen. Проблемы начинаются, когда я пытаюсь найти f6, потому что он снова возвращает позицию g8.

Например, в позиции скриншота он находит g8. Первая часть верна, и это происходит из параметра h в коде ниже. Но второй g8 исходит из этой функции, что неверно.

def pos_loop(h): # h is the first position (Second square's position) which is struct consisting of top, left, width, height # I assume that h is correct because it always gives the right position values
    global previous_green
    global previous_white

    for p1 in pyautogui.locateAllOnScreen("C:\\Users\\Admin\\Desktop\\chesspic\\small_on_white.png"):
        if p1.height != h.height and p1.width != h.width and p1 != previous_white and p1 != previous_green:
            previous_white = p1
            print("\n Returned P1")
            return p1
    for p2 in pyautogui.locateAllOnScreen("C:\\Users\\Admin\\Desktop\\chesspic\\small_on_green.png"):
        if p2.height != h.height and p2.width != h.width and p2 != previous_green and p2 != previous_white:
            previous_green = p2
            print("\n Returned P2")
            return p2

    return None

previous_green и previous_white - это просто глобальные переменные, для которых в начале программы установлено значение None. Несмотря на то, что я реализовал несколько проверок, чтобы убедиться, что вторая позиция не равна первой, она случайно пропускает ее. Самое странное, что эта ошибка случайна. Иногда он находит правильный ход, иногда нет.

Может быть, вы знаете, как решить эту проблему с поиском правильного второго изображения (f6).

enter image description here

1 Ответ

2 голосов
/ 28 февраля 2020

Если вы новичок в обработке изображений, я покажу вам кое-что простое, с чего можно начать. Я загружу ваше изображение как изображение PIL / Pillow Image и преобразую его в массив Numpy - вы сможете получить такое изображение или массив из pyautogui.

from PIL import Image
import numpy as np

# Load your image and make into Numpy array for processing
im = Image.open('chess.png').convert('RGB')
na = np.array(im)

Далее, Я использовал цветовую пипетку, чтобы сэмплировать зеленые цвета на g8 и f6, чтобы получить их значения RGB

greenA = [246,246,130]
greenB = [186,202,68]

Теперь я могу сделать маску, которая True, где ваше изображение того цвета:

maskA = (na[:] == greenA).all(2)
maskB = (na[:] == greenB).all(2)

Если вы хотите визуализировать маски, вы можете превратить их в изображения и отобразить их:

Image.fromarray((maskA*255).astype(np.uint8)).show()

Или сохранить их в виде файлов:

Image.fromarray((maskA*255).astype(np.uint8)).save('a.png')

enter image description here

enter image description here

Если вы теперь суммируете пиксели по строкам следующим образом:

rowTotals = np.sum(maskA,axis=1) 

array([ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65, 65,  4,  4,  4, 59,
       59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
       59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
       59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 52, 51, 53, 53, 53,
       51, 52, 56,  4,  4,  4, 65, 65])

Вы можете обратите внимание, что все строки, которые полностью черного цвета, равны нулю, и только последние несколько строк больше нуля - так что вы можете найти координаты вашего цветного квадрата.

Аналогично, если вы суммируете пиксели вниз столбцы как это:

colTotals = np.sum(maskA,axis=0)

array([ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65, 65,  4,  4,
        4, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
       59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
       59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 54, 52, 52,
       55, 55, 51, 51, 51,  4,  4,  4, 65, 65,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0])

Вы можете видеть, что первые несколько столбцов пусты (черный или ноль), а затем есть ваш столбец Наши пиксели, за которыми следуют еще много черных.

По сути, я делаю это:

enter image description here

...