直接贴代码:
#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= 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= 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 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 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 20){
sum += 1;
}
allSum += 1;
}
}
tmp = sum / allSum;
return tmp;
}