相当于np.where()的OpenCV

时间:2019-11-08 08:33:21

标签: opencv go matrix computer-vision gocv

使用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算法以获取多个位置?

1 个答案:

答案 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)作为点。