Как получить только некоторые элементы в массиве - PullRequest
0 голосов
/ 12 января 2019

(Извините, мой плохой английский) Я пишу программу на python, используя OpenCv и другие второстепенные библиотеки, в основном моей программе нужно найти изображение на моем экране на основе шаблона. Я использовал шаблон соответствия для этого. Программа идентифицирует шаблон на экране и отправляет правый левый пиксель в виде массива на выход. Но есть некоторые цифры, которые мне не нужны, я просто хочу получить первые 3 цифры массива.

import cv2
import numpy as np
from matplotlib import pyplot as plt
import pyscreenshot as ImageGrab

while True:
    #Template Matching of the block
    img_rgb = ImageGrab.grab(bbox=(448, 168, 1471, 935))
    img_rgb = np.asarray(img_rgb)
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    template = cv2.imread("Templates/rock.jpg",0)
    w, h = template.shape[::-1]

    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) 
    threshold = 0.9
    loc = np.where( res >= threshold)
    for pt in zip(*loc[::-1]):
        cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

    #Template Matching of the Character
    templatec = cv2.imread("Templates/char.jpg",0)
    wc, hc = templatec.shape[::-1]

    resc = cv2.matchTemplate(img_gray,templatec,cv2.TM_CCOEFF_NORMED)
    thresholdc = 0.6
    locc = np.where( resc >= thresholdc)
    for pt in zip(*locc[::-1]):
        cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,0), 2)

    cv2.imwrite('res.png',img_rgb)
    print(locc)

Вывод с объектом на моем экране: (массив ([367, 368, 368, 368, 369], dtype = int32), массив ([490, 489, 490, 491, 490], dtype = int32) )).

Но я просто хочу "367" первого массива и "490" второго

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы можете получить первый элемент массива с помощью locc[0].

(я предполагаю, что два объекта массива, которые вы разместили, взяты из двух циклов цикла while, поэтому каждая итерация locc является одномерным массивом.)

0 голосов
/ 12 января 2019

Если у вас есть одномерный массив Numpy и вы хотите просто захватить его часть, вы можете использовать оператор ": " так же, как и в списке Python.

>>> import numpy as np
>>> a = np.array((1,2,3,4))
>>> a
array([1, 2, 3, 4])
>>> a[0:2]
array([1, 2])
>>> a[1:2]
array([2])
>>> print(a[:3])
[1 2 3]
>>> b = a[0:3]
>>> print(b)
[1 2 3]
>>> type(b)
<type 'numpy.ndarray'>
>>> print(a[0])
1
>>> type(a[0])
<type 'numpy.int32'>

РЕДАКТИРОВАТЬ: Если locc[0] возвращает вас [367, 368, 368, 368, 369] и вы хотите только 367, то попробуйте loc[0][0]. Если вы хотите [367], чтобы вы могли обрабатывать данные как список, попробуйте [loc[0][0]].

...