Подсчет, сколько раз изображение появляется на экране - PullRequest
1 голос
/ 12 марта 2019

Этот код делает снимок экрана и затем ищет данный объект на экране, сравнивая его с данным шаблоном, а затем подсчитывает, сколько раз объект был найден.Это можно увидеть ниже с изображением монет марио, на котором программа идентифицирует каждую монету марио, а затем подсчитывает их общее количество.Моя проблема в том, что я хотел бы, чтобы программа продолжала считать монеты во время бега, чтобы, если монета была добавлена ​​или вычтена на экране, программа обновила счетное число.

Пример: считает 19 монет, считает19 монет, 19 монет, (две добавленные монеты), 21 монета, 21 монета и т. Д.

import cv2 as cv2
import numpy
import pyautogui

# Takes a screen shot and saves the file in the specified location
loc1 = (r'Capture.png')
pyautogui.screenshot(loc1)

# Reads the screen shot and loads the image it will be compared too
img_rgb = cv2.imread(loc1)
count = 0
n = 0

while n < 5:
    # Reads the file
    template_file_ore = r"mario.png"
    template_ore = cv2.imread(template_file_ore)
    w, h = template_ore.shape[:-1]

    # Compares screen shot to given image, gives error thresh hold
    res = cv2.matchTemplate(img_rgb, template_ore, cv2.TM_CCOEFF_NORMED)
    threshold = 0.80
    loc = numpy.where(res >= threshold)

    # Puts red box around matched images and counts coins
    for pt in zip(*loc[::-1]):
        cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
        count = count + 1

        print(count)
    n = n + 1

Mario Picture

Ответы [ 3 ]

1 голос
/ 13 марта 2019

В итоге я понял, что нужно просто перезапустить весь код в цикле for, как показано ниже.

    import cv2 as cv2
    import numpy
    import pyautogui

    # Takes a screen shot and saves the file in the specified location
    loc1 = (r'Capture.png')
    pyautogui.screenshot(loc1)

    # Reads the screen shot and loads the image it will be compared too
    img_rgb = cv2.imread(loc1)
    count = 0
    n = 0

    while n < 20:
        # Reads the file
        template_file_ore = r"mario.png"
        template_ore = cv2.imread(template_file_ore)
        w, h = template_ore.shape[:-1]

        # Compares screen shot to given image, gives error thresh hold
        res = cv2.matchTemplate(img_rgb, template_ore, cv2.TM_CCOEFF_NORMED)
        threshold = 0.80
        loc = numpy.where(res >= threshold)

        # Puts red box around matched images and counts coins
        for pt in zip(*loc[::-1]):
            loc1 = (r'Capture.png')
            pyautogui.screenshot(loc1)

         # Reads the file
            template_file_ore = r"mario.png"
            template_ore = cv2.imread(template_file_ore)
            w, h = template_ore.shape[:-1]

         # Compares screen shot to given image, gives error thresh hold
            res = cv2.matchTemplate(img_rgb, template_ore, cv2.TM_CCOEFF_NORMED)
            threshold = 0.80
            loc = numpy.where(res >= threshold)

          # Reads the screen shot and loads the image it will be compared too
            img_rgb = cv2.imread(loc1)
            cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
            count = count + 1

            print(count)
        n = n + 1
1 голос
/ 13 марта 2019

Есть много способов сделать это, Например, создайте список с изображениями [скриншоты], который вы хотите проверить на соответствие, и поместите весь свой код в итерацию цикла for для элементов списка.

list_images = ['image1.png','image2.png',..]

for img in list_images:
  # here put your code 
  img_to_be_checked = cv2.imread(img)
  # continue with your code in the while loop

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

1 голос
/ 12 марта 2019

Как насчет этого? Вы можете использовать переменную вне цикла while, в которой хранятся подсчитанные в данный момент монеты, затем снова запустить (прочитать другой mario_image) счет и сравнить, есть ли разница между переменными, если есть обновление.

currently_counted_coins =0 #init
...
#after for loop
difference = count-currently_counted_coins # if difference <0 coins removed else added
#update
currently_counted_coins += difference # to keep a total number of coins  
...