使用gocv包时,例如可以对图像中的图案执行template matching。该程序包还提供MinMaxLoc函数,以检索矩阵内最小值和最大值的位置。
但是,在下面的python示例中,编写器使用numpy.Where限制矩阵阈值并获取多个最大值的位置。 python zip函数用于将值粘合在一起,因此它们就像切片[][2]int
一样,内部切片是找到的匹配项的xs和ys。
loc[::-1]
reverses数组的语法。
zip(*loc..)
中的star运算符用于解压缩提供给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)
应用阈值后,如何在Go中实现相同的np.where
算法以获取多个位置?
答案 0 :(得分:1)
OpenCV具有np.where()
(即findNonZero()
)的内置(半)等效功能。顾名思义,它可以找到图像中的非零元素,这就是np.where()
用单个参数调用时的状态,为the numpy docs状态。
这在golang绑定中也可用。来自gocv
docs on FindNonZero:
func FindNonZero(src Mat, idx *Mat)
FindNonZero返回非零像素位置的列表。
有关更多详细信息,请参见:https://docs.opencv.org/master/d2/de8/group__core__array.html#gaed7df59a3539b4cc0fe5c9c8d7586190
注意:np.where()
以数组顺序返回索引,即(row,col)或(i,j),与典型的图像索引(x,y)相反。这就是loc
在Python中被颠倒的原因。使用findNonZero()
时无需这样做,因为OpenCV始终使用(x,y)作为点。