本文記錄如何利用sift特征點進行人民幣的識別。本文給出的matlab源碼識別了1元與100元人民幣的面額,相同思路,可以對各種幣值的人民幣進行面額、正反面的識別。但由於本程序采用串行,模板數的增多會導致運行時間線性增長,具體應用時你可以采取並行的方法加以優化,本文只給出思路。
本文的sift特征提取源碼采用的是David G. Lowe(sift提出者)提供的閉源程序。
本文涉及到知識點如下:
1、sift特征點提取。
2、基於歐式距離的特征點匹配。(作者加上了最近距離與次近距離的比例來進一步篩選)
我在查閱sift的資料時,參閱了這篇博文:http://blog.csdn.net/abcjennifer/article/details/7639681
本文源碼的壓縮包我已傳至 我的博客資源,鏈接http://download.csdn.net/detail/u010278305/8356601點擊打開鏈接
轉載請注明出處:http://blog.csdn.net/u010278305
關於sift特征點的簡要說明:
SIFT(Scale-invariant feature transform)是一種檢測局部特征的算法,該算法通過求一幅圖中的特征點(interest points,or corner points)及其有關scale 和 orientation 的描述子得到特征並進行圖像特征點匹配,獲得了良好效果,SIFT特征不只具有尺度不變性,即使改變旋轉角度,圖像亮度或拍攝視角,仍然能夠得到好的檢測效果。
該算法流程如下:
1、讀取所有模板,並將其存放在一個cell里。
2、讀取第一個模板。
3、讀取場景,並按不同比例進行縮放,縮放比例從小到大。
4、如果再繼續增大圖像,匹配點無明顯變化,則取上一次匹配得到的匹配點數作為最終的匹配點數目。
5、如果最終的匹配點數目,大於模板關鍵點數目的十分之一,則認為已尋得匹配,跳出所有for循環,否則,讀取下一個模板,重復上述過程。
本算法主要源代碼(myapp.m)如下:
%function: % 基於sift特征點的人民幣識別 %注意: % 由於matlab沒有自帶sift特征提取,sift特征提取調用了該算法作者提供的底層調用。 % matlab新版已集成surf特征提取,surf特征是基於sift改進的,提高了速度,但個人感覺性能有所下降。(后續有可能給出測試) %referrence: % David G. Lowe,Distinctive Image Features from Scale-Invariant Keypoints %date:2015-1-13 %author:chenyanan %轉載請注明出處:http://blog.csdn.net/u010278305 %清空變量,讀取圖像 clear;close all fprintf('/******************************\n**It''s writed by chenyn2014.\n******************************/\n'); %讀取object1(模板1) object1= imread('images/object1.jpg'); object1=rgb2gray(object1); %讀取object100(模板2) object100= imread('images/object100.jpg'); object100=rgb2gray(object100); %讀取場景(你可以自行更換場景圖片進行測試) scene= imread('images/scene100.jpg'); scene=rgb2gray(scene); %將所有的模板放在一個元胞數組中 object_cell={object1,object100}; %與所有模板做匹配(模板遍歷) for i=1:2 fprintf('\nobjec[ %d]\n\n',i); %提取第i個模板 imwrite(object_cell{i},'tmp_images/obj_tmp.jpg'); match_last=1; %從小到大縮放場景圖像,找到匹配數比較適合的縮放級別(縮放遍歷) for scale=0.1:0.1:0.5 fprintf('\nscale[ %f]\n\n',scale); scene_tmp = imresize(scene, scale); imwrite(scene_tmp,'tmp_images/sce_tmp.jpg'); %匹配 [match_now,keypoint1,keypoint2]=match('tmp_images/sce_tmp.jpg','tmp_images/obj_tmp.jpg'); %如果沒有找到關鍵點,繼續增大場景圖像 if(match_now==0) match_now=1; continue; end %如果本次增大場景圖像后,本次尋得的關鍵點與上次比變化不大, %則認為上次尋找的關鍵點數為最終尋找到的關鍵點數,跳出縮放遍歷 if(match_now/match_last<1.2&&scale>=0.2) match_num=match_last; break; end match_last=match_now; end %如果尋得的匹配點數大於模板關鍵點數的十分之一,則認為已尋得匹配,跳出模板遍歷 if(match_num>0.1*keypoint2) %打印識別結果 fprintf('\nFound objec at objec[ %d]\n',i); break; end end
運行效果如下(只給出部分輸出圖片):
程序運行時的輸出如下:
>> myapp /****************************** **It's writed by chenyn2014. ******************************/ objec[ 1] scale[ 0.100000] Finding keypoints... 543 keypoints found. Finding keypoints... 287 keypoints found. Found 7 matches. scale[ 0.200000] Finding keypoints... 1348 keypoints found. Finding keypoints... 287 keypoints found. Found 12 matches. scale[ 0.300000] Finding keypoints... 1898 keypoints found. Finding keypoints... 287 keypoints found. Found 16 matches. scale[ 0.400000] Finding keypoints... 2270 keypoints found. Finding keypoints... 287 keypoints found. Found 17 matches. objec[ 2] scale[ 0.100000] Finding keypoints... 543 keypoints found. Finding keypoints... 363 keypoints found. Found 18 matches. scale[ 0.200000] Finding keypoints... 1348 keypoints found. Finding keypoints... 363 keypoints found. Found 51 matches. scale[ 0.300000] Finding keypoints... 1898 keypoints found. Finding keypoints... 363 keypoints found. Found 43 matches. Found objec at objec[ 2]
其中,最后一行為識別結果,表示與模板2匹配,結果正確。
轉載請注明出處:http://blog.csdn.net/u010278305
本程序源碼已打包上傳:鏈接http://download.csdn.net/detail/u010278305/8356601點擊打開鏈接