2015-10-03 2 views
2

Я использую entireScreen=ImageGrab.grab(), чтобы создать screengrab, а затем провести некоторые анализы с помощью openCV2, чтобы проверить, содержит ли экран определенные изображения шаблонов. Эти шаблоны загружаются с template = cv2.imread(name,0).Преобразование изображения PIL в OpenCV2 image

У меня есть теперь следующая задача: при сравнении моего скриншота с шаблонами я всегда нужен сначала сохранить мой скриншот с этим:

entireScreen.save('pics/screenshot.png', format='png')

А затем перезагрузить его:

cv2.imread('screenshot.png',0)

В противном случае не будут работать:

res = cv2.matchTemplate(img,template,method)

Я хотел бы получить сообщение об ошибке, как этот:

TypeError: image is not a numpy array, neither a scalar

Мой вопрос: как я могу преобразовать скриншот entireScreen=ImageGrab.grab() в формат, совместимый с opencv2, без необходимости сохранять и затем перезагрузите его cv2.imread.

+0

Я не» У меня есть система Windows, настроенная на данный момент, и попытка импортировать 'ImageGrab' говорит мне, что это только Windows, поэтому это всего лишь предположение: передать' wholeScreen' через 'np.array()', чтобы преобразовать его в массив numpy перед передачей его в 'cv2.matchTemple()'. То есть 'res = cv2.matchTemplate (np.array (wholeScreen), шаблон, метод)' –

+0

Довольно полезный инструмент, кстати, этот screengrab. Спасибо, что подняли этот вопрос! – Divakar

ответ

1

В системах Linux можно использовать pyscreenshot, который в качестве своего состояния docs является заменой для модуля ImageGrab, который работает только с Windows.

Итак, в моей системе Linux я сделал что-то вроде этого -

import pyscreenshot as ImageGrab 

Затем, вы можете захватить скриншот и иметь к нему доступ непосредственно в пространстве памяти как Numpy массив без фактического сохранения на диск и читать с imread, как так -

img = np.array(ImageGrab.grab().convert('RGB')) 

Это img может затем использоваться с cv2.matchTemplate как есть.


шаг за шагом пример запуска и проверки выхода -

In [32]: import pyscreenshot as ImageGrab 

In [33]: img = np.array(ImageGrab.grab().convert('RGB')) 

In [34]: img.shape 
Out[34]: (768, 1366, 3) 

In [35]: img.dtype 
Out[35]: dtype('uint8') 

Вот пример выполнения, показывающий, как cv2.matchTemplate затем может быть использован с img -

In [41]: res = cv2.matchTemplate(img[:,:,0],img[10:40,50:80,0],cv2.TM_SQDIFF) 

In [42]: np.where(res<10) # 10 is threshold for matching 
Out[42]: (array([10]), array([50])) 
+0

Это похоже работа. Важно отметить, что есть два шага. Сначала преобразуем img в RGB, а затем img [:,:, 0] – Nickpick

+0

@Nicolas Это был пример, запускаемый с использованием синего канала '[:,:, 0]'. Возможно, вы используете какую-либо другую версию входного массива, возможно, это серый цвет, возможно красный канал или зеленый канал или какая-либо другая модифицированная версия входного массива 3D RGB. – Divakar

+0

если я не делаю [:,:, 0], то я получаю сообщение об ошибке: cv2.error: .. \ .. \ .. \ opencv-3.0.0 \ modules \ imgproc \ src \ templmatch.cpp: 910: ошибка: (-215) (глубина == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 в функции cv :: matchTemplate – Nickpick

Смежные вопросы