用python玩微信跳一跳系列-小人識別之模板匹配

前言
在opencv中,模板匹配進行物體識別有專門的函數matchTemplate()來執行這一動作。這個函數用來在給定圖像或區域中進行模板圖像的匹配,其做法是按照一定的計算方法將模板圖像在給定圖樣中進行順次滑移,最終將每一個位置的計算結果匯合成一個點陣。在這個點陣中,其最大值或者最小值就是我們需要的結果,對於需要的極值的提取,需要配合minMaxLoc函數來進行提取。上述方法首先需將模板和圖樣轉化爲灰度圖,對於彩色圖像其實可以同樣進行,只是將每一個顏色通道都分別進行計算,其最終結果也是一個單維的點陣。
在python語言中用法如下:
result=cv2.matchTemplate(image,template,method[,result[,mask]])
各參數含義如下:
image:搜索圖像,8位或32位浮點數
template:模板圖像,最好直接從原圖中截取,圖幅需小於原圖,格式一致。
result:比較結果文件,一維32-bit浮點數,維度大小 (W−w+1)×(H−h+1) .
method:比較方法,請參看官網 cv::TemplateMatchModes 參數說明
mask:模板蒙版,和模板尺寸類型一致,目前僅支持TM_SQDIFF 、TM_CCORR_NORMED 方法

method的用法如下:
cv::TemplateMatchModes {
cv::TM_SQDIFF = 0,
cv::TM_SQDIFF_NORMED = 1,
cv::TM_CCORR = 2,(這個算法似乎有些問題)
cv::TM_CCORR_NORMED = 3,
cv::TM_CCOEFF = 4,
cv::TM_CCOEFF_NORMED = 5
}
驗證
從原理上來講,對直接從圖片中剪切下來的局部進行模板匹配的效果是最佳的,對微信跳一跳遊戲而言,跳跳小人是一個軸對稱的形狀,無論其處於何處,其基本形狀都不會有太大變化,同時,需要對其進行識別的時刻小人都是靜止的,這些都使得采用模板匹配成爲可能。
驗證代碼我放在csdn上,下面是驗證結果。
靜態圖片驗證
抓取一副靜態圖片,將其中的小人儘可能貼身地截取下來作爲模板文件,然後在遊戲中進行識別,識別效果非常的好,甚至不需要對模板進行摳圖將小人從背景中提取出來。
我將6種匹配算法的識別效果都放在這裏,大家可以感受一下。
左邊中間就是截取出來的模板小圖,中間就是識別效果圖,右邊是算法的實際效果圖。小人頭上的數字就是匹配度。
這裏寫圖片描述
這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述

我個人感覺用算法TM COEFF(編號4)是比較適合的,在動態的驗證中,我就採用這個算法進行驗證。
缺點
模板識別的算法固然很好,但也存在一個明顯的缺點,對於不同分辨率的手機而言,都需要人工進行模板小人的採集和處理,難以做到通用。當然,我也可以給出一個基準小人和基準底圖的尺寸,然後按照比例進行自動縮放,但那樣的識別效果如何,有興趣的同學可以進行一下驗證。
動態驗證
我用攝像頭拍下手機的實時畫面,在電腦上運行實時動態的模板匹配,可以看到效果還是非常不錯的。
這裏寫圖片描述這裏寫圖片描述
實時動態的視頻在各大自媒體同步發行,需要的可以移步觀看。
靜態驗證和動態驗證的代碼都是非常簡單的,我都放在csdn上,直搜“艾克思”即可,需要的同學可以去參考。
預告
在一篇博客中,我會完成基於HSV顏色的小人識別,敬請期待。。。

發佈了68 篇原創文章 · 獲贊 60 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章