OpenCV Python 核心操作 模板匹配

2021-08-20 17:55:52 字數 3779 閱讀 7052

在opencv裡,模板匹配和卷積原理很像,模板在原影象上從原點開始滑動,計算模板與(影象被模板覆蓋的地方)的差別程度,這個差別程度的計算方法在opencv裡有

6種,然後將每次計算的結果放入乙個矩陣裡,作為結果輸出。假如原圖形是

axb大小,而模板是

axb大小,則輸出結果的矩陣是

(a-a+1)x(b-b+1)

1.opencv裡提供

cv2.

match

template(src, template, method)

函式來進行模板匹配,關於這個函式有以下幾點要注意:

(1)在opencv裡,method總共有6種:

cv2.tm_ccoeff

cv2.tm_ccoeff_normed

cv2.tm_ccorr

cv2.tm_ccorr_normed

cv2.tm_sqdiff

cv2.tm_sqdiff_normed

其中,cv2.tm_sqdiff_normed,cv2.tm_sqdiff這兩種,其輸出結果矩陣裡最小值是匹配程度最好的,其餘四種都是矩陣裡最大值是匹配程度最好的。

(2)這個函式的最終結果是乙個矩陣,如果我們使用cv

2.minmaxloc

(src)函式,便可以找到對應的最大值,和最小值的座標位置

例子:img = cv2.imread("mine.png", 1)

螢幕剪輯的捕獲時間

: 2018/4/17 22:00

2.多物件匹配

有時候,如果你要匹配的模板,在圖形中多次出現,那麼就需要多物件匹配。

多物件匹配的原理很簡單,因為opencv裡的模板匹配,是將圖形裡的每一處和模板進行對比,所以同乙個模板下,多物件匹配情況下,結果矩陣裡會有好幾個值,和最大(小)值接近,如果我們設定乙個閾值,在這個閾值以上(以下)的值都提取出來,再分別得到他們的座標,理論上只要這個閾值設定的恰當,就可以將多物件都匹配出來。

在使用多物件匹配時,先介紹幾個方便處理這個過程的函式:

np.nonzero()

這個函式的輸入是乙個多維陣列,其作用是將所有非0值的

索引放入乙個多維陣列裡作為結果輸出,如果輸入是

1維,結果應該也是1維,

2維的結果應該也是

2維,往上同理。

例如:a=[[0,1,1],[0,0,0],[1,0,0]]

result = np.nonzero(a)

print  result

我們可以看出a這個陣列裡,非

0的數值分別是第

0個小陣列的第

1個,第

0個小陣列第

2個,第

2個小陣列第

0個。所以結果放在兩個陣列裡

[0.0.2],[1.2.0]

np.where[

condition,

x, y

] 對於這個函式,

conditon,x,y

都是同維度的陣列,其結果也是個同維度的陣列,它的作用是這樣的,condition裡的第(i,j)裡的數看作乙個bool型別的數,如果是true,將x裡對應的(i,j)數值放入結果的(i,

j)位置,如果是false就將y裡對應的

(i,j

)數值放入結果的

(i,j

)位置。

這個函式還有一種情況,如果輸入只有con

diton

乙個引數,則是輸出

np.nonzero(condition)

如果將乙個

numpy

的array

與乙個數做比較,則是將array裡每乙個數值分別與這個數做對比,將結果放入每乙個數對應的位置

例如:a=np.array([[0,1,1],[0,0,0],[1,0,0]])

螢幕剪輯的捕獲時間

: 2018/4/17 22:39

zip()

zip函式的輸入是不定量個list或者tuple,如a,b,c,這個函式將輸入的list或者tuple的第i位

(0<

i位取出,組成(a

i,bi,ci

)再將這些tuple放入乙個list裡輸出:

例如:a = [0,1,2]

b = [1,4,5]

c = [7,0,0]

print zip(a,b,c)

螢幕剪輯的捕獲時間

: 2018/4/17 22:56

值得注意的是,zip的輸入是不定函式,其數量是不定的,所以使用

zip(

*arg)

,將所有引數放入乙個list裡,作為輸入,也是可以的,所以上面的**也可以這樣寫:

d = [[0,1,2], [1,4,5],[7,0,0]]

print zip(*d)

其輸出和上面一樣。

講了這麼多,我們來看看多物件匹配具體怎麼完成,**如下:

螢幕剪輯的捕獲時間

: 2018/4/17 23:01

以上**中,黑色部分和之前單個匹配一樣,對於紅色部分。

0.985

是我們設定的閾值,res

>=0.958

的作用是將結果array裡符合條件的數值換成true

,反之換成false。

np.where

的作用是將

true

的索引輸出到

loc變數

loc[::-1]

將輸出的索引變換成

x,y座標,因為索引和x

,y座標是正好相反的,所以要對換下位置。

然後再迴圈座標,分別畫出紅色邊界。

OpenCV Python 核心操作 幾何變換

1.幾何變換的實際意義 從線性代數角度來看,在乙個向量 x,y 前面乘以乙個矩陣 其本質上,是將向量 x,y 轉換到 a1,b1 a2,b2 的座標系中,即實現向量 x,y 的位移 2.擴充套件縮放 opencv 提供cv2.resize 圖形檔案,x方向長度,y方向高度 轉換模式 或者 cv2.r...

OpenCV Python 核心操作 邊緣檢測

邊緣檢測其實就是利用乙個高通濾波器和影象進行卷積,影象中的邊緣 即高頻部分 在濾波器 的作用下,保留高頻部分,也就是留下邊緣 或者換乙個角度考慮,對影象進行 x方向和 y方向的差分,在影象的邊緣差分結果會比別的地方大,再利用差分可以計算出梯度,邊緣總會出現在梯度最大的地方 1.幾個基本運算元 常用的...

linux降核心版本 Linux核心降級操作

linux 核心降級操作 環境 機器型號 hp proliant bl685c g7 系統版本 redhat 6.0 核心版本 2.6.32 504.16.2.el6.x86 64 ip位址 10.221.18.47 操作目的 因為移動補丁下發平台下發了核心公升級補丁,導致系統重啟後,核心版本被從原...