天天看點

c++ opencv求mat的最小值_opencv模闆比對識别logo

c++ opencv求mat的最小值_opencv模闆比對識别logo

本文目的

目的:學習使用opencv的matchTemplate函數

語言:java

版本:opencv-410

簡介:通過matchTemplate函數在一個圖像中查找比對的logo。

原圖是以下的圖檔,一個百度首頁圖,我們要從中找出logo

這個方法應用場景很多,除了本案例中的logo識别,比如要在一堆圖像中尋找指定人臉,就可以利用此算法在圖像中找到此人臉的最佳比對,确定相似度。

c++ opencv求mat的最小值_opencv模闆比對識别logo

模闆圖:

c++ opencv求mat的最小值_opencv模闆比對識别logo

分解介紹

函數:matchTemplate

matchTemplate
           

參數介紹

  • image,第一個參數:待比對的源圖像
  • templ,第二個參數:模闆圖像,要是和源圖像一樣的資料類型,并且尺寸不能大于源圖像
  • result,第三個參數:儲存結果的矩陣,我們可以通過minMaxLoc() 确定結果矩陣的最大值和最小值的位置.
  • method,第四個參數:模闆比對的算法(6種)
  • TM_SQDIFF :計算模闆與目标圖像的方差,由于是像素值內插補點的平方的和,是以值越小比對程度越高;
  • TM_SQDIFF_NORMED :範化的cv::TM_SQDIFF,取值為0-1之間,完美比對傳回值為0;
  • TM_CCORR :使用dot product計算比對度(不清楚怎麼計算dot product,不涉及原理),越高比對度就好;
  • TM_CCORR_NORMED :範化的cv::TM_CCORR,0-1之間
  • TM_CCOEFF :采用模闆與目标圖像像素與各自圖像的平均值計算dot product,正值越大比對度越高,負值越大圖像的差別越大,但如果圖像沒有明顯的特征(即圖像中的像素值與平均值接近)則傳回值越接近0;
  • TM_CCOEFF_NORMED :範化的cv::TM_CCOEFF,-1 ~ 1之間。
  • mask,第五個參數,蒙版

程式步驟

以下是程式的核心步驟:

  • 加載圖像(原圖,模闆圖,以及mask圖),因為圖像比較大,都做了等比縮小
srcImg 
           
  • 執行比對操作
Imgproc
           
  • 歸一化操作

歸一化就是要把需要處理的資料經過處理後(通過某種算法)限制在你需要的一定範圍内。首先歸一化是為了後面資料處理的友善,其次是保證程式運作時收斂加快。歸一化的具體作用是歸納統一樣本的統計分布性。歸一化在0-1之間是統計的機率分布,歸一化在某個區間上是統計的坐标分布。 歸一化的目的簡而言之,即歸一化資料。是使得沒有可比性的資料變得具有可比性,同時又保持相比較的兩個資料之間的相對關系,如大小關系;或是為了作圖,原來很難在一張圖上作出來,歸一化後就可以很友善的給出圖上的相對位置等。

//歸一化
           
歸一化核心參數說明: alpha: range normalization模式的最小值。1,用來規範值,2.規範範圍,并且是下限; beta: 隻用來規範range normalization模式的最大值,不用于norm normalization(範數歸一化)模式。 normType: 歸一化的類型,可以有以下的取值: NORM_MINMAX: 數組的數值被平移或縮放到一個指定的範圍,線性歸一化,一般較常用。 NORM_INF: 此類型的定義沒有查到,根據OpenCV 1的對應項,可能是歸一化數組的C-範數(絕對值的最大值) NORM_L1 : 歸一化數組的L1-範數(絕對值的和) NORM_L2: 歸一化數組的(歐幾裡德)L2-範數 dtype:

dtype為負數時,輸出數組的type與輸入數組的type即大小、深度、通道數都相同;

否則,輸出數組與輸入數組隻是通道數相同,其餘地方由tpye決定。如tpye=CV_MAT_DEPTH(dtype).

mask: 操作掩膜,選擇感興趣區域,標明後隻能對該區域進行操作。
  • 使用minMaxLoc()在結果矩陣R中定位最小值和最大值Point matchLoc;

對于TM_SQDIFF和TM_SQDIFF_NORMED,最佳比對是最低值。對于其他所有值,較高的值表示更好的比對。是以,我們将相應的值儲存在matchLoc變量中:

Core
           
  • 繪制原圖像和結果矩陣,并且在最佳比對點畫個圓圈
//顯示源圖像和結果矩陣。在盡可能高的比對區域周圍繪制一個矩形:
           

代碼

package 
           

效果

比對方法選擇 TM_SQDIFF和_TM_SQDIFF_NORMED時_,最低亮度的是最比對的位置,如圖1和圖二中的白色圓圈,如圖,左側原圖中百度logo已經能識别出來。

圖一:

c++ opencv求mat的最小值_opencv模闆比對識别logo

圖二:

c++ opencv求mat的最小值_opencv模闆比對識别logo

其他幾個比對方法,最亮的位置是最像的,如下圖

這張圖識别錯誤

c++ opencv求mat的最小值_opencv模闆比對識别logo

下面兩張圖最亮的位置分别識别正确

c++ opencv求mat的最小值_opencv模闆比對識别logo
c++ opencv求mat的最小值_opencv模闆比對識别logo

繼續閱讀