zoukankan      html  css  js  c++  java
  • 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('/******************************
    **It''s writed by chenyn2014.
    ******************************/
    ');
    
    %读取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('
    objec[ %d]
    
    ',i);
        %提取第i个模板
        imwrite(object_cell{i},'tmp_images/obj_tmp.jpg');
        match_last=1;
        %从小到大缩放场景图像,找到匹配数比较适合的缩放级别(缩放遍历)
        for scale=0.1:0.1:0.5
            fprintf('
    scale[ %f]
    
    ',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('
    Found objec at objec[ %d]
    ',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点击打开链接


  • 相关阅读:
    Spring spEL
    Spring 使用外部部署文件
    Spring 自动装配
    spring 属性配置细节
    hdu 1054 Strategic Game
    fzu 2037 Maximum Value Problem
    将博客搬至CSDN
    HDU 4714 Tree2Cycle
    HDU 1009 The Shortest Path in Nya Graph
    POJ 1942 Paths on a Grid 组合数的优化
  • 原文地址:https://www.cnblogs.com/chenyn2014/p/4222673.html
Copyright © 2011-2022 走看看