opencv实现车牌识别之字符识别

简介

  在前面已经讲了车牌的定位和对车牌字符的分割,这里继续是最后对车牌的识别。

字符识别

  主要是用了两张办法,第一个是前面 <opencv实现车牌识别之失败经验> 这一篇中用到过的,opencv自带的getPSNR函数,这里不再对它进行讲解。
另一种方法是将分割出来的字符和模板字符都分割成9宫格形式,对比比较每个块中,像素占的比例来匹配分辨出字符。
  具体代码如下:
double proCale(Mat& mat1, int width_1, int height_1, int width_2, int height_2){
	int number = 0, sum = 0;
	IplImage pI = mat1;
	CvScalar s;
	double result;
	int i, j;

	for(i=width_1; i<=width_2; i++){
		for(j=height_1; j<=height_2; j++){
			s = cvGet2D(&pI,i,j);
			if(s.val[0] > 0.0){
				number += 1;
			}
			sum += 1;
		}
	}
	result = (double)number / (double)sum;

	return result;
}

int getPro(Mat& mat1){
	Mat mat2;
	int i, j, k;
	int hArr[4] = {0, 19, 39, 59};
	int wArr[4] = {0, 29, 69, 119};
	int wArrWidth = 3, wArrHeight = 3, sum;
	double tmp, tmp1, tmp2, all = 0;
	double *allPro;

	allPro = (double*)malloc(match_detect * sizeof(double));
	for(k=0; k< match_detect; k++){
		all = 0;
		mat2 = cv::imread(match_pic[k], 0);
		for(i=0; i< wArrWidth; i++){
			for(j=0; j< wArrHeight; j++){
				tmp1 = proCale(mat1, wArr[i], hArr[j], wArr[i+1], hArr[j+1]);
				tmp2 = proCale(mat2, wArr[i], hArr[j], wArr[i+1], hArr[j+1]);
				tmp = tmp1 - tmp2;
				if(tmp < 0){
					tmp = -tmp;
				}
				all += tmp;
			}
		}
		allPro[k] = all;
	}

	tmp = allPro[0];
	sum = 0;
	for(i=0; i<match_detect; i++){
//		printf("allPro[%d]:%lf\n", i, allPro[i]);
		if(tmp > allPro[i]){
			tmp = allPro[i];
			sum = i;
		}
	}
//	printf("sum:%d, %lf\n\n\n\n", sum, allPro[sum]);
	tmp = allPro[0];
	sum = 0;
	for(i=0; i<match_detect; i++){
		if(tmp > allPro[i]){
			tmp = allPro[i];
			sum = i;
		}
	}
	return sum;
}

int main(int argc, char** argv){
      ...............
      carCard_Resize(img_5, img_w, wWidth, wHeight);
        pic_Thresholding(img_w, 50);

        proSum = getPro(img_w);
//      proSum = match_ok(img_w);
        match_result(proSum);
        sprintf(str, "%d", i+3);
        namedWindow(str);
        imshow(str, img_w);
    }
    printf("\n");

    waitKey(0);
    return 0;
}
  函数proCale用来计算出传入图片的255像素所占的比例,然后getPro函数中将传入的目标图面mat1和模板图片,都分成九宫格的块,依次proCale计算,计算出9块中
所有的像素比例差。通过循环,将目标图片mat1和所有的模板都匹配计算出像素比例总的差值,找到其中差值最小的模板,则它就是该目标字符。注意,这里没有匹配
汉字。

结果演示

  结果演示如下:
                                                   
    代码下载地址:http://download.csdn.net/detail/u011630458/8444711
时间: 2024-10-24 05:50:12

opencv实现车牌识别之字符识别的相关文章

基于opencv的车牌识别系统

前言 学习了很长一段时间了,需要沉淀下,而最好的办法就是做一个东西来应用学习的东西,同时也是一个学习的过程. 概述     OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算

毕业设计 python opencv实现车牌识别 界面

主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https://github.com/yinghualuowu 答辩通过了,补完~ 这里主要是用两种方法进行定位识别 # -*- coding: utf-8 -*- __author__ = '樱花落舞' import tkinter as tk from tkinter.filedialog import * from tkinter import ttk

opencv实现车牌识别之车牌号定位_1

简介 按照在哪里跌倒就在哪里爬起来的精神,本章继续做车牌号的检测识别.所有步骤分为3步完成:车牌号定位,车牌号字符分割.字符识别. 本章为第一部分:车牌号定位. 效果演示 正式开始讲解之前,先看下车牌号定位出来的效果演示.注:本文所有图片均来源于网络. 如图所示,定位到车牌号之后,将车牌号用黄色框选起来,同时将该车牌复制为新图片显示出来. 代码及实现原理讲解 图像灰阶/二值化 首先也是常用的操作,将图像灰阶化,然后从像素值为255一侧开始,以累积像素占总像素5%的的地方作为二值化的阀值,进而获得

opencv实现车牌识别之车牌号定位_2

简介 前一篇讲解到了将用蓝色筛选后的图片,再一次灰阶/二值化.现在从这里继续讲解. 矩形检测 因为车牌是一个矩形.所以接着将又一次二值化之后的图片,进行膨胀,之后在进行矩形检测.框选出可能是车牌号的矩形区域. 代码如下: int** car_License_box(Mat& mat1, Mat& mat2, int* number){ Mat threshold_output; vector<vector<Point> > contours; vector<V

opencv实现车牌识别之字符分割

简介 在前一篇中,我们已经定位出来了在图片中车牌号的位置,并且将车牌号图片复制成了新图片,并显示出来,本章在这些被截取出来的图片上继续处理. 截取出来的新图片如下: 图像灰阶/二值化 首先也是选择将图像进行灰阶,然后采用以255一遍开始,取占了总pixel为5%的地方作为阀值,进行二值化. 代码如下: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <math.h

毕业设计 python opencv实现车牌识别 颜色判断

主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https://github.com/yinghualuowu 答辩通过了,补完~ 该部分代码还包括缩小边界 def img_color(card_imgs): colors = [] for card_index, card_img in enumerate(card_imgs): green = yello = blue = black = white

毕业设计 python opencv实现车牌识别 矩形矫正

主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https://github.com/yinghualuowu 答辩通过了,补完~ 用的是仿射变换 def img_Transform(car_contours,oldimg,pic_width,pic_hight): car_imgs = [] for car_rect in car_contours: if car_rect[2] > -1 and ca

车牌识别LPR(八)-- 字符识别

?第八篇:字符识别 车牌定位.车牌倾斜校正.车牌字符分割都是为车牌字符识别做的前提工作,这些前提工作直接关系到车牌识别系统的性能.车牌字符识别是车牌识别系统的核心部分,车牌字符识别的准确率是衡量车牌识别系统的一个很重要的指标. 一般字符识别的方法就是采用模式识别方法,简单的来说模式识别就是先通过提取输入模板的特征,然后通过模板的特征对样本进行分类,从而识别出样本.模式识别主要包括:数据采集.预处理.特征提取.特征匹配,其结构框架如图: 字符识别是模式识别的一个重要应用,首先提取待识别字符的特征:

使用opencv的SVM和神经网络实现车牌识别

一.前言 本文参考自<深入理解Opencv 实用计算机视觉项目解析>中的自动车牌识别项目,并对其中的方法理解后,再进行实践.深刻认识到实际上要完成车牌区域准确定位.车牌区域中字符的准确分割,字符准确识别这一系列步骤的困难.所以最后的识别效果也是有待进一步提高. 二.程序流程 程序流程如下所示: 相应的main函数如下 #include "carID_Detection.h" int main() { Mat img_input = imread("testCarI