本文記錄如何利用sift特徵點進行人民幣的識別。本文給出的matlab源碼識別了1元與100元人民幣的面額,相同思路,能夠對各類幣值的人民幣進行面額、正反面的識別。但因爲本程序採用串行,模板數的增多會致使運行時間線性增加,具體應用時你能夠採起並行的方法加以優化,本文只給出思路。算法
本文的sift特徵提取源碼採用的是David G. Lowe(sift提出者)提供的閉源程序。數組
本文涉及到知識點以下:app
一、sift特徵點提取。性能
二、基於歐式距離的特徵點匹配。(做者加上了最近距離與次近距離的比例來進一步篩選)測試
我在查閱sift的資料時,參閱了這篇博文:http://blog.csdn.net/abcjennifer/article/details/7639681優化
本文源碼的壓縮包我已傳至 個人博客資源,連接http://download.csdn.net/detail/u010278305/8356601點擊打開連接spa
轉載請註明出處:http://blog.csdn.net/u010278305.net
關於sift特徵點的簡要說明:rest
SIFT(Scale-invariant feature transform)是一種檢測局部特徵的算法,該算法經過求一幅圖中的特徵點(interest points,or corner points)及其有關scale 和 orientation 的描述子獲得特徵並進行圖像特徵點匹配,得到了良好效果,SIFT特徵不僅具備尺度不變性,即便改變旋轉角度,圖像亮度或拍攝視角,仍然可以獲得好的檢測效果。code
該算法流程以下:
一、讀取全部模板,並將其存放在一個cell裏。
二、讀取第一個模板。
三、讀取場景,並按不一樣比例進行縮放,縮放比例從小到大。
四、若是再繼續增大圖像,匹配點無明顯變化,則取上一次匹配獲得的匹配點數做爲最終的匹配點數目。
五、若是最終的匹配點數目,大於模板關鍵點數目的十分之一,則認爲已尋得匹配,跳出全部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點擊打開連接