• 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点击打开链接


  • 相关阅读:
    js正则
    【zookeeper】zookeeper 集群搭建
    【zookeeper】linux zookeeper的安装步骤
    【ActiveMQ】ActiveMQ之JDBC消息存储安装配置
    【数据库】Cannot create PoolableConnectionFactory (null, message from server: "Host 'xxxxx' isnot allow
    【ActiveMQ】Failed to bind to server socket: nio://0.0.0.0:61616 due to: java.net.BindException:
    【微服务】Springboot和ActiveMQ整合出现 Could not resolve placeholder 'xxx' in value "${xxx}"
    【ActiveMQ】记录一次activemq与jdk版本冲突问题
    【ActiveMq】linux ActiveMq安装
    【springcloud】Could not resolve type alias 'Dept'. Cause: java.lang.ClassNotFoundException
  • 原文地址:https://www.cnblogs.com/chenyn2014/p/4222673.html
Copyright © 2020-2023  润新知