精华内容
参与话题
问答
  • 基于模板匹配的数字识别

    千次阅读 2015-11-14 12:14:17
    基于模板匹配的数字识别,将标准的8*16像素的数字0123456789读取,二值化,对每个数字进行等分区域分割,统计每个区域内的黑色像素点的个数,即为特征初值。采用欧式距离的模板匹配法。 z//基于模板匹配...


    基于模板匹配的数字识别,将标准的8*16像素的数字0123456789读取,二值化,对每个数字进行等分区域分割,统计每个区域内的黑色像素点的个数,即为特征初值。采用欧式距离的模板匹配法。



    z//基于模板匹配的数字识别
    #include<stdio.h>
    #include<cv.h>
    #include<highgui.h>
    #include <iostream>  
    #include<math.h>
    using namespace std; 
    int main()
    {
        IplImage  *imadata0,*imadata1,*imadata2,*imadata3,*imadata4,*imadata5,*imadata6,*imadata7,*image; 
        image=cvLoadImage("G:\\test.bmp",0);  //读取测试的数字
    	imadata0=cvLoadImage("G:\\0.bmp",0);
    	imadata1=cvLoadImage("G:\\1.bmp",0);
    	imadata2=cvLoadImage("G:\\2.bmp",0);
    	imadata3=cvLoadImage("G:\\3.bmp",0);
    	imadata4=cvLoadImage("G:\\4.bmp",0);
    	imadata5=cvLoadImage("G:\\5.bmp",0);
    	imadata6=cvLoadImage("G:\\6.bmp",0);
        imadata7=cvLoadImage("G:\\7.bmp",0);
    	cvNamedWindow("image",2);
        cvShowImage("image",image);
    	cvWaitKey(0);
    	//将8*16的图像直接分割为4*4
    	int row_1,col_1;
        unsigned char *ptr,*ptr_1[8];
    //	scanf("%d,%d",row_1,col_1);
        row_1=2,col_1=4;
    	int stepx=image->width/row_1;
    	int stepy=image->height/col_1;
    //	int count=row_1*col_1;
    	unsigned char counter[8]={'\n'};
    	unsigned char counter_1[8][8]={'\n'};
    	for(int row=0;row<row_1;row++)
    	{
    	   for(int col=0;col<col_1;col++)
    	   {
    	    	for(int i=0+stepx*row;i<stepx*(row+1);i++)
    			{
    	         	for(int j=0+stepy*col;j<stepy*(col+1);j++)
    				{
                         ptr=(unsigned char*)image->imageData+i*image->widthStep+j;
    					 if(*ptr<100)
    						 counter[row*col_1+col]+=1;
                         ptr_1[0]=(unsigned char*)imadata0->imageData+i*image->widthStep+j;
    					 if(*ptr_1[0]<100)
    						 counter_1[0][row*col_1+col]+=1;							 
                         ptr_1[1]=(unsigned char*)imadata1->imageData+i*image->widthStep+j;
    					 if(*ptr_1[1]<100)
    						 counter_1[1][row*col_1+col]+=1;	
                         ptr_1[2]=(unsigned char*)imadata2->imageData+i*image->widthStep+j;
    					 if(*ptr_1[2]<100)
    						 counter_1[2][row*col_1+col]+=1;				 
                         ptr_1[3]=(unsigned char*)imadata3->imageData+i*image->widthStep+j;
    					 if(*ptr_1[3]<100)
    						 counter_1[3][row*col_1+col]+=1;	
                         ptr_1[4]=(unsigned char*)imadata4->imageData+i*image->widthStep+j;
    					 if(*ptr_1[4]<100)
    						 counter_1[4][row*col_1+col]+=1;	
                         ptr_1[5]=(unsigned char*)imadata5->imageData+i*image->widthStep+j;
    					 if(*ptr_1[5]<100)
    						 counter_1[5][row*col_1+col]+=1;	
                         ptr_1[6]=(unsigned char*)imadata6->imageData+i*image->widthStep+j;
    					 if(*ptr_1[6]<100)
    						 counter_1[6][row*col_1+col]+=1;		 
    					 ptr_1[7]=(unsigned char*)imadata7->imageData+i*image->widthStep+j;
    					 if(*ptr_1[7]<100)
    						 counter_1[7][row*col_1+col]+=1;	   
    				}
    			}
    	   }
    	}
        for(int ci=0;ci<8;ci++)
    	{
    		printf("\n");
    		for(int cj=0;cj<8;cj++){
    			printf("%d\n",counter_1[ci][cj]);}
    	}
    	//欧氏距离
    	int dis[8];
    	double erdis(unsigned char counter[],unsigned char counter_1[][8]);
    	dis[0]=erdis(counter,counter_1);
    	// for(ci=0;ci<8;ci++)
        printf("%d\n",dis[0]);
        cvWaitKey(0);
    	return 0;
    }
    //欧氏距离,注意不同数据类型间的强制转换~
    double erdis(unsigned char counter[],unsigned char counter_1[][8]){
    	int i,j;
    	double sumdis[8],sum;
    	sum=0;
    	double sum_1[8]={0};
    
    
    	/*归一化再求
    //	for(i=0;i<8;i++){
    //		for(j=0;j<8;j++){
    //	         sum_1[i]=sum_1[i]+(double)counter_1[i][j]; 
    //		}
      //  	sum=sum+(double)counter[i];
     //       printf("%f  %f\n",sum_1[i],sum);
    //	}
    
    
    
    
    //	for(i=0;i<8;i++){
    //		for(j=0;j<8;j++)
    //		{
    //			counter_1[i][j]=(1000*(double)counter_1[i][j])/sum_1[i]; 
    //			counter[i]=(1000*(double)counter[i])/sum;
    //	    	printf("%d ",counter_1[i][j]); 
    //		}
    //		 printf("%d\n",counter[i]); 
    //	}
    */
    
    
    	for(i=0;i<8;i++){
    		for(j=0;j<8;j++){
    			sumdis[i]=(int)(sumdis[i]+(int)pow(((int)counter_1[i][j]-(int)counter[j]),2));}
                printf("%f\n",sumdis[i]); 
    }
    	void show(double sumdis[]);
    	show(sumdis);
    	return 0;     
    }
    void show(double sumdis[]){
    	double temp;
    	int c;
    	temp=sumdis[0];
    	for(int rank=1;rank<8;rank++)
    	{      
               if(sumdis[rank]<temp)
    		   {  
    		       temp=sumdis[rank];
    			   c=rank;
    			   printf("局部最佳匹配数%d\n",rank);
    		   }	   
    	}
    	printf("最佳匹配数%d\n",c);
    }
    


    展开全文
  • 今天就来谈一谈关注度比较高的车牌识别吧.1 车牌识别的步骤 ...识别的话方法就比较多了,有模板匹配,bp神经网络,卷积神经网络等. 2 一个简单的例子先读取车牌图片 [uuu,vvv]=uigetfile({'*.jpg;*.tif;

    今天就来谈一谈关注度比较高的车牌识别吧.

    1 车牌识别的步骤

    1. 车牌定位
    2. 车牌分割
    3. 字符识别
      正如上面所讲,车牌识别主要分为3个部分,其中第一部分车牌定位,一般采用颜色定位,特征定位等,这方面一堆资料我就不写了.分割一般采用投影法.识别的话方法就比较多了,有模板匹配,bp神经网络,卷积神经网络等.

    2 一个简单的例子

    先读取车牌图片

    
     [uuu,vvv]=uigetfile({'*.jpg;*.tif;*.png;*.gif;*.BMP;*.JPEG','All Image Files'} ,'MultiSelect', 'on');%获取一张车牌照片
    path=strcat(vvv,uuu);%拼接图片路径
    img_rgb=imread(path);
    imshow(img_rgb);title('原图');
    

    这里写图片描述

    %% 开始二值化处理

    
    figure1=figure(1);subplot(231);imshow(img_rgb);title('原图');
    subplot(232);imshow(img_rgb);title('二值化后的图 ")
    
    

    这里写图片描述
    调用rot_angle子函数,计算图像需要旋转的最佳角度要旋转的最佳角度,返回 后旋转图像.

    
    Angle=rot_angle(s_b,6,-6,1)
    if Angle~=0
        s_bw1=imrotate(s_bw1,Angle,'nearest','crop');
    end 

    %% % 调用字符分割函数分割处理好的车牌

    
    devide_word=devide_word(plate);
    

    这里写图片描述

    %% %调用训练好的cnn网络识别车牌

    
    resault=recognize(plate_word)
    
    

    这里写图片描述

    上面大体是,车牌识别的大概步骤,
    识别采用卷积神经网络识别,效果最好.训练网络时样本数一定要大,
    我的样本数大概是800多,

    这里写图片描述

    别的例子,证明卷积神经网络的优越性.

    这里写图片描述
    这里写图片描述
    这里写图片描述
    BP神经网络和模板匹配下次再写

    联系方式 : 127-313-7084 (Q号) [请备注:csdn_车牌识别]

    展开全文
  • halcon模板匹配快速入门

    千次阅读 2019-06-11 10:00:02
    匹配模板:find_aniso_shape_model 例子: 测试用的图像: 代码: dev_set_draw ('margin') read_image (Image, 'C:/Users/斌/Desktop/temp.png') rgb1_to_gray (Image, GrayImage) *...

    算子:

    创建模板:create_aniso_shape_model

     

    匹配模板:find_aniso_shape_model

     

    例子:

    测试用的图像:

    代码:

    dev_set_draw ('margin')
    read_image (Image, 'C:/Users/斌/Desktop/temp.png')
    rgb1_to_gray (Image, GrayImage)
    *选择感兴趣区域
    draw_rectangle1 (3600, Row1, Column1, Row2, Column2)
    gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
    *选中目标模板
    reduce_domain (GrayImage, Rectangle, ImageReduced)
    threshold (ImageReduced, Regions, 0, 0)
    connection (Regions, ConnectedRegions)
    reduce_domain (Image, ConnectedRegions, ImageReduced1)
    *创建一个形状的表示模型
    create_aniso_shape_model (ImageReduced1, 'auto', rad(0), rad(90), 'auto', 0.9, 1.1, 'auto', 0.9, 1.1, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
    *保存模板文件
    * get_shape_model_contours (ModelContours, ModelID, 1)
    *write_shape_model (ModelID, 'C:/Users/斌/Desktop/sss/xxx.shm')
    dev_clear_window ()
    dev_display (Image)
    stop ()
    ***************************************************************
    *开始匹配
    read_image (Image, 'C:/Users/斌/Desktop/temp.png')
    rgb1_to_gray (Image, GrayImage1)
    *读取文件中的模板
    *read_shape_model ('C:/Users/斌/Desktop/sss/xxx.shm', ModelID)
    *模型匹配
    dev_display (Image)
    *参数说明:
    *1、要匹配的图元 2、模型句柄 3、模型最小旋转角 4、模型最大旋转角 5、行方向的最小缩放比 6、行方向最大缩放比 7、列方向最小缩放比 8、列方向最大缩放比 9、找到模型的最小分数
    *10、找到模型的数量 11、模型的最大重叠 12、亚像素精度 13、金字塔数 14、贪婪值 15、16找到的图像的中心坐标;17、18行列的缩放比 20、得分
    find_aniso_shape_model (GrayImage1, ModelID, rad(0), rad(90), 0.9, 1.1, 0.9, 1.1, 0.99, 0, 0.5, 'least_squares', 4, 0.1, Row, Column, Angle, ScaleR, ScaleC, Score)
    for Index := 0 to |Row|-1 by 1
        disp_cross (3600, Row[Index], Column[Index], 100,0)
        disp_message(3600, '得分:'+Score[Index], 'image', Row[Index], Column[Index], 'black', 'false')
    endfor
    *释放句柄
    clear_shape_model (ModelID)

    使用模板匹配需注意:匹配范围越大耗时越长,就好比大海捞针。可以缩小匹配范围来提升性能。

    测试结果:

    算子介绍:

    创建模板:create_aniso_shape_model:

    参数

    1、Template

    (input_object) (multichannel-)image → object (byte / uint2)

    Template(输入对象)(多通道)图像→数据结构:object(byte/uint2)

    输入对象的域将用于建立模板

    2、NumLevels

    (input_control) integer → (integer / string)

    NumLevels(输入参数,用于控制)

    金字塔的层数

    默认值:‘auto’

    值的列表:‘auto’,0,1,2,3,4,5,6,7,8,9,10

    3、AngleStart

    (input_control) angle.rad → (real)

    图像的最小的旋转角度

    默认值:-0.39

    建议值:-3.14, -1.57, -0.79, -0.39, -0.20, 0.0

     

     

     

    4、AngleExtent

    (input_control) angle.rad → (real)

    旋转角度的范围

    默认值:0.79

    建议值:6.29, 3.14, 1.57, 0.79, 0.39

    限制条件:AngleExtent >= 0

    5、AngleStep

    (input_control) angle.rad → (real / string) 旋转角度的步长(分辨率)。 默认值:'auto' 建议值:'auto',0.0175,0.0349,0.0524,0.0698,0.0873 限制:(AngleStep> = 0)&&(AngleStep <=(pi / 16))

    6、ScaleRMin

    (input_control) number → (real) 行方向的最小缩放率。 默认值:0.9 建议值:0.5,0.6,0.7,0.8,0.9,1.0 限制:ScaleRMin> 0

    7、ScaleRMax

    (input_control) number → (real)

    行方向的最大缩放率。

    默认值:1.1

    建议值:1.0,1.1,1.2,1.3,1.4,1.5

    限制:ScaleRMax> = ScaleRMin

    8、ScaleRStep

    (input_control) number → (real / string)

    在行方向上缩放步长(分辨率)。

    默认值:'auto'

    建议值:'auto',0.01,0.02,0.05,0.1,0.15,0.2

    限制:ScaleRStep> = 0

    9、ScaleCMin

    (input_control) number → (real) 列方向的最小缩放率。 默认值:0.9 建议值:0.5,0.6,0.7,0.8,0.9,1.0 限制:ScaleCMin> 010、ScaleCMax

    (input_control) number → (real) 列方向的最大缩放率。 缺省值:1.1 建议值:1.0,1.1,1.2,1.3,1.4,1.5 限制:ScaleCMax> = ScaleCMin11、ScaleCStep

    (input_control) number → (real / string) 在列方向上缩放步长(分辨率)。 默认值:'auto' 建议值:'auto',0.01,0.02,0.05,0.1,0.15,0.2 限制:ScaleCStep> = 012、Optimization

    (input_control) string(-array) → (string) 优化的种类和用于生成模型的可选方法。 默认值:'auto' 值列表:'auto','none','point_reduction_low','point_reduction_medium','point_reduction_high','pregeneration','no_pregeneration'13、Metric

    (input_control) string → (string) 匹配指标。

    默认值:'use_polarity' 值列表:'use_polarity','ignore_global_polarity','ignore_local_polarity','ignore_color_polarity'14、Contrast

    (input_control) number(-array) → (integer / string) 模板图像中对象的对比度的阈值或滞后阈值以及对象部分的可选最小大小。 默认值:'auto' 建议的值:'auto','auto_contrast','auto_contrast_hyst','auto_min_size',10,20,30,40,60,80,100,120,140,16015、MinContrast

    (input_control) number → (integer / string) 搜索图像中物体的最小对比度。 默认值:'auto' 建议值:'auto',1,2,3,5,7,10,20,30,40 限制:MinContrast < Contrast16、ModelID

    (output_control) shape_model → (integer) 模板句柄。

     

    匹配模板:find_aniso_shape_model:

    参数

    1、Image

    (input_object) (multichannel-)image → object (byte / uint2)

    需要找到模型的图像。

    2、ModelID

    (input_control) shape_model → (integer)

    模型的句柄。

    3、AngleStart

    (input_control) angle.rad → (real)

     

    模型的最小旋转角度。

    默认值:-0.39

    建议值:-3.14,-1.57,-0.78,-0.39,-0.20,0.0

    4、AngleExtent

    (input_control) angle.rad → (real)

     

    旋转角度的范围。

    默认值:0.78

    建议值:6.29,3.14,1.57,0.78,0.39,0.0

    限制:AngleExtent> = 0

    5、ScaleRMin

    (input_control) number → (real)

     

    模型在行方向上的最小缩放比例。

    默认值:0.9

    建议值:0.5,0.6,0.7,0.8,0.9,1.0

    限制:ScaleRMin> 0

    6、ScaleRMax

    (input_control) number → (real)

     

    模型在行方向上的最大缩放比例。

    缺省值:1.1

    建议值:1.0,1.1,1.2,1.3,1.4,1.5

    限制:ScaleRMax> = ScaleRMin

    7、ScaleCMin

    (input_control) number → (real)

     

    模型在列方向上的最小缩放比例。

    默认值:0.9

    建议值:0.5,0.6,0.7,0.8,0.9,1.0

    限制:ScaleCMin> 0

    8、ScaleCMax

    (input_control) number → (real)

     

    模型在列方向上的最大缩放比例。

    缺省值:1.1

    建议值:1.0,1.1,1.2,1.3,1.4,1.5

    限制:ScaleCMax> = ScaleCMin

    9、MinScore

    (input_control) real → (real)

     

    要找到的模型的实例的最小分数。

    默认值:0.5

    建议值:0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

    典型值范围:0≤MinScore≤1

    最小增量:0.01

    推荐增量:0.05

    10、NumMatches

    (input_control) integer → (integer)

     

    要找到的模型的实例数。

    默认值:1

    建议值:0,1,2,3,4,5,10,20

    11、MaxOverlap

    (input_control) real → (real)

     

    要找到的模型的实例的最大重叠。

    默认值:0.5

    建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

    典型值范围:0≤MaxOverlap≤1

    最小增量:0.01

    推荐增量:0.05

    12、SubPixel

    (input_control) string(-array) → (string)

    亚像素精度。

    默认值:'least_squares'

    值列表:'none','interpolation','least_squares','least_squares_high','least_squares_very_high','max_deformation

    1','max_deformation 2','max_deformation 3','max_deformation 4','max_deformation 5'

    max_deformation 6'

    13、NumLevels

    (input_control) integer(-array) → (integer)

     

    匹配中使用的金字塔数量(如果| NumLevels | = 2,则使用最低金字塔级别)。

    默认值:0

    值列表:0,1,2,3,4,5,6,7,8,9,10

    14、Greediness

    (input_control) real → (real)

     

    搜索模式的“贪婪”(0:安全但缓慢; 1:快速,但可能会错过匹配)。

    默认值:0.9

    建议值:0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0

    典型值范围:0≤贪婪度≤1

    最小增量:0.01

    推荐增量:0.05

    15、Row

    (output_control) point.y-array → (real)

     

    找到的模型的实例的行坐标。

    16、Column

    (output_control) point.x-array → (real)

    找到的模型实例的列坐标。

    17、Angle

    (output_control) angle.rad-array → (real)

    找到的模型的实例的旋转角度。

    18、ScaleR

    (output_control) number-array → (real)

    在行方向上找到模型的实例的比例。

    19、ScaleC

    (output_control) number-array → (real)

    在列方向上找到模型的实例的比例。

    20、Score

    (output_control) real-array → (real)

    发现的模型实例的得分。

     

    1、算子find_aniso_shape_model在输入图像Image(参数)中找到各向异性尺度不变形状模型ModelID(参数)的最佳NumMatches(参数)个实例。模型ModelID(参数)必须先通过调用create_aniso_shape_model或read_shape_model创建。

    2、所得实例在行和列方向上的位置,旋转和缩放会以参数Row,Column,Angle,ScaleR和ScaleC的形式返回。

    其中坐标Row和Column是搜索图像中形状模型原点的坐标。 默认情况下,原点是用于使用create_aniso_shape_model创建形状模型的图像的域(区域)的重心。

    可以使用set_shape_model_origin设置不同的原点。

    3、请注意,坐标Row和Column不完全对应于搜索图像中模型的位置。

    因此,您不能直接使用它们。 相反,这些值可以进行优化后用于创建转换矩阵。

    4、通过转换矩阵,我们可以使用匹配结果来完成各种任务。例如调整其他处理步骤的ROI。

    5、每个找到的实例的得分都在Score中返回。

    分数是介于0和1之间的数字,这是模型在图像中可见多少的近似度量。 例如,如果模型的一半被遮挡,则得分不能超过0.5。

    6、图像Image(参数)的域确定了模型参考点的搜索空间。模型参考点是指在算子create_aniso_shape_model中用于创建形状模型的图像的域的重心。

    不考虑使用set_shape_model_origin设置的不同原点。 在图像的域内搜索模型,模型必须完全位于图像内。

    这意味着如果模型扩展超出图像边界,则该模型将不会被发现,即使它的分数大于MinScore(参数),这个行为可以通过set_system('border_shape_models','true')来改变,这可以使得超出图像边框的模型在得分大于MinScore时被发现。 在这里,位于图像之外的点被认为被遮挡,即,它们会降低得分。

    应该注意的是,在这种模式下,搜索的运行时间会增加。

    7、参数AngleStart和AngleExtent决定了搜索模型的旋转范围。

    8、 ScaleRMin,ScaleRMax,ScaleCMin和ScaleCMax的参数决定了搜索模型的行和列方向的缩放范围。

    9、如有必要,将两个范围缩小到使用create_aniso_shape_model创建模型时给出的范围。这意味着模型和搜索的角度范围必须真正重叠。

    10、搜索中的角度范围不适用于模数360°。例如,如果使用AngleStart

    = -20°和AngleExtent = 40°创建模型,使用AngleStart = 350°和AngleExtent = 20°搜索模型,则模型不会被发现。即使将他们视为模数360°时,角度范围将重叠,模型也是不会被发现。所以需要以AngleStart

    = -10°和AngleExtent = 20°搜索模型。

    11、如果模型ModelID是由算子create_shape_model或create_scaled_shape_model创建的,那将会以1.0的各向同性缩放或者在ScaleRMin到ScaleRMax范围内的各向同性缩放来搜索模型。

    12、参数ScaleR和ScaleC返回实际的缩放率。

    13、注意:某些稍微超出旋转和缩放范围的实例也有可能被识别出来。如果指定的搜索范围小于创建模型时给出的范围,则可能会发生这种情况。

    14、参数MinScore确定了实例的最小匹配分数。选择较大的MinScore,搜索速度越快。如果模型可以预测到不会被遮挡,MinScore可能设置为高达0.8甚至0.9。如果匹配没有跟踪到最低金字塔级别,那么可能会发现比分低于MinScore的匹配。

    15、可以使用NumMatches确定要查找的最大实例数。如果图像中找到的分数大于MinScore的NumMatches实例多,则只返回最佳的NumMatches个实例。如果少于NumMatches,则只返回能找到的实例,即参数MinScore优先于NumMatches。

    16、如果模型呈现对称性,则可能发生在图像中发现具有类似位置但具有不同旋转的多个实例。参数MaxOverlap通过分数(即,0和1之间的数字)来确定两个实例可以最多重叠,以便将它们视为不同的实例,并且单独返回。如果两个实例彼此重叠超过MaxOverlap,则只返回最佳实例。重叠的计算基于所找到的实例的任意方向(见minimum_rectangle2)的最小包围矩形。如果MaxOverlap

    = 0,发现的实例可能根本不重叠,而对于MaxOverlap = 1,所有实例都将返回。

    17、参数SubPixel确定是否应以亚像素精度提取实例。如果SubPixel设置为“none”(或“false”用于向后兼容),则只能通过像素精度和使用create_aniso_shape_model指定的角度和比例分辨率来确定模型的姿态。如果SubPixel设置为“interpolation”(或“true”),则以亚像素精度确定位置以及旋转和缩放。在这种模式下,模型的姿态是通过得分函数进行插值得到的的。该模式几乎不需要计算时间,并达到了对于大多数应用来说足够高的精度。

    18、然而,在一些应用中,精度要求非常高。在这些情况下,可以通过最小二乘法调整来确定模型的姿态。与“interpolation”相反,该模式需要额外的计算时间。可以使用不同的最小二乘法调整模式('least_squares','least_squares_high'和'least_squares_very_high')来确定正在搜索最小距离的准确性。然而,选择精度越高,子像素提取将采取越长的时间。通常,SubPixel应设置为“interpolation”。如果需要进行最小二乘法调整,则应选择“least_squares”,因为这将导致运行时和精度之间的最佳权衡。

    19、相对于模型而言有稍微变形的物体,在某些情况下,无法被找到或者即使被找到,精度也很低。对于这样的对象,可以在参数SubPixel中额外传递最大允许对象变形。变形必须以像素为单位指定。这可以通过传递可选参数值“max_deformation”,后跟一个0到32之间的整数值(在同一个字符串中),该值指定最大变形。例如,如果对象的形状相对于存储在模型中的形状可以变形多达2个像素,则必须在SubPixel中传递值“max_deformation

    2”。传递值“max_deformation 0”时,进行搜索时要求物体不能变形,与不设定“max_deformation”的作用一样。

    20、请注意,最大变形值设定得较高时通常会导致运行时间增加。此外,选择变形值越高,发现错误模型实例的风险越高。这两个问题主要出现在搜索小物体或具有精细结构的物体时。这是因为这种物体在高变形时会失去其特征形状,而特征形状对于强大的搜索来说是很重要的。还要注意,对于较高的变形,如果在物体附近存在杂波,部分遮挡物体的精度可能会降低。因此,最大变形应尽可能选择尽可能小,只有在有必要的时候才设置得高一点。

    21、当指定高于0的变形时,匹配分数的计算取决于亚像素提取的所选值即subpixel的值。在大多数情况,如果选择了“minimum_squares”,“minimum_squares_high”或“least_squares_very_high”(参考上文第17点),则匹配的分数会发生变化(与“none”或“interpolation”进行比较)。此外,如果选择最小二乘调整中的一个,则增加最大变形时得分可能增加,因为对于模型点,可以找到更多对应的图像点。

    22、搜索期间使用的金字塔数量由NumLevels确定。如果需要,使用create_aniso_shape_model创建形状模型时的金字塔数量,如果NumLevels设置为0,则使用create_aniso_shape_model中指定的金字塔级别数。可选地,NumLevel可以包含第二个值,用于确定跟踪发现的匹配项的最低金字塔级别。因此,NumLevel的值[4,2]意味着匹配从第四个金字塔级别开始,并跟踪匹配到第二个最低金字塔级别(最低金字塔级别由值1表示)。该机制可用于减少匹配的运行时间。然而,应当注意,一般来说,在该模式中提取的姿态参数的准确度比在正常模式中更低,在正常模式中,匹配被跟踪到最低金字塔级。因此,如果需要高精度,则应将SubPixel设置为至少“'least_squares”。

    23、如果使用的最低金字塔级别被选择得太大,可能会无法实现所需的精度,或者发现模型的错误实例,因为模型在较高的金字塔级别上不够具体,不能可靠地选择正确的模型实例。在这种情况下,要使用的最低金字塔级别必须设置为较小的值。

    24、在质量差的输入图像中,即在例如散焦,变形或嘈杂的图像中,通常在最低金字塔级别上不能发现形状模型的实例。这种行为的原因是丢失或变形的边缘信息是由于图像质量差的结果。然而,边缘信息在更高的金字塔水平上可能是足够的。但是,如果使用在高级金字塔级别上发现的实例,请记住上述对准确性和鲁棒性的限制。合适的金字塔级别的选择,即可以在其上找到形状模型的至少一个实例的最低金字塔级别取决于模型和输入图像。这个金字塔级别可能因图像而异。为了便于对质量差的图像进行匹配,可以在匹配期间自动确定可以找到至少一个模型实例的最低金字塔级别。要激活此机制,必须在NumLevels中指定最低金字塔级别。如果例如NumLevels被设置为[4,-2],则匹配从第四金字塔级别开始并且跟踪到第二最低金字塔级别的匹配。这意味着在金字塔级别2上搜索形状模型的实例。如果在该金字塔级别上没有找到模型实例,则确定最低金字塔级别,可以在哪个模型的至少一个实例上找到。然后将返回此金字塔级别的实例。

    25、参数Greediness决定了搜索的贪婪程度。如果Greediness

    = 0,则使用安全搜索模式,如果模型在图像中可见,则始终会找到该模型。然而,在这种情况下,搜索将相对耗时。如果贪婪=

    1,则使用不安全的搜索模式,即使在图像中可见,也可能导致在极少数情况下找不到该模型。对于贪婪= 1,实现最大搜索速度。

    26、使用运算符set_shape_model_param可以为find_aniso_shape_model指定'timeout'。如果find_aniso_shape_model达到此“timeout”,则会终止搜索,并返回错误代码9400(H_ERR_TIMEOUT)。

    27、根据ScaleRMin,ScaleRMax,ScaleCMin和ScaleCMax指定的缩放范围,如果形状模型未预先生成,则find_aniso_shape_model需要大量时间才能释放缓存的转换。由于在发生超时之后必须释放此转换,所以在这种情况下find_aniso_shape_model的运行时间超过了此时指定的“timeout”的值。

     

    展开全文
  • 基于matlab+模板匹配的车牌识别

    万次阅读 多人点赞 2018-07-30 13:29:41
    一、前言  随着我国经济的快速发展,汽车拥有量的急剧增加,公路交通成为我国重要的交通运输途径,是国家大力发展的基础设施之一。因此,交通管理的现代化和智能化就越来越显得重要和亟迫。利用电子信息技术来提高...

    一、前言

           随着我国经济的快速发展,汽车拥有量的急剧增加,公路交通成为我国重要的交通运输途径,是国家大力发展的基础设施之一。因此,交通管理的现代化和智能化就越来越显得重要和亟迫。利用电子信息技术来提高管理效率、交通效率和打造安全的智能交通系统已成为当前交通管理发展的主题。实现交通管理现代化和智能化的核心技术之一就是车牌自动识别技术。与传统的车辆管理方法相比,它大大提高了管理效率和水平,节省了人力、物力,实现了车辆管理的科学化、规范化,对交通治安起到了保障作用,拥有广泛的应用前景。

            现在正值暑假期间,楼主在家复习图像处理的基础知识,准备为今年的秋招增加一点砝码,为了巩固知识点以及联系的作用,就看文献以及查找资料制作了一个车牌识别的系统,这个车牌的识别系统是基于matlab的,程序实现起来比较的简单,做的也比较粗糙,所以准确率来说相对低了很多,但是整体的框架以及一些步骤用来复习知识点以及项目参考是可以的,所以想要追求高识别率以及覆盖率的童鞋不要抱太大的希望哦,哈哈哈哈嗝!!!

    二、结果预览

                                

    三、程序框图

              

    四、代码分析

    1.图像的预处理

            这个部分的处理是为了减小、去除原始图像的噪声的影响,同时将原始图像中想要提取的部分得到加强,便于后面的处理。首先,彩色图像的数据量较大并且底色不同的话会对实验结果造成误差,所以我们先将原始图像转为灰度图像;其次,转为灰度图像之后,我们要对灰度图像进行加强并均匀化,灰度的加强可以直接使用histeq直接加强,也可以使用imadjust对于想要加强的部分进行加强操作;最后,我们对加强之后的灰度图进行边缘检测,我这边用到的边缘检测的方法是sobel,其实,在边缘检测方面,canny边缘检测是检测的首选,但是,我一直在尝试的过程中发现,canny检测完后出来的边界的线条过于多,对于下一步的处理造成影响,因此选用了sobel检测,执行完之后的结果如下图所示。

        

        global picture;
        picture = imread(pictureName);
        picture2Gray = rgb2gray(picture);                %转为灰度图像
        figure,
        subplot(1, 3, 1),imshow(picture);title('原始图像');          
        subplot(1, 3, 2),imshow(picture2Gray);title('原始图像的灰度图');
        subplot(1, 3, 3),imhist(picture2Gray);title('原始图像的灰度直方图');colorbar;
    %     grayEn = imadjust(picture2Gray, [], [0.25, 0.75], 2);       %灰度图增强
        grayEn = histeq(picture2Gray);              %灰度图均匀化
        figure, 
        subplot(1, 2, 1), imshow(grayEn);title('灰度增强之后的图像');
        subplot(1, 2, 2), imhist(grayEn);title('灰度增强之后的直方图');
        %边缘检测
        grayEn = imfilter(grayEn, fspecial('average', 3));      %均值平滑增强之后的灰度图像
        pictureOut = edge(grayEn, 'sobel');     
        figure,
        imshow(pictureOut), title('sobel边缘检测之后的图像');
        close all;

     

    2.车牌的初步定位

           车牌的初步定位是将车牌位置从整张图像中提取出来,同时去除其他部分的干扰。

           首先,先用腐蚀操作,腐蚀的目的是消除小而无意义的物体,这里选用se[1, 1, 1]的腐蚀算子;接着,对于腐蚀后的图像进行闭运算,平滑图像,这时候的算子se选用长方形的样式,只要小于这个面积值就会被连接在一起,可以看到,闭运算完之后车牌部分被连接在一起了,但是还是有很多其他的东西的干扰;最后,我们使用bwareaopen函数对小面积进行切除,即可得到完美的车牌区域了。

        

        

    %腐蚀处理去除边界点
        se1 = [1 ; 1 ; 1];
        pictureErode = imerode(pictureIn, se1);
        figure, imshow(pictureErode), title('边缘检测+腐蚀的图像'); 
    %     闭运算,先膨胀后腐蚀去除孔洞,可以平滑图像
        se2 = strel('rectangle', [48, 48]);
        pictureClose = imclose(pictureErode, se2);
        figure, imshow(pictureClose), title('经过腐蚀+开运算后的图像'); 
        pictureCut = bwareaopen(pictureClose, 10000);                    %把小面积去掉
        pictureCut = removeLargeArea(pictureCut, 50000);             %把大面积去掉
        figure, imshow(pictureCut), title('初步裁剪完之后的图像');
        % 定位车牌的区域
        pictureRe = regionprops(pictureCut, 'area', 'boundingbox');
    %     areas = [pictureRe.Area];    %将面积对象保存到areas里
        rects = cat(1, pictureRe.BoundingBox);      
       %将面积对象的边界条件链接并保存到rects,顺序为[起始点x坐标, 起始点y坐标, 面积对象长度(x), 面积 
       %对象宽度(y)]      
        figure, imshow(pictureCut), title('红色框标记完之后的图像');  
        rectangle('position', rects(1, :), 'EdgeColor', 'r');   %定位车牌区域,并用红色的框标记
        pictureOut = imcrop(picture, rects(1, :));                      %按照红线框切割车牌区域
        figure, imshow(pictureOut), title('裁剪完之后的图像');
        close all;

     

    3.倾斜角度的调整

           对于倾斜角度的修正,这里主要用到了randon变换,当然,除了用这个方法之外还可以用hough变换。这里有一篇关于randon变换的介绍,讲的简单易懂,大家可以前往学习一下,附上链接:https://blog.csdn.net/sinat_26681907/article/details/52277598     

           总结一句来说,randon变换就是在其不倾斜的时候水平轴上的各点的线积分,如下图所示:

                                           

          对于水平倾斜角度的调整:

            我们先将图像逆时针旋转90°以便我们进行擦欧总,当我们对于倾斜的图像进行radon变换之后,变换之后的结果在其倾斜角度的位置表现出最大的落差,因此,我们可以通过一阶微分函数对其进行求导然后求出其绝对值的累加和,寻找得到最大值的角度就是我们索要求得角度,再通过旋转变换imrotate得到修正后的图形。

                    

                  

        pictureGray1 = rgb2gray(pictureIn);
        %水平方向调整
        T=affine2d([0 1 0;1 0 0;0 0 1]);
        pictureTr=imwarp(pictureGray1,T);              % 图像转置,顺时针旋转90°调整水平方向
        theta = -20 : 20;                                       %设置倾斜角度的范围
        r1 = radon(pictureTr, theta);                      %radon变换确定倾斜角
        result1 = sum(abs(diff(r1)), 1);          %求出行倒数绝对值的累加和,最大的对应倾斜角
        rot1 = find(result1==max(result1))-21;
        pictureRo = imrotate(pictureIn, rot1);
        figure, imshow(pictureIn), title('调整之前');
        figure, imshow(pictureRo), title('调整水平角度之后的图像');

     

            对于竖直倾斜角度的调整:                                                                                                  

            对于竖直角度,我们采用和水平角度一样的方式,求radon变换,然后求其一阶导数绝对值的累加和,最大值就是我们所要求的倾斜角度,不过和水平不一样的是,竖直方向其实是同一行的元素之间的错位偏移,如图:

                               

            对于逆时针是一样的道理,这里就不加以赘述,对于这个变换,我们可以生成一个变换向量T,然后用imwarp对图像进行集合变换即可得到我们想要的图像。

             

           

    %竖直方向调整
        pictureGray2 = rgb2gray(pictureRo);
        r2 = radon(pictureGray2, theta);
        result2 = sum(abs(diff(r2)), 1);
        rot2 = (find(result2==max(result2))-21)/57.3;           %将数值转为角度
        if rot2>0
            T1 = affine2d([1 0 0 ; -tan(rot2) 1 0 ; size(pictureGray2, 1) * tan(rot2) 0 1]);
        else
            T1 = affine2d([1 0 0 ; tan(-rot2) 1 0 ; size(pictureGray2, 1) * tan(-rot2) 0 1]);
        end
        pictureOut = imwarp(pictureRo, T1);
        figure, imshow(pictureOut), title('水平+竖直调整之后的图像');
        close all;

    4.车牌的精确定位

            车牌的精确定位实际上就是去除边框的过程,图像只留下字符的部分,这部分我这里采用的方法是计算各个行列的差分的累加和,在变化最大的部分即确认为边框的位置,一般在没有太多干扰的时候这个方法是挺管用的,但是还是存在着切割不准确的问题,因此我把最大值的位置控制在了图像的前四分之一和后四分之一的部分,提高了准确率;除此之外,我还查找了论文中其他的方法,其中切割的方法还可以将图像转为二值化后去判断同一行是否有超过某一数值的连续的1的出现,这样也能确定出边框的大概位置(这个方法我还没有尝试,但是逻辑是挺好的),以下是我的切割后的图像:

        

     

    5.字符分割及其归一化

           这部分是将精确定位完之后的图像进行切割,从而独立出每个字符,切割之前先将图像进行二值化并且均匀化处理,这里我把图像的长度分成15等分,出去中间的圆点只占一份之外,其余部分的字符都是占用两个位置,这样不仅能去除圆点,还可以顺利的分割出字符,分割完之后的字符进行48*24的归一化处理,方便之后的模板匹配。

        

     

    % 去除上、下边框以及铆钉
        pictureGray1 = rgb2gray(pictureIn);
        [mY1, nY1] = size(pictureGray1);
        yresult = sum(abs(diff(pictureGray1)), 2);%1为列, 2为行
        yresult = imfilter(yresult, fspecial('average', 6));
        %计算上界坐标
        yTemp1 = yresult(10 : ceil(mY1/4), 1);
        [~, ymin] = max(yTemp1);
        %计算下界坐标
        yTemp2 = yresult(ceil(mY1/4) : (mY1 - 1), 1);
        [~, ymax] = max(yTemp2);
        ymax = ymax + ceil(mY1/4);
        pictureCutY =  imcrop(pictureIn, [1, ymin+5, nY1 , (ymax - ymin)-8]);
        
        % 去除左、右边框
        pictureGray2 = rgb2gray(pictureCutY);
        [mX, nX] = size(pictureGray2);
        xdiff = zeros(mX, nX-1);
        for i = 1:mX
            xdiff(i, :) = abs(diff(pictureGray2(i, :)));            %计算各列之间的差值并累加
            xresult = sum(xdiff, 1);
        end
        xresult = imfilter(xresult, fspecial('average', 6));
        %计算左界坐标
        xTemp1 = xresult( 1, 1 : ceil(nX/5));
        [~, xmin] = max(xTemp1);
        %计算右界坐标
        xTemp2 = xresult( 1, ceil(4*nX/5):(nX - 1));
        [~, xmax] = max(xTemp2);
        xmax = xmax + ceil(4*nX/5);
        pictureOut =  imcrop(pictureCutY, [xmin, 1,  (xmax - xmin) , mX]);
        figure, imshow(pictureOut), title('精确定位之后的图像');
        figure, imshow(pictureIn), title('定位之前');
        close all;

     

    6.字符识别

            字符识别部分可以采用模板识别和bp神经网络的方法,因为自己对于神经网络这一块不熟悉,并且车牌字符相对而言比较工整,因此这里采用模板识别的方法,对于切割完之后的图像和模板逐一像素点进行比较,相同则加1,最后看看和哪个的匹配度最高就输出哪个,方便、快捷。

                                                   

                                                

    以汉字为例(这里只用5个汉字):

        result = zeros(1, 5);    
        for i =35:39
            filename = strcat('F:\matlab\shibie\zifu\', int2str(i), '.jpg');
            shuzi = imread(filename);
            level = graythresh(shuzi);          %ostu自动分割阈值法
            shuzi = imbinarize(shuzi, level);
            shuzi = imfilter(shuzi, fspecial('average', 3));
            Num =0;
            for j =1:48
                for k = 1:24
                    if ( picture(j, k) == shuzi(j, k))
                        Num = Num+1;
                    end
                end
            end
            result(1, i-34) = Num;
        end
        num = find(result == max(result));
        switch num
            case 1
                out = '沪';
            case 2
                out = '晋';
            case 3
                out = '陕';    
            case 4
                out = '粤';    
            case 5
                out = '桂';    
        end

    五、总结

           总的来说,在整个过程中通过自己查找资料,认真分析,最后的结果还是比较满意的,但是这个例子仅仅是作为熟悉编程过程,认识图像处理相关函数而言来说的,本身算法的难度比较低,加之自己对于图像这方面还有待加强和学习,因此识别的概率也比较低,追求成功率的童鞋不要喷哦。做完这个设计,就要准备好好复习一下基础知识了,秋招啊秋招,难的一匹,希望之后会有好消息。

    完整代码和照片、字符样本、论文下载地址:

    https://download.csdn.net/download/j_m_chen/10572194           

    参考文献:[1]陈鼎. 基于Matlab的车牌识别系统的研究[D].南昌大学,2018.

         [2]贾晓丹,李文举,王海姣.一种新的基于Radon变换的车牌倾斜校正方法[J].计算机工程与应用,2008(03):245-248. 

         [3]radon变换  https://blog.csdn.net/sinat_26681907/article/details/52277598

         [4]Matlab 插值算法(最邻近、双线性、双三次插值  https://blog.csdn.net/u013146742/article/details/52923864

         [5]matlab的Regionprops详解  https://blog.csdn.net/langb2014/article/details/49886787

         [6]呙润华,苏婷婷,马晓伟.BP神经网络联合模板匹配的车牌识别系统[J].清华大学学报(自然科学版),2013,53(09):1221-1226.

         [7]卢博超. 车牌定位与字符识别的方法研究[D].华北理工大学,2017.

         [8]隋君. 基于数字图像处理技术的车牌识别系统研究[D].吉林大学,2016

     

    展开全文
  • 模板匹配

    千次阅读 2017-12-03 15:31:53
    做了许多的练习和实验,并对基于HDevelop的形状匹配算法的参数优化进行了研究,写了一篇《基于HDevelop的形状匹配算法参数的优化研究》文章,总结了在形状匹配过程中哪些参数影响到模板的搜索和匹配,又如何来协调...
  • 1、前两种都是属于模板匹配的方法,这些概念是在《数字图像处理高级应用》里的,其是移动匹配与向量匹配很像,只是移动匹配对灰度变换的鲁棒性不好。 这里说的移动匹配:就是把模板图像在原图像上进行移动,让后计算...
  • python环境下利用opencv进行数字识别(模板匹配

    千次阅读 热门讨论 2019-05-14 21:40:13
    这次主要分为两大部分,分别为字符分割和模板匹配,下面直接看主内容吧。 1.字符分割 字符分割我主要是用下面的这张照片先进行将上面的数字分割,设计道德方法用水平像素分布和垂直像素分布 1.1图片的获取 ...
  • 1.模板匹配opencv函数 链接:http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/imgproc/doc/object_detection.html?highlight=matchtemplate#cv.MatchTemplate   matchTemplate(InputArray image, Input...
  • OpenCV-模板匹配

    千次阅读 2018-03-04 17:29:36
    寻找一幅图像的匹配的模板,可以在一段视频里寻找出我们感兴趣的...所谓模板匹配就是在一幅图像中寻找和模板图像(patch)最相似的区域。该函数的功能为,在输入源图像Source image(I)中滑动框,寻找各个位置与...
  • 1 字符识别简介 字符识别是车牌识别中很重要的一部分,在模式识别中也扮演的很重要的角色。当然,我们可以用很多方法...当然基于模板匹配也是一种方法。模板匹配既简单有具有实效性。其中关键在于模板的选取。好的模板
  • halcon模板匹配之形状匹配法

    千次阅读 2013-04-24 11:02:27
    halcon有三种模板匹配方法:即Component-Based、Gray-Value-Based、Shaped_based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配,此外还有变形匹配和三维模型匹配也是分属于前面...
  • 1.模板匹配opencv函数 链接:http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/imgproc/doc/object_detection.html?highlight=matchtemplate#cv.MatchTemplate matchTemplate(InputArray image, Input...
  • 模板匹配原理与实现

    千次阅读 2013-08-17 22:18:07
    模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.通过目标图片在待匹配图片进行遍历,通过选择一定的匹配方式能够得到每个起始像素点的匹配值,最终匹配值最大的位置就是候选匹配位置,也就...
  • 模板匹配算法

    万次阅读 2016-03-31 20:33:56
    模板匹配(Template Matching)算法
  • 1 介绍基于模板匹配的车牌识别 1.1 依旧先对图像进行读入、灰度化、直方图均衡化,使用canny检测边缘、腐蚀定位。 对图像进行精定位,水平矫正滤波。 在模板匹配过程中,一套模板的准确率较低,可以考虑使用多套...
  • opencv模板匹配步骤及Code

    万次阅读 多人点赞 2018-08-20 14:32:01
    opencv模板匹配步骤及Code 首先介绍一下模板匹配的适用场景: 1、图像检索 2、目标跟踪 简单的说,模板匹配最主要的功能就是在一幅图像中去寻找和另一幅模板图像中相似度最高的部分,这就是模板匹配。 比如,...
  • python 模板匹配

    千次阅读 2019-07-10 10:12:50
    不需要匹配的地方,可以用黑色填充,不能用白色填充,结果仍然返回矩形框。 注释的代码现在不能用分数过滤,会有误检 TM_SQDIFF_NORMED 物体角度变化可能会漏检 import cv2 import os import numpy as np ...
  • halcon模板匹配

    万次阅读 2016-01-19 19:57:27
    * 在一个图片中获取ROI并在此图片中匹配  dev_close_window ()  dev_open_window (0, 0, 600, 600, 'black', WindowHandle)  * 窗口语句  read_image(Image,'L:/Halcon test/mk2.jpg')  *read_image(Image...
  • OpenCV模板匹配

    千次阅读 2018-10-08 20:08:35
    假设有100*100像素的一张原图,模板大小5*5像素,从(0,0)开始,根据不同的方法匹配模板大小即(0,0)到(5,5)空间,把用方法得到的值算作(0,0)这个像素的特征值,接下来重新从(0,1),按照这样从左到右,从上到下。...
  • LINEMOD模板匹配

    千次阅读 2019-12-29 17:09:57
    linemod特征采用彩色图像的梯度信息结合物体表面的法向特征作为模板匹配的依据。Linemod可以实现在几千个模板在图片上滑窗搜索达到实时。 1.计算彩色梯度方向 2.为使匹配有一定容错性,对特征进行一定邻域方向扩散 3...
  • 模板匹配opencv

    千次阅读 2017-12-15 21:53:00
    模板匹配的作用在图像识别领域作用可大了。那什么是模板匹配模板匹配,就是在一幅图像中寻找另一幅模板图像最匹配(也就是最相似)的部分的技术。 说的有点抽象,下面给个例子说明就很明白了。 在上面这...
  • 模板匹配matchTemplate

    千次阅读 2018-07-25 14:36:52
    C++: void matchTemplate(InputArray image, InputArray templ, OutputArray ...templ:用于搜索的模板图像。必须小于输入图像并且是一样的数据类型。 result:匹配结果图像。必须是单通道32位浮点型,且大小...
  • HALCON模板匹配

    千次阅读 2014-07-25 16:13:18
    基于HALCON的模板匹配方法总结    很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做了许多的练习和实验,并对基于HDevelop的形状匹配算法的参数...

空空如也

1 2 3 4 5 ... 20
收藏数 356,342
精华内容 142,536
关键字:

匹配