车牌识别之二:字符分割
车牌识别大概步骤可分为:车牌定位,字符分割,字符识别三个步骤。
细分点可以有以下几个步骤:
(1)将图片灰度化与二值化
(2)去噪,然后切割成一个一个的字符
(3)提取每一个字符的特征,生成特征矢量或特征矩阵
(4)分类与学习。将特征矢量或特征矩阵与样本库进行比对,挑选出相似的那类样本,将这类样本的值作为输出结果。
车牌定位可以参考这里,网上也有很多关于这个问题的讨论,理论上觉得可行,但实际上没有操作过,等有空再去搞搞。
http://blog.csdn.net/sing_sing/archive/2010/10/13/5937725.aspx
这几天研究了一下车牌字符分割的问题,前提是已经进行了车牌定位,角度校正等预处理。
用到的主要知识有:二值化,形态学操作,轮廓查找等。
字符分割网上资料比较少,本人接触opencv一段时间,自己瞎搞了一下,以此抛砖引玉,希望与各位交流一下。
以下为全部源代码:
//==============================================
//write by sing
//2010-10-10
//==============================================
#include "stdafx.h"
//找出含车牌文字的最左端
void findX(IplImage* img, int* min, int* max)
{
int found = 0;
CvScalar maxVal = cvRealScalar(img->width * 255);
CvScalar val = cvRealScalar(0);
CvMat data;
int minCount = img->width * 255 / 5;
int count = 0;
for (int i = 0; i < img->width; i++) {
cvGetCol(img, &data, i);
val = cvSum(&data);
if (val.val[0] < maxVal.val[0]) {
count = val.val[0];
if (count > minCount && count < img->width * 255) {
*max = i;
if (found == 0) {
*min = i;
found = 1;
}
}
}
}
}
//找出含车牌文字的最上端,排除两颗螺丝的位置
void findY(IplImage* img, int* min, int* max)
{
int found = 0;
CvScalar maxVal = cvRealScalar(img->height * 255);
CvScalar val = cvRealScalar(0);
CvMat data;
int minCount = img->width * 255 / 5;
int count = 0;
for (int i = 0; i < img->height; i++) {
cvGetRow(img, &data, i);
val = cvSum(&data);
if (val.val[0] < maxVal.val[0]) {
count = val.val[0];
if (count > minCount && count < img->height * 255) {
*max = i;
if (found == 0) {
*min = i;
found = 1;
}
}
}
}
}
//车牌字符的最小区域
CvRect findArea(IplImage* img)
{
int minX, maxX;
int minY, maxY;
findX(img, &minX, &maxX);
findY(img, &minY, &maxY);
CvRect rc = cvRect(minX, minY, maxX - minX, maxY - minY);
return rc;
}
int main(int argc, char* argv[])
{
IplImage* imgSrc = cvLoadImage("cp.jpg", CV_LOAD_IMAGE_COLOR);
IplImage* img_gray = cvCreateImage(cvGetSize(imgSrc), IPL_DEPTH_8U, 1);
cvCvtColor(imgSrc, img_gray, CV_BGR2GRAY);
cvThreshold(img_gray, img_gray, 100, 255, CV_THRESH_BINARY);
//寻找最小区域,并截取
CvRect rc = findArea(img_gray);
cvSetImageROI(img_gray, rc);
IplImage* img_gray2 = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 1);
cvCopyImage(img_gray, img_gray2);
cvResetImageROI(img_gray);
IplImage* imgSrc2 = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);
cvSetImageROI(imgSrc, rc);
cvCopyImage(imgSrc, imgSrc2);
cvResetImageROI(imgSrc);
//形态学
cvMorphologyEx(img_gray2, img_gray2, NULL, NULL, CV_MOP_CLOSE);
CvSeq* contours = NULL;
CvMemStorage* storage = cvCreateMemStorage(0);
int count = cvFindContours(img_gray2, storage, &contours,
sizeof(CvContour), CV_RETR_EXTERNAL);
int idx = 0;
char szName[56] = {0};
for (CvSeq* c = contours; c != NULL; c = c->h_next) {
//cvDrawContours(imgSrc2, c, CV_RGB(255, 0, 0), CV_RGB(255, 255, 0), 100);
CvRect rc = cvBoundingRect(c);
cvDrawRect(imgSrc2, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0));
if (rc.width < imgSrc2->width / 10 && rc.height < imgSrc2->height / 5) {
continue;
}
IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);
cvSetImageROI(imgSrc2, rc);
cvCopyImage(imgSrc2, imgNo);
cvResetImageROI(imgSrc2);
sprintf(szName, "wnd_%d", idx++);
cvNamedWindow(szName);
cvShowImage(szName, imgNo);
cvReleaseImage(&imgNo);
}
cvNamedWindow("src");
cvShowImage("src", imgSrc2);
cvWaitKey(0);
cvReleaseMemStorage(&storage);
cvReleaseImage(&imgSrc);
cvReleaseImage(&imgSrc2);
cvReleaseImage(&img_gray);
cvReleaseImage(&img_gray2);
cvDestroyAllWindows();
return 0;
}
输入图像:
运行结果截图如下:
车牌识别之二:字符分割相关推荐
- 基于Python opencv实现车牌识别及二维码条形码识别系统 附完整源码
完整代码:https://download.csdn.net/download/qq_38735017/87416699 原理简介 车牌字符识别使用的算法是 opencv 的 SVM opencv 的 ...
- android图像识别二次开发包,车牌识别一体机二次开发包sdk详细介绍
原标题:车牌识别一体机二次开发包sdk详细介绍 无论是车辆管理系统,洗车房,二手车交易,汽车4S店,称重系统还是考勤系统均能和易泊完美结合. 通过易泊车牌识别一体机抓拍识别车牌号码,将识别的车牌信息传 ...
- python-opencv实战:车牌识别(二):字符分割与保存
上一篇文章内容为车牌定位,这篇文章从原理及代码角度分析如何分割字符. 文章目录 一. 分割字符的目的 二. 分割字符原理: 三. 代码 四. 代码分析 一. 分割字符的目的 定位车牌仅仅是为了找出其车 ...
- 蓝底白字车牌的定位与字符分割识别matlab仿真
目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 车牌识别自然环境下,汽车图像背景复杂.光照不均匀,如何在自然背景中准确地确定车牌区域是整个识别过程的关键.首先对采集到的视频图 ...
- 在ARM-Linux下实现车牌识别(二)------车牌识别
你好!这里是风筝的博客, 欢迎和我一起交流. 之前说到,把车牌区域提前出来后,就可以着手识别程序了.先使用SVM判断是不是车牌.这里为了提高运行速度,板子资源有限,程序里我把svm训练部分注释掉了,假 ...
- 有关 车牌识别(二、Linux嵌入式系统代码)
二.Linux嵌入式系统代码 参考 https://blog.csdn.net/qq_36449541/article/details/80206477 原先的开发者是在友善之臂的平台上(好像cpu ...
- 基于C++(QT)的车牌识别实现——二值化处理
文章目录 拟采用的技术路线 车牌图片打开 图片二值化 窗口UI实现 拟采用的技术路线 本次设计计划以最快的速度实现一个清晰车牌的识别,后续再增加识别精确度,故采取以下技术路线本篇文章主要讲述图像二值化 ...
- 车牌识别一体机二次开发
车牌识别一体机挂接分为两种挂接方式:动态库方式挂接和协议方式挂接. 1.动态库方式挂接:动态库方式挂接支持6种开发语言(VC++.Delphi.C#.VB.NET.Linux.Java). 动态库方式 ...
- 实现车牌识别之二--使用Yolov3进行车牌定位
更新 一些sota的论文: Towards End-to-End License Plate Detection and Recognition: A Large Dataset and Baseli ...
最新文章
- python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
- java 中变量的存储与引用
- ubuntu-桌面版-常用设置
- 27行代码AC_迷宫 2017年第八届蓝桥杯A组第一题(暴力、仿迷宫)
- asp listview 单元格文字颜色_如何替换CAD表格中特定区域单元格中的文字?
- Effective Java -- 思维导图
- 再不懂ZooKeeper,就安安心心把这篇文章看完
- sql2005 无法在只读列“id”中插入数据
- zigbee学习之定时器
- 基金收益率计算5:金额加权收益率(MWRR)和时间加权收益率(TWRR)
- python cnn 回归模型_【深度学习系列】CNN模型的可视化
- mysql的填充因子_sql server填充因子
- 朋友的感情感想,感谢初中挚友“寻觅心香”提供!希望他能坚强!
- 微信支付接口调用问题(android正常,iphone调不起)
- 09组团队项目-Beta冲刺-2/5
- 使用python-opencv去掉视频水印
- python 企业邮箱发送邮件
- Java之美[从菜鸟到高手演变]之字符串
- 7-2 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (15分)
- Unable to locate tools.jar. Expected to find it in D:/jre6/lib/tools.jar问题解决
热门文章
- VueUse 中文文档:Components 组件
- spring security logout(spring security登出示例)
- 关于DateTime.Now.Ticks
- 前端VS后端Web开发
- CC00042.kafka——|Hadoopkafka.V27|——|kafka.v27|主题管理.v02|
- php 递归 递归方式与算法
- Oracle数据库查询数据语法
- MySQL(查询语句,关键字)
- Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not wor
- Tekton Pipeline 教程