OpenCV эквивалент np.where () - PullRequest
       25

OpenCV эквивалент np.where ()

0 голосов
/ 08 ноября 2019

При использовании пакета gocv можно, например, выполнить сопоставление шаблона шаблона в изображении. Пакет также предоставляет функцию MinMaxLoc для извлечения местоположений минимумов и максимумов в матрице.

Однако в приведенном ниже примере с python писатель использует numpy. Где дляпорог матрицы и получить местоположения нескольких максимумов. Функция python zip используется для склеивания значений, чтобы они походили на срез [][2]int, причем внутренний срез был xs и ys найденных совпадений.

Синтаксис loc[::-1] обращает массив.

Оператор звезды в zip(*loc..) используется для распаковки фрагментов, данных zip.

https://docs.opencv.org/master/d4/dc6/tutorial_py_template_matching.html

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv.imread('mario.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)

for pt in zip(*loc[::-1]):
    cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv.imwrite('res.png',img_rgb)

Как реализовать тот же алгоритм np.where в Go, чтобы получить несколько местоположений после применения порога?

1 Ответ

1 голос
/ 09 ноября 2019

OpenCV имеет встроенную (полу) эквивалентную функцию для np.where(), которая равна findNonZero(). Как следует из названия, он находит ненулевые элементы в изображении, что и делает np.where() при вызове с одним аргументом, как состояние numpy docs .

Иэто доступно и в привязках к голангу. Из документов gocv на FindNonZero :

func FindNonZero(src Mat, idx *Mat)

FindNonZero возвращает список местоположений с ненулевыми пикселями.

Для получения дополнительной информации, пожалуйста,см .: https://docs.opencv.org/master/d2/de8/group__core__array.html#gaed7df59a3539b4cc0fe5c9c8d7586190

Примечание: np.where() возвращает индексы в порядке массива, то есть (строка, столбец) или (i, j), что противоположно типичной индексации изображения (x, y). Вот почему loc обращено в Python. При использовании findNonZero() вам не нужно этого делать, поскольку OpenCV всегда использует (x, y) для точек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...