android 车牌字符分割,车牌识别 之 字符分割
直接贴代码:
#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 车牌字符分割,车牌识别 之 字符分割相关推荐
- python圈出车牌字符_Python+OpenCV实现车牌字符分割和识别
最近做一个车牌识别项目,入门级别的,十分简单. 车牌识别总体分成两个大的步骤: 一.车牌定位:从照片中圈出车牌 二.车牌字符识别 这里只说第二个步骤,字符识别包括两个步骤: 1.图像处理 原本的图像每 ...
- matlab车牌识别字符切割,车牌识别字符分割问题
function [d]=main(jpg) close all; clear; [filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');% 直接自 ...
- 基于pytorch的无需分割字符的车牌识别
传统车牌识别 传统的车牌识别需要先检测出车牌,检测出车牌后通过"像素映射"或者"联通区查找"的方法分割出单个的文字,然后单独识别每个文字.传统的车牌识别不仅繁琐 ...
- opencv实现车牌识别之字符分割
简介 在前一篇中,我们已经定位出来了在图片中车牌号的位置,并且将车牌号图片复制成了新图片,并显示出来,本章在这些被截取出来的图片上继续处理. 截取出来的新图片如下: 图像灰阶/二值化 首先也是选择将图 ...
- 车牌识别之字符切割2
垂直投影上的切割 首先我选择车牌号作为投影的图片,可以作为车牌切割的技术. 原理:车牌处理好后,用数组存储所有像素值,然后在x轴上遍历每一列的像素值并累加,最总所投影的效果将以投影图的形式呈现,投影图 ...
- OpenCV+Python实现将车牌数字分割为单个的字符图片
目录 一.实现代码 1.图片预处理 读取图片 处理车牌上的螺丝 转灰度 闭运算 找字符边界 绘制边界 预处理效果 2.切割字符 预处理图转灰度 计算每一列的黑色和白色数量以及最大值 定义找右边界函数 ...
- OpenCV实现车牌识别,OCR分割,ANN神经网络
主要步骤: 准备车牌单个字符图像作为神经网络分类器的训练数据,越多越好.当然需要对每幅图像提取特征,这里使用的是水平和垂直累计直方图和缩小后的图像信息. 获取车牌图像,这里的车牌图像已经完成抠图,并且 ...
- 【python ++ opencv + pytorch 】车牌提取、分割、识别
话不多说,先看最后成果图(如果想要全部工程,文章最后我会把github链接放上): 可以看到最终的识别车牌号码是:苏G99999. 其实前年冬天偶然想着用c++来做一个小项目,然后就用 c++ ope ...
- Python基于YOLOv7和CRNN的车牌分割&识别系统(源码&教程)
1.研究背景 随着科技的进步和社会需求的增长,近年来摄像头逐渐高清化.高帧率化,摄像头作为信息获取设备的载体也不再局限于固定场景.路口.路侧.室内.高位.低位等不同场景下产生了各种对于检测识别的需求, ...
- 【车牌识别】基于matlab GUI阈值分割车牌识别(带面板)【含Matlab源码 721期】
⛄一.车牌识别简介 1 车牌图像处理 车牌图像处理主要有五个组成部分:图像灰度化.图像二值化.图像边缘检测.图像形态学运算和图像滤波处理.它是车牌识别系统中最根本且最基础的操作,车牌图像处理的好坏情况 ...
最新文章
- 【深度学习】Swin-Transformer和EfficientNet对比分析
- 关于mysql报 loopWaitCount 0, wait millis 60000 错误的解决办法
- 【企业管理】如何降低内部成本
- 【Numpy学习记录】np.transpose讲解
- db h2 数据类型_H2Database数据类型
- linux虚拟机能通显卡吗,英伟达 GeForce 游戏显卡正式支持虚拟机传递功能,可以完全调用...
- rx java_你会在实际工作中使用 rxjava 吗?
- BZOJ 2431 [HAOI2009]逆序对数列 (dp)
- 循环队列 代码实现(FIFO)
- python opengl3d模型_初试PyOpenGL一 (Python+OpenGL)
- 百度网盘解压显示服务器错误,百度网盘、Winrar等解压文件解压出错怎么办?
- JDK1.8优雅的集合排序(集合的排序)
- composer安装yii2框架提示“fxp/composer-asset-plugin”与composer版本不符
- 我安装archlinux的过程总结
- 思科交换机路由器console管理配置
- post和get方式在http请求中的区别
- 关于AQS中enq( )方法CAS操作的疑惑
- 网络工程师入门必备「思科模拟器」实现交换机工作原理_5分钟学会!超详细实验配置解析~
- 无线攻击 --aircrack-ng套件之一:Airodump-NG(无线数据包捕获工具)
- PDF页面裁剪工具如何使用?