Как получить координаты обьекта в изображении?
Есть скрипт, который делает первый скриншот
def screenshot_one(self):
image_1 = pyautogui.screenshot(region = (5, 169, 1427, 559))
image_1.save(r'{}\data\screenshot\image_1.png'.format(self.BASE_DIR))
return image_1
И второй скриншот
def screenshot_two(self):
image_2 = pyautogui.screenshot(region = (5, 169, 1427, 559))
image_2.save(r'{}\data\screenshot\image_2.png'.format(self.BASE_DIR))
return image_2
Затем находит между ними разницу
def comparison(self, image_1, image_2):
result = ImageChops.difference(image_1, image_2)
result.save(r'{0}\data\screenshot\screen.png'.format(self.BASE_DIR))
Как получить координаты объекта на экране 1920х1080, который скрипт выделил как отличие между первым и вторым скриншотом, то есть координаты белого круга на третьем скриншоте?
Код целиком
# -*- coding: utf-8 -*-
from PIL import Image, ImageChops
from pathlib import Path
import pyautogui
import keyboard
import time
class Object_search:
def __init__(self):
self.BASE_DIR = Path(__file__).resolve().parent
def screenshot_one(self):
image_1 = pyautogui.screenshot(region = (5, 169, 1427, 559))
image_1.save(r'{}\data\screenshot\image_1.png'.format(self.BASE_DIR))
return image_1
def screenshot_two(self):
image_2 = pyautogui.screenshot(region = (5, 169, 1427, 559))
image_2.save(r'{}\data\screenshot\image_2.png'.format(self.BASE_DIR))
return image_2
def comparison(self, image_1, image_2):
result = ImageChops.difference(image_1, image_2)
result.save(r'{0}\data\screenshot\screen.png'.format(self.BASE_DIR))
while True:
if keyboard.is_pressed('5'):
print('image_1')
image_1 = Object_search().screenshot_one()
time.sleep(0.1)
elif keyboard.is_pressed('6'):
image_2 = Object_search().screenshot_two()
print('image_2')
time.sleep(0.1)
elif keyboard.is_pressed('7'):
print('comparison')
comparison = Object_search().comparison(image_1, image_2)
time.sleep(0.1)
elif keyboard.is_pressed('8'):
print('exit')
break
Ответы (1 шт):
Автор решения: Shamus Rezol
→ Ссылка
img = cv2.imread("MYIMG.png", cv2.IMREAD_GRAYSCALE)
(_, _, _, coords) = cv2.minMaxLoc(img)
coords - левый верхний угол круга.
UPD
Откопал из старых проектов еще один вариант:
import cv2
img = cv2.imread("AFQZB.png", cv2.IMREAD_GRAYSCALE)
# img=cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
(_, threshold)=cv2.threshold(img, 45, 255, cv2.THRESH_BINARY)
(contours, _)=cv2.findContours(threshold, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
for rect in contours:
(x, y, width, height)=cv2.boundingRect(rect)
print(x, y, width, height)
# ...
Вывод:
411 158 222 214


