Matlab图像处理学习笔记(六):基于sift特征点的人民币识别

本文记录如何利用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点击打开连接

相关文章
相关标签/搜索