直接贴代码:

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

using namespace std;

using namespace cv;

IplImage *g_pGrayImage = NULL;

IplImage *g_pBinaryImage = NULL;

const char *pstrWindowsBinaryTitle = "二值图";

void on_trackbar(int pos)

{

// 转为二值图

cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);

// 显示二值图

cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);

}

int detectionChange(Mat& mat1, Mat& mat2, int number);

void verProjection_calculate(Mat& mat1, int* vArr, int number);

int** verProjection_cut(int* vArr, int width, int* number);

float pixelPercentage(Mat& mat1);

int _tmain(int argc, _TCHAR* argv[])

{

const char *pstrWindowsSrcTitle = "原图";

const char *pstrWindowsToolBarName = "二值图阈值";

// 从文件中加载原图

IplImage *pSrcImage = cvLoadImage("plate.jpg", CV_LOAD_IMAGE_UNCHANGED);

if (pSrcImage==NULL)

return -1;

// 转为灰度图

g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);

cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);

// 创建二值图

g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);

// 显示原图

cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);

cvShowImage(pstrWindowsSrcTitle, pSrcImage);

// 创建二值图窗口

cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);

// 滑动条

//int nThreshold = 0;

//cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);

//on_trackbar(1);

// 转为二值图

cvThreshold(g_pGrayImage, g_pBinaryImage, 190, 255, CV_THRESH_BINARY);

// 显示二值图

cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);

// 字符分割

Mat img_3;

detectionChange((Mat)g_pBinaryImage, img_3, 7);

imshow(" 边缘分离 ",img_3);

int width, reWidth=30, wWidth=20, pic_width;

int height, reHeight=100, wHeight = 20;

int pic_ArrNumber;

int vArr[100];

int **pic_Arr;

Mat img_4 = img_3;

// 调整图片的大小。

resize(img_3,img_4,Size(100,30));

verProjection_calculate(img_4, vArr, reHeight);

pic_Arr = verProjection_cut(vArr, reHeight, &pic_ArrNumber);

int i;

for(i=0; i< pic_ArrNumber; i++){

printf("pic_Arr[%d]:%d, %d\n", i, pic_Arr[i][0], pic_Arr[i][1]);

}

char str[20]={0};

sprintf(str, "%d", i+3);

namedWindow(str);

imshow("缩小的图像", img_4);

Mat img_5;

IplImage pI_1 = (Mat)img_4;

IplImage pI_2;

float percentage = 0.0;

CvScalar s1;

char str1[20]={0};

for(i=0; i< pic_ArrNumber; i++){

pic_width = pic_Arr[i][1] - pic_Arr[i][0];

// 字体宽度的度量。

if(pic_width < 3){

continue;

}

img_5 = cv::Mat(reWidth, pic_Arr[i][1] - pic_Arr[i][0], CV_8UC1, 1);

pI_2 = img_5;

for(int j=0; j

for(int k=pic_Arr[i][0]; k

s1 = cvGet2D(&pI_1, j, k);

cvSet2D(&pI_2, j, k-pic_Arr[i][0], s1);

}

}

percentage = pixelPercentage(img_5);

if(percentage < 0.1){

continue;

}

// 又一次判定 字符的宽度。

if(pic_width < 3){

printf("the %d is 1\n", i);

continue;

}

Mat img_w = img_5;

// 调整图片的大小。

resize(img_5,img_w,Size(10,40));

sprintf(str1, "%d", i+10);

namedWindow(str1);

imshow(str1, img_w);

}

cvWaitKey(0);

cvDestroyWindow(pstrWindowsSrcTitle);

cvDestroyWindow(pstrWindowsBinaryTitle);

cvReleaseImage(&pSrcImage);

cvReleaseImage(&g_pGrayImage);

cvReleaseImage(&g_pBinaryImage);

return 0;

}

int detectionChange(Mat& mat1, Mat& mat2, int number){

IplImage pI_1 = mat1, pI_2;

CvScalar s1, s2;

int width = mat1.rows;

int height = mat1.cols;

int sum = 0, sum_2 = 0, width_1 = 0, width_2 = 0;

int i, j;

for(i=0; i

sum = 0;

sum_2 = 0;

for(j=0; j

s1 = cvGet2D(&pI_1, i, j);

s2 = cvGet2D(&pI_1, i, j+1);

if(((int)s1.val[0]) != ((int)s2.val[0])){

sum += 1;

sum_2 = 0;

}else{

sum_2 += 1;

}

if(sum_2 != 0){

if(height / sum_2 < 5){

sum = 0;

break;

}

}

}

if(sum >= number){

width_1 = i;

break;

}else{

width_1 = i;

}

}

for(i=width-1; i> 0; i--){

sum = 0;

sum_2 = 0;

for(j=0; j

s1 = cvGet2D(&pI_1, i, j);

s2 = cvGet2D(&pI_1, i, j+1);

if(((int)s1.val[0]) != ((int)s2.val[0])){

sum += 1;

sum_2 = 0;

}else{

sum_2 += 1;

}

if(sum_2 != 0){

if(height / sum_2 < 1){

sum = 0;

break;

}

}

}

if(sum >= number){

width_2 = i;

break;

}else{

width_2 = i;

}

}

if(width_2 <= width_1){

width_2 = width;

}

mat2 = cv::Mat(width_2 - width_1 + 1, height, CV_8UC1, 1);

pI_2 = mat2;

for(i=width_1; i<= width_2; i++){

for(j=0; j

s1 = cvGet2D(&pI_1, i, j);

cvSet2D(&pI_2, i-width_1, j, s1);

}

}

return 1;

}

void verProjection_calculate(Mat& mat1, int* vArr, int number){

IplImage pI_1 = mat1;

CvScalar s1;

int width = mat1.rows;

int height = mat1.cols;

int i, j;

for(i=0; i< number; i++){

vArr[i] = 0;

}

for(j=0; j

for(i=0; i

s1 = cvGet2D(&pI_1, i, j);

if(s1.val[0] > 20){

vArr[j] += 1;

}

}

}

}

int** verProjection_cut(int* vArr, int width, int* number){

int **a;

int i, flag = 0;

int num = 0;

int threshold = 2;

a = (int**)malloc(width / 2 * sizeof(int*));

for(i=0; i

if((vArr[i] <= threshold) && (vArr[i+1] > threshold)){

a[num] = (int* )malloc(2 * sizeof(int));

a[num][0] = i;

flag = 1;

}else if((vArr[i] > threshold) && (vArr[i+1] <= threshold) && (flag != 0)){

a[num][1] = i;

num += 1;

flag = 0;

}

}

*number = num;

return a;

}

float pixelPercentage(Mat& mat1){

IplImage pI_1 = mat1;

CvScalar s1;

int width = mat1.rows;

int height = mat1.cols;

int i, j;

float sum = 0, allSum = 0, tmp;

for(i=0; i

for(j=0; j

s1 = cvGet2D(&pI_1, i, j);

if(s1.val[0] > 20){

sum += 1;

}

allSum += 1;

}

}

tmp = sum / allSum;

return tmp;

}

分割结果演示:

android 车牌字符分割,车牌识别 之 字符分割相关推荐

  1. python圈出车牌字符_Python+OpenCV实现车牌字符分割和识别

    最近做一个车牌识别项目,入门级别的,十分简单. 车牌识别总体分成两个大的步骤: 一.车牌定位:从照片中圈出车牌 二.车牌字符识别 这里只说第二个步骤,字符识别包括两个步骤: 1.图像处理 原本的图像每 ...

  2. matlab车牌识别字符切割,车牌识别字符分割问题

    function [d]=main(jpg) close all; clear; [filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');% 直接自 ...

  3. 基于pytorch的无需分割字符的车牌识别

    传统车牌识别 传统的车牌识别需要先检测出车牌,检测出车牌后通过"像素映射"或者"联通区查找"的方法分割出单个的文字,然后单独识别每个文字.传统的车牌识别不仅繁琐 ...

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

    简介 在前一篇中,我们已经定位出来了在图片中车牌号的位置,并且将车牌号图片复制成了新图片,并显示出来,本章在这些被截取出来的图片上继续处理. 截取出来的新图片如下: 图像灰阶/二值化 首先也是选择将图 ...

  5. 车牌识别之字符切割2

    垂直投影上的切割 首先我选择车牌号作为投影的图片,可以作为车牌切割的技术. 原理:车牌处理好后,用数组存储所有像素值,然后在x轴上遍历每一列的像素值并累加,最总所投影的效果将以投影图的形式呈现,投影图 ...

  6. OpenCV+Python实现将车牌数字分割为单个的字符图片

    目录 一.实现代码 1.图片预处理 读取图片 处理车牌上的螺丝 转灰度 闭运算 找字符边界 绘制边界 预处理效果 2.切割字符 预处理图转灰度 计算每一列的黑色和白色数量以及最大值 定义找右边界函数 ...

  7. OpenCV实现车牌识别,OCR分割,ANN神经网络

    主要步骤: 准备车牌单个字符图像作为神经网络分类器的训练数据,越多越好.当然需要对每幅图像提取特征,这里使用的是水平和垂直累计直方图和缩小后的图像信息. 获取车牌图像,这里的车牌图像已经完成抠图,并且 ...

  8. 【python ++ opencv + pytorch 】车牌提取、分割、识别

    话不多说,先看最后成果图(如果想要全部工程,文章最后我会把github链接放上): 可以看到最终的识别车牌号码是:苏G99999. 其实前年冬天偶然想着用c++来做一个小项目,然后就用 c++ ope ...

  9. Python基于YOLOv7和CRNN的车牌分割&识别系统(源码&教程)

    1.研究背景 随着科技的进步和社会需求的增长,近年来摄像头逐渐高清化.高帧率化,摄像头作为信息获取设备的载体也不再局限于固定场景.路口.路侧.室内.高位.低位等不同场景下产生了各种对于检测识别的需求, ...

  10. 【车牌识别】基于matlab GUI阈值分割车牌识别(带面板)【含Matlab源码 721期】

    ⛄一.车牌识别简介 1 车牌图像处理 车牌图像处理主要有五个组成部分:图像灰度化.图像二值化.图像边缘检测.图像形态学运算和图像滤波处理.它是车牌识别系统中最根本且最基础的操作,车牌图像处理的好坏情况 ...

最新文章

  1. 【深度学习】Swin-Transformer和EfficientNet对比分析
  2. 关于mysql报 loopWaitCount 0, wait millis 60000 错误的解决办法
  3. 【企业管理】如何降低内部成本
  4. 【Numpy学习记录】np.transpose讲解
  5. db h2 数据类型_H2Database数据类型
  6. linux虚拟机能通显卡吗,英伟达 GeForce 游戏显卡正式支持虚拟机传递功能,可以完全调用...
  7. rx java_你会在实际工作中使用 rxjava 吗?
  8. BZOJ 2431 [HAOI2009]逆序对数列 (dp)
  9. 循环队列 代码实现(FIFO)
  10. python opengl3d模型_初试PyOpenGL一 (Python+OpenGL)
  11. 百度网盘解压显示服务器错误,百度网盘、Winrar等解压文件解压出错怎么办?
  12. JDK1.8优雅的集合排序(集合的排序)
  13. composer安装yii2框架提示“fxp/composer-asset-plugin”与composer版本不符
  14. 我安装archlinux的过程总结
  15. 思科交换机路由器console管理配置
  16. post和get方式在http请求中的区别
  17. 关于AQS中enq( )方法CAS操作的疑惑
  18. 网络工程师入门必备「思科模拟器」实现交换机工作原理_5分钟学会!超详细实验配置解析~
  19. 无线攻击 --aircrack-ng套件之一:Airodump-NG(无线数据包捕获工具)
  20. PDF页面裁剪工具如何使用?

热门文章

  1. 晓日程-首款打通微信和桌面的免费日历应用
  2. SAF手持式频谱分析仪SC和手持式信号发生器SG的应用概述
  3. GPC凝胶色谱理论和应用(一)
  4. 一些很好的python自动化办公方案(待整理到readthedocs中)
  5. java月历_Java 日历
  6. 高通msm8926 camera调试笔记
  7. Java对接圆通电子面单下单接口
  8. 图解Java类加载机制
  9. 用KMS激活了office2016之后为什么进入的时候还是提示需激活解决方案:
  10. Logic Pro X for Mac(专业级音频制作软件)