车牌识别大概步骤可分为:车牌定位,字符分割,字符识别三个步骤。

细分点可以有以下几个步骤:

(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;
}

输入图像:

运行结果截图如下:

车牌识别之二:字符分割相关推荐

  1. 基于Python opencv实现车牌识别及二维码条形码识别系统 附完整源码

    完整代码:https://download.csdn.net/download/qq_38735017/87416699 原理简介 车牌字符识别使用的算法是 opencv 的 SVM opencv 的 ...

  2. android图像识别二次开发包,车牌识别一体机二次开发包sdk详细介绍

    原标题:车牌识别一体机二次开发包sdk详细介绍 无论是车辆管理系统,洗车房,二手车交易,汽车4S店,称重系统还是考勤系统均能和易泊完美结合. 通过易泊车牌识别一体机抓拍识别车牌号码,将识别的车牌信息传 ...

  3. python-opencv实战:车牌识别(二):字符分割与保存

    上一篇文章内容为车牌定位,这篇文章从原理及代码角度分析如何分割字符. 文章目录 一. 分割字符的目的 二. 分割字符原理: 三. 代码 四. 代码分析 一. 分割字符的目的 定位车牌仅仅是为了找出其车 ...

  4. 蓝底白字车牌的定位与字符分割识别matlab仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 车牌识别自然环境下,汽车图像背景复杂.光照不均匀,如何在自然背景中准确地确定车牌区域是整个识别过程的关键.首先对采集到的视频图 ...

  5. 在ARM-Linux下实现车牌识别(二)------车牌识别

    你好!这里是风筝的博客, 欢迎和我一起交流. 之前说到,把车牌区域提前出来后,就可以着手识别程序了.先使用SVM判断是不是车牌.这里为了提高运行速度,板子资源有限,程序里我把svm训练部分注释掉了,假 ...

  6. 有关 车牌识别(二、Linux嵌入式系统代码)

    二.Linux嵌入式系统代码 参考  https://blog.csdn.net/qq_36449541/article/details/80206477 原先的开发者是在友善之臂的平台上(好像cpu ...

  7. 基于C++(QT)的车牌识别实现——二值化处理

    文章目录 拟采用的技术路线 车牌图片打开 图片二值化 窗口UI实现 拟采用的技术路线 本次设计计划以最快的速度实现一个清晰车牌的识别,后续再增加识别精确度,故采取以下技术路线本篇文章主要讲述图像二值化 ...

  8. 车牌识别一体机二次开发

    车牌识别一体机挂接分为两种挂接方式:动态库方式挂接和协议方式挂接. 1.动态库方式挂接:动态库方式挂接支持6种开发语言(VC++.Delphi.C#.VB.NET.Linux.Java). 动态库方式 ...

  9. 实现车牌识别之二--使用Yolov3进行车牌定位

    更新 一些sota的论文: Towards End-to-End License Plate Detection and Recognition: A Large Dataset and Baseli ...

最新文章

  1. python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
  2. java 中变量的存储与引用
  3. ubuntu-桌面版-常用设置
  4. 27行代码AC_迷宫 2017年第八届蓝桥杯A组第一题(暴力、仿迷宫)
  5. asp listview 单元格文字颜色_如何替换CAD表格中特定区域单元格中的文字?
  6. Effective Java -- 思维导图
  7. 再不懂ZooKeeper,就安安心心把这篇文章看完
  8. sql2005 无法在只读列“id”中插入数据
  9. zigbee学习之定时器
  10. 基金收益率计算5:金额加权收益率(MWRR)和时间加权收益率(TWRR)
  11. python cnn 回归模型_【深度学习系列】CNN模型的可视化
  12. mysql的填充因子_sql server填充因子
  13. 朋友的感情感想,感谢初中挚友“寻觅心香”提供!希望他能坚强!
  14. 微信支付接口调用问题(android正常,iphone调不起)
  15. 09组团队项目-Beta冲刺-2/5
  16. 使用python-opencv去掉视频水印
  17. python 企业邮箱发送邮件
  18. Java之美[从菜鸟到高手演变]之字符串
  19. 7-2 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (15分)
  20. Unable to locate tools.jar. Expected to find it in D:/jre6/lib/tools.jar问题解决

热门文章

  1. VueUse 中文文档:Components 组件
  2. spring security logout(spring security登出示例)
  3. 关于DateTime.Now.Ticks
  4. 前端VS后端Web开发
  5. CC00042.kafka——|Hadoopkafka.V27|——|kafka.v27|主题管理.v02|
  6. php 递归 递归方式与算法
  7. Oracle数据库查询数据语法
  8. MySQL(查询语句,关键字)
  9. Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not wor
  10. Tekton Pipeline 教程