Matlab圖像處理學習筆記(六):基於sift特征點的人民幣識別


本文記錄如何利用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點擊打開鏈接


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM