//视频分帧
#include <opencv2/opencv.hpp>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <ostream>
#pragma warning(disable:4996)
using namespace std;
using namespace cv;
string read_plate(string path)
{
/*加载图片*/
const char* imagename = path.c_str();
IplImage * img = cvLoadImage(imagename);
if (!img)
{
exit(1);
}
if (!img->imageData) // 检查是否正确载入图像
exit(1);
cvNamedWindow("image", CV_WINDOW_AUTOSIZE); //创建窗口
// cvShowImage("image", img); //显示图像
/*灰度化处理*/
IplImage* img1 = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);//创建目标图像
cvCvtColor(img, img1, CV_BGR2GRAY);//cvCvtColor(src,des,CV_BGR2GRAY)
cvNamedWindow("gray_image", CV_WINDOW_AUTOSIZE);//创建显示目标的窗口
// cvShowImage("gray_image",img1);//显示灰度图像
/*滤波处理*/
IplImage* temp = cvCreateImage(cvGetSize(img1), IPL_DEPTH_8U, 1);//创建目标图像
cvSmooth(img1, temp, CV_GAUSSIAN, 1, 1);//高斯模糊
// cvShowImage("guolv_image",temp);//显示过滤图
/*竖向边缘检测 竖向只是参数的改变*/
IplImage * sobel = cvCreateImage(cvGetSize(temp), IPL_DEPTH_16S, 1);
IplImage *sobelimg = cvCreateImage(cvGetSize(temp), IPL_DEPTH_8U, 1);
cvSobel(temp, sobel, 2, 0, 7);
cvConvertScaleAbs(sobel, sobelimg, 0.00390625, 0);
// cvShowImage("灰度图像Sobel变换",sobelimg);
/*二值化处理*/
IplImage *two = cvCreateImage(cvGetSize(temp), IPL_DEPTH_8U, 1);
cvThreshold(sobelimg, two, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
// cvShowImage("two",two);
/*形态学处理 腐蚀膨胀*/
IplImage *closeimg = cvCreateImage(cvGetSize(temp), IPL_DEPTH_8U, 1);
IplConvKernel* kernal = cvCreateStructuringElementEx(3, 1, 1, 0, CV_SHAPE_RECT);
cvDilate(two, closeimg, kernal, 6);
cvErode(closeimg, closeimg, kernal, 4);
cvDilate(closeimg, closeimg, kernal, 2);
kernal = cvCreateStructuringElementEx(1, 3, 0, 1, CV_SHAPE_RECT);
cvErode(closeimg, closeimg, kernal, 4);
cvDilate(closeimg, closeimg, kernal, 2);
//cvShowImage("closeimg",closeimg);
/*筛选最大的那块矩形*/
IplImage* copy = cvCloneImage(closeimg);
IplImage* dst = cvCloneImage(img);
CvMemStorage* storage = cvCreateMemStorage();
CvSeq* contours;
CvRect rect, max;
int count = 0;
double wide = 0, height = 0;
count = cvFindContours(copy, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
for (; contours != NULL; contours = contours->h_next)
{
rect = cvBoundingRect(contours);
if (rect.width > (rect.height * 2))
{
if (rect.height > height && rect.width > wide)
{
max = rect;
height = rect.height;
wide = rect.width;
}
}
}
cvSetImageROI(dst, cvRect(max.x + 11, max.y + 2, max.width - 16, max.height - 2));
cvShowImage("choose", dst);
}
//车牌识别
//中文字模 注意绝对路径= =
const char *mb_ku_zw[31] = {
"/home/panhao/QtProject/MyANPR/char_img/zw1.bmp","/home/panhao/QtProject/MyANPR/char_img/zw2.bmp","/home/panhao/QtProject/MyANPR/char_img/zw3.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw4.bmp","/home/panhao/QtProject/MyANPR/char_img/zw5.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw6.bmp","/home/panhao/QtProject/MyANPR/char_img/zw7.bmp","/home/panhao/QtProject/MyANPR/char_img/zw8.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw9.bmp","/home/panhao/QtProject/MyANPR/char_img/zw10.bmp","/home/panhao/QtProject/MyANPR/char_img/zw11.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw12.bmp","/home/panhao/QtProject/MyANPR/char_img/zw13.bmp","/home/panhao/QtProject/MyANPR/char_img/zw14.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw15.bmp","/home/panhao/QtProject/MyANPR/char_img/zw16.bmp","/home/panhao/QtProject/MyANPR/char_img/zw17.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw18.bmp","/home/panhao/QtProject/MyANPR/char_img/zw19.bmp","/home/panhao/QtProject/MyANPR/char_img/zw20.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw21.bmp","/home/panhao/QtProject/MyANPR/char_img/zw22.bmp","/home/panhao/QtProject/MyANPR/char_img/zw23.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw24.bmp","/home/panhao/QtProject/MyANPR/char_img/zw25.bmp","/home/panhao/QtProject/MyANPR/char_img/zw26.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw27.bmp","/home/panhao/QtProject/MyANPR/char_img/zw28.bmp","/home/panhao/QtProject/MyANPR/char_img/zw29.bmp",
"/home/panhao/QtProject/MyANPR/char_img/zw30.bmp","/home/panhao/QtProject/MyANPR/char_img/zw31.bmp",
};
const char *mb_ku_zf[24] = {
"/home/panhao/QtProject/MyANPR/char_img/A.bmp","/home/panhao/QtProject/MyANPR/char_img/B.bmp",
"/home/panhao/QtProject/MyANPR/char_img/C.bmp","/home/panhao/QtProject/MyANPR/char_img/D.bmp",
"/home/panhao/QtProject/MyANPR/char_img/E.bmp","/home/panhao/QtProject/MyANPR/char_img/F.bmp",
"/home/panhao/QtProject/MyANPR/char_img/G.bmp","/home/panhao/QtProject/MyANPR/char_img/H.bmp",
"/home/panhao/QtProject/MyANPR/char_img/J.bmp","/home/panhao/QtProject/MyANPR/char_img/K.bmp",
"/home/panhao/QtProject/MyANPR/char_img/L.bmp","/home/panhao/QtProject/MyANPR/char_img/M.bmp",
"/home/panhao/QtProject/MyANPR/char_img/N.bmp","/home/panhao/QtProject/MyANPR/char_img/P.bmp",
"/home/panhao/QtProject/MyANPR/char_img/Q.bmp","/home/panhao/QtProject/MyANPR/char_img/R.bmp",
"/home/panhao/QtProject/MyANPR/char_img/S.bmp","/home/panhao/QtProject/MyANPR/char_img/T.bmp",
"/home/panhao/QtProject/MyANPR/char_img/U.bmp","/home/panhao/QtProject/MyANPR/char_img/V.bmp",
"/home/panhao/QtProject/MyANPR/char_img/W.bmp","/home/panhao/QtProject/MyANPR/char_img/X.bmp",
"/home/panhao/QtProject/MyANPR/char_img/Y.bmp","/home/panhao/QtProject/MyANPR/char_img/Z.bmp",
};
const char *mb_ku_sz[10] = {
"/home/panhao/QtProject/MyANPR/char_img/0.bmp","/home/panhao/QtProject/MyANPR/char_img/1.bmp","/home/panhao/QtProject/MyANPR/char_img/2.bmp",
"/home/panhao/QtProject/MyANPR/char_img/3.bmp","/home/panhao/QtProject/MyANPR/char_img/4.bmp","/home/panhao/QtProject/MyANPR/char_img/5.bmp",
"/home/panhao/QtProject/MyANPR/char_img/6.bmp","/home/panhao/QtProject/MyANPR/char_img/7.bmp","/home/panhao/QtProject/MyANPR/char_img/8.bmp",
"/home/panhao/QtProject/MyANPR/char_img/9.bmp",
};
const char *mb_ku_sf[34] = {
"/home/panhao/QtProject/MyANPR/char_img/0.bmp","/home/panhao/QtProject/MyANPR/char_img/1.bmp","/home/panhao/QtProject/MyANPR/char_img/2.bmp",
"/home/panhao/QtProject/MyANPR/char_img/3.bmp","/home/panhao/QtProject/MyANPR/char_img/4.bmp","/home/panhao/QtProject/MyANPR/char_img/5.bmp",
"/home/panhao/QtProject/MyANPR/char_img/6.bmp","/home/panhao/QtProject/MyANPR/char_img/7.bmp","/home/panhao/QtProject/MyANPR/char_img/8.bmp",
"/home/panhao/QtProject/MyANPR/char_img/9.bmp","/home/panhao/QtProject/MyANPR/char_img/A.bmp","/home/panhao/QtProject/MyANPR/char_img/B.bmp",
"/home/panhao/QtProject/MyANPR/char_img/C.bmp","/home/panhao/QtProject/MyANPR/char_img/D.bmp","/home/panhao/QtProject/MyANPR/char_img/E.bmp",
"/home/panhao/QtProject/MyANPR/char_img/F.bmp","/home/panhao/QtProject/MyANPR/char_img/G.bmp","/home/panhao/QtProject/MyANPR/char_img/H.bmp",
"/home/panhao/QtProject/MyANPR/char_img/J.bmp","/home/panhao/QtProject/MyANPR/char_img/K.bmp","/home/panhao/QtProject/MyANPR/char_img/L.bmp",
"/home/panhao/QtProject/MyANPR/char_img/M.bmp","/home/panhao/QtProject/MyANPR/char_img/N.bmp","/home/panhao/QtProject/MyANPR/char_img/P.bmp",
"/home/panhao/QtProject/MyANPR/char_img/Q.bmp","/home/panhao/QtProject/MyANPR/char_img/R.bmp","/home/panhao/QtProject/MyANPR/char_img/S.bmp",
"/home/panhao/QtProject/MyANPR/char_img/T.bmp","/home/panhao/QtProject/MyANPR/char_img/U.bmp","/home/panhao/QtProject/MyANPR/char_img/V.bmp",
"/home/panhao/QtProject/MyANPR/char_img/W.bmp","/home/panhao/QtProject/MyANPR/char_img/X.bmp","/home/panhao/QtProject/MyANPR/char_img/Y.bmp",
"/home/panhao/QtProject/MyANPR/char_img/Z.bmp",
};
int sb_count_bd(IplImage *img)
{
int count = 0;
uchar *pt = (uchar *)img->imageData;
const uchar step = img->widthStep;
for (int w = 0; w < img->width; w++)
for (int h = 0; h < img->height; h++)
if (pt[h*step + w])
count += w * h;
return count;
}
string db_successlv_3(IplImage *cs)
{
uchar *pt_cs = (uchar *)cs->imageData;
uchar i = 0;
uchar max = 0;
uchar max_backup = 0;
uchar zf = 0;
string fhz = "\0";
for (i = 0; i < 34; i++)
{
IplImage *mb = cvLoadImage(mb_ku_sf[i], 1);
uchar cgl = 0;
int cg_count = 0;
int bd_count = 0;
uchar *pt_mb = (uchar *)mb->imageData;
const uchar step_cs = cs->widthStep;
const uchar step_mb = mb->widthStep;
for (int w = 0; w < cs->width; w++)
for (int h = 0; h < cs->height; h++)
{
if ((pt_cs[h*step_cs + w] == pt_mb[h*step_mb + w]))
cg_count++;
if (pt_mb[h*step_mb + w])
bd_count++;
}
cvReleaseImage(&mb);
cgl = (uchar)(((float)cg_count / (cs->height*cs->width)) * 100);
max = max < cgl ? cgl : max;
if (max != max_backup)
zf = i;
max_backup = max;
}
switch (zf)
{
case 0: fhz = "0"; break; case 1: fhz = "1"; break; case 2: fhz = "2"; break; case 3: fhz = "3"; break;
case 4: fhz = "4"; break; case 5: fhz = "5"; break; case 6: fhz = "6"; break; case 7: fhz = "7"; break;
case 8: fhz = "8"; break; case 9: fhz = "9"; break; case 10: fhz = "A"; break; case 11: fhz = "B"; break;
case 12: fhz = "C"; break; case 13: fhz = "D"; break; case 14: fhz = "E"; break; case 15: fhz = "F"; break;
case 16: fhz = "G"; break; case 17: fhz = "H"; break; case 18: fhz = "J"; break; case 19: fhz = "K"; break;
case 20: fhz = "L"; break; case 21: fhz = "M"; break; case 22: fhz = "N"; break; case 23: fhz = "P"; break;
case 24: fhz = "Q"; break; case 25: fhz = "R"; break; case 26: fhz = "S"; break; case 27: fhz = "T"; break;
case 28: fhz = "U"; break; case 29: fhz = "V"; break; case 30: fhz = "W"; break; case 31: fhz = "X"; break;
case 32: fhz = "Y"; break; case 33: fhz = "Z"; break;
}
return (fhz);
}
string db_successlv_1(IplImage *cs)
{
string fhz = "\0";
uchar *pt_cs = (uchar *)cs->imageData;
uchar i = 0;
uchar max = 0;
uchar max_backup = 0;
uchar zf = 0;
for (i = 0; i < 31; i++)
{
IplImage *mb = cvLoadImage(mb_ku_zw[i], 1);
uchar cgl = 0;
int cg_count = 0;
int bd_count = 0;
uchar *pt_mb = (uchar *)mb->imageData;
const uchar step_cs = cs->widthStep;
const uchar step_mb = mb->widthStep;
for (int w = 0; w < cs->width; w++)
for (int h = 0; h < cs->height; h++)
{
if ((pt_cs[h*step_cs + w] == pt_mb[h*step_mb + w]))
cg_count++;
if (pt_mb[h*step_mb + w])
bd_count++;
}
cvReleaseImage(&mb);
cgl = (uchar)(((float)cg_count / (cs->height*cs->width)) * 100);
max = max < cgl ? cgl : max;
if (max != max_backup)
zf = i;
max_backup = max;
//printf("zf=%d\n",(int)zf);
}
switch (zf)
{
case 0: fhz = "藏"; break; case 1: fhz = "川"; break; case 2: fhz = "鄂"; break; case 3: fhz = "甘"; break;
case 4: fhz = "赣"; break; case 5: fhz = "贵"; break; case 6: fhz = "桂"; break; case 7: fhz = "黑"; break;
case 8: fhz = "沪"; break; case 9: fhz = "吉"; break; case 10: fhz = "冀"; break; case 11: fhz = "津"; break;
case 12: fhz = "晋"; break; case 13: fhz = "京"; break; case 14: fhz = "辽"; break; case 15: fhz = "鲁"; break;
case 16: fhz = "蒙"; break; case 17: fhz = "闽"; break; case 18: fhz = "宁"; break; case 19: fhz = "青"; break;
case 20: fhz = "琼"; break; case 21: fhz = "陕"; break; case 22: fhz = "苏"; break; case 23: fhz = "皖"; break;
case 24: fhz = "湘"; break; case 25: fhz = "新"; break; case 26: fhz = "渝"; break; case 27: fhz = "豫"; break;
case 28: fhz = "粤"; break; case 29: fhz = "云"; break; case 30: fhz = "浙"; break;
}
//cout << "return"<<endl;
return (fhz);
}
string db_successlv_2(IplImage *cs)
{
string fhz = "\0";
uchar *pt_cs = (uchar *)cs->imageData;
uchar i = 0;
uchar max = 0;
uchar max_backup = 0;
uchar zf = 0;
for (i = 0; i < 24; i++)
{
IplImage *mb = cvLoadImage(mb_ku_zf[i], 1);
uchar cgl = 0;
int cg_count = 0;
int bd_count = 0;
uchar *pt_mb = (uchar *)mb->imageData;
const uchar step_cs = cs->widthStep;
const uchar step_mb = mb->widthStep;
for (int w = 0; w < cs->width; w++)
for (int h = 0; h < cs->height; h++)
{
if ((pt_cs[h*step_cs + w] == pt_mb[h*step_mb + w]))
cg_count++;
if (pt_mb[h*step_mb + w])
bd_count++;
}
cvReleaseImage(&mb);
cgl = (uchar)(((float)cg_count / (cs->height*cs->width)) * 100);
max = max < cgl ? cgl : max;
if (max != max_backup)
zf = i;
max_backup = max;
//printf("wz_2 i=%d,zf=%d,max=%d\n",(int)i,(int)zf,(int)max);
}
switch (zf)
{
case 0: fhz = "A"; break; case 1: fhz = "B"; break;
case 2: fhz = "C"; break; case 3: fhz = "D"; break; case 4: fhz = "E"; break; case 5: fhz = "F"; break;
case 6: fhz = "G"; break; case 7: fhz = "H"; break; case 8: fhz = "J"; break; case 9: fhz = "K"; break;
case 10: fhz = "L"; break; case 11: fhz = "M"; break; case 12: fhz = "N"; break; case 13: fhz = "P"; break;
case 14: fhz = "Q"; break; case 15: fhz = "R"; break; case 16: fhz = "S"; break; case 17: fhz = "T"; break;
case 18: fhz = "U"; break; case 19: fhz = "V"; break; case 20: fhz = "W"; break; case 21: fhz = "X"; break;
case 22: fhz = "Y"; break; case 23: fhz = "Z"; break;
}
return (fhz);
}
string db_successlv_4_7(IplImage *cs)
{
string fhz = "\0";
uchar *pt_cs = (uchar *)cs->imageData;
uchar i = 0;
uchar max = 0;
uchar max_backup = 0;
uchar zf = 0;
for (i = 0; i < 10; i++)
{
IplImage *mb = cvLoadImage(mb_ku_sz[i], 1);
uchar cgl = 0;
int cg_count = 0;
int bd_count = 0;
uchar *pt_mb = (uchar *)mb->imageData;
const uchar step_cs = cs->widthStep;
const uchar step_mb = mb->widthStep;
for (int w = 0; w < cs->width; w++)
for (int h = 0; h < cs->height; h++)
{
if ((pt_cs[h*step_cs + w] == pt_mb[h*step_mb + w]))
cg_count++;
if (pt_mb[h*step_mb + w])
bd_count++;
}
cvReleaseImage(&mb);
cgl = (uchar)(((float)cg_count / (cs->height*cs->width)) * 100);
max = max < cgl ? cgl : max;
if (max != max_backup)
zf = i;
max_backup = max;
}
switch (zf)
{
case 0: fhz = "0"; break; case 1: fhz = "1"; break; case 2: fhz = "2"; break; case 3: fhz = "3"; break;
case 4: fhz = "4"; break; case 5: fhz = "5"; break; case 6: fhz = "6"; break; case 7: fhz = "7"; break;
case 8: fhz = "8"; break; case 9: fhz = "9"; break;
}
return (fhz);
}
string shibie(char *imgpath)
{
IplImage *pSrcImage = cvLoadImage(imgpath, 1); //定位后车牌路径
IplImage *pGrayImage = NULL;
IplImage *pBinaryImage = NULL;
IplImage *ty_cpimg = NULL;
// 转为灰度图
pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 创建二值图
pBinaryImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 1);
//转为二值图,自适二值化CV_THRESH_OTSU
cvThreshold(pGrayImage, pBinaryImage, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
cvNamedWindow("input", 1);
cvShowImage("input", pBinaryImage);
//识别铆钉
const int height_md_yz = pBinaryImage->height / 10; //y轴方向的阈值
const int width_md_yz = pBinaryImage->width; //x轴方向的阈值
IplImage* cyp = cvCloneImage(pBinaryImage);
int width_md = 0;
int height_md = 0;
int count_bd = 0;
uchar *count_bd_str=new uchar(width_md_yz);
for (count_bd = 0; count_bd < width_md_yz; count_bd++)
count_bd_str[count_bd] = 0;
uchar *pt = (uchar *)cyp->imageData;
const uchar step = cyp->widthStep;
//扫描白点并记录
for (width_md = 0; width_md < width_md_yz; width_md++)
{
for (height_md = 0; height_md < height_md_yz; height_md++)
{
if (pt[height_md*step + width_md])
count_bd_str[width_md]++;
}
}
int width_bf = 0;
int width_ls = 0;
for (width_md = 0; width_md < width_md_yz; width_md++)
{
if (count_bd_str[width_md] > height_md_yz / 2)
if (width_md < width_md_yz - 1)
if (count_bd_str[++width_md] > height_md_yz / 2)
{
if (!width_bf)
{
if (width_md > width_md_yz*0.2)
width_bf = width_md;
}
else if (width_md - width_bf > width_md_yz / 3)
{
if (width_md > width_md_yz*0.6)
width_ls = width_md;
}
}
}
//如果判断是柳钉则使用柳钉计算比例定位
if (width_md_yz*0.4 < (width_ls - width_bf) && (width_ls - width_bf) < width_md_yz*0.6)
{
float img_bl = ((float)(width_ls - width_bf)) / 220;
int width_left_new = width_bf - (int)(img_bl * 78);
int width_right_new = width_ls + (int)(img_bl * 78);
if (width_left_new < 0)width_left_new = 0;
if (width_right_new > pBinaryImage->width)width_right_new = pBinaryImage->width;
int height_top_new = 0;
int height_down_new = pBinaryImage->height;
const uchar height_yz_x = pBinaryImage->height / 5;
uchar *count_bd_x_str=new uchar(height_yz_x);
for (count_bd = 0; count_bd < height_yz_x; count_bd++) //数组清零
count_bd_x_str[count_bd] = 0;
for (int height_ydw = 0; height_ydw < height_yz_x; height_ydw++)
{
for (width_md = 0; width_md < width_md_yz; width_md++)
{
if (pt[height_ydw*step + width_md])
count_bd_x_str[height_ydw]++;
}
}
for (int height_ydw = 0; height_ydw < height_yz_x; height_ydw++)
{
if (count_bd_x_str[height_ydw] < (int)(pBinaryImage->width * 25 / 100)) //切割条件->白点个数 阈值
height_top_new = height_ydw;
}
for (count_bd = 0; count_bd < height_yz_x; count_bd++)
count_bd_x_str[count_bd] = 0;
for (int height_ydw = 0; height_ydw < height_yz_x; height_ydw++)
{
for (width_md = 0; width_md < width_md_yz; width_md++)
{
if (pt[(pBinaryImage->height - height_ydw)*step + width_md])
count_bd_x_str[height_ydw]++;
}
}
for (int height_ydw = 0; height_ydw < height_yz_x; height_ydw++)
{
if (count_bd_x_str[height_ydw] < (int)(pBinaryImage->width * 25 / 100))
height_down_new = pBinaryImage->height - height_ydw;
}
IplImage* cyp_ptx = cvCloneImage(pBinaryImage);
CvRect ptx;
ptx.x = width_left_new;
ptx.y = height_top_new;
ptx.height = height_down_new - height_top_new;
ptx.width = width_right_new - width_left_new;
cvSetImageROI(cyp_ptx, ptx);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/cyp_ptx.jpg", cyp_ptx);
ty_cpimg = cvCloneImage(cyp_ptx);
cvResetImageROI(cyp_ptx);
}
//如果无法识别铆钉,那就先投影切割后按比例切割字符
else
{
int width_left_new_y = 0;
int width_right_new_y = pBinaryImage->width;
int height_top_new_y = 0;
int height_down_new_y = pBinaryImage->height;
const uchar height_yz_y = pBinaryImage->height / 5;
const uchar width_yz_y = pBinaryImage->width / 16; //阈值 请修改
uchar *width_bd_ptr_y=new uchar(width_yz_y);
uchar *height_bd_ptr_y=new uchar(height_yz_y);
for (count_bd = 0; count_bd < width_yz_y; count_bd++)
width_bd_ptr_y[count_bd] = 0;
for (count_bd = 0; count_bd < height_yz_y; count_bd++)
height_bd_ptr_y[count_bd] = 0;
for (int width_yd_y = 0; width_yd_y < width_yz_y; width_yd_y++)
for (int height_yd_y = 0; height_yd_y < pBinaryImage->height; height_yd_y++)
{
if (pt[height_yd_y*step + width_yd_y])
width_bd_ptr_y[width_yd_y]++;
}
for (int width_yd_y = 0; width_yd_y < width_yz_y; width_yd_y++)
{
if (width_bd_ptr_y[width_yd_y] < (int)(pBinaryImage->height * 2 / 10))
width_left_new_y = width_yd_y;
// int x = width_bd_ptr_y[width_yd_y];
}
for (count_bd = 0; count_bd < width_yz_y; count_bd++)
width_bd_ptr_y[count_bd] = 0;
for (int width_yd_y = 0; width_yd_y < width_yz_y; width_yd_y++)
for (int height_yd_y = 0; height_yd_y < pBinaryImage->height; height_yd_y++)
{
if (pt[height_yd_y*step + pBinaryImage->width - width_yd_y])
width_bd_ptr_y[width_yd_y]++;
}
for (int width_yd_y = 0; width_yd_y < width_yz_y; width_yd_y++)
{
if (width_bd_ptr_y[width_yd_y] < (int)(pBinaryImage->height * 2 / 10))
width_right_new_y = pBinaryImage->width - width_yd_y;
}
for (int height_yd_y = 0; height_yd_y < height_yz_y; height_yd_y++)
for (int width_yd_y = 0; width_yd_y < pBinaryImage->width; width_yd_y++)
{
if (pt[height_yd_y*step + width_yd_y])
height_bd_ptr_y[height_yd_y]++;
}
for (int height_yd_y = 0; height_yd_y < height_yz_y; height_yd_y++)
{
if (height_bd_ptr_y[height_yd_y] < (int)(pBinaryImage->width * 18 / 100))
height_top_new_y = height_yd_y;
}
for (count_bd = 0; count_bd < height_yz_y; count_bd++)
height_bd_ptr_y[count_bd] = 0;
for (int height_yd_y = 0; height_yd_y < height_yz_y; height_yd_y++)
for (int width_yd_y = 0; width_yd_y < pBinaryImage->width; width_yd_y++)
{
if (pt[(pBinaryImage->height - height_yd_y)*step + width_yd_y])
height_bd_ptr_y[height_yd_y]++;
}
for (int height_yd_y = 0; height_yd_y < height_yz_y; height_yd_y++)
{
if (height_bd_ptr_y[height_yd_y] < (int)(pBinaryImage->width * 18 / 100)) //上下切
height_down_new_y = pBinaryImage->height - height_yd_y;
}
IplImage* cyp_ptx = cvCloneImage(pBinaryImage);
CvRect ptx;
ptx.x = width_left_new_y;
ptx.y = height_top_new_y;
ptx.height = height_down_new_y - height_top_new_y;
ptx.width = width_right_new_y - width_left_new_y;
cvSetImageROI(cyp_ptx, ptx);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/cyp_ptx_y.jpg", cyp_ptx); //保存查看投影切割的结果
ty_cpimg = cvCloneImage(cyp_ptx);
cvResetImageROI(cyp_ptx);
}
//图片统一尺寸180x40 开始字符切割(字符切割使用的是最最简单的按比例切割,效果不是很理想,如果要高识别率,需要对字符进行上下左右的投影切割,然后再进行归一化,这样可以提高识别率)
IplImage *img_ty = NULL;
CvSize dst_cvsize;
dst_cvsize.height = 40;
dst_cvsize.width = 180;
img_ty = cvCreateImage(dst_cvsize, ty_cpimg->depth, ty_cpimg->nChannels);
cvResize(ty_cpimg, img_ty, CV_INTER_LINEAR); //二线性插值法会出现灰度
ty_cpimg = cvCloneImage(img_ty);
cvThreshold(ty_cpimg, img_ty, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //再次二值化
cvSaveImage("/home/panhao/QtProject/MyANPR/img/img_ty.jpg", img_ty);
dst_cvsize.height = 40;
dst_cvsize.width = 20;
IplImage *pic1 = cvCreateImage(dst_cvsize, img_ty->depth, img_ty->nChannels);
IplImage *pic2 = cvCreateImage(dst_cvsize, img_ty->depth, img_ty->nChannels);
IplImage *pic3 = cvCreateImage(dst_cvsize, img_ty->depth, img_ty->nChannels);
IplImage *pic4 = cvCreateImage(dst_cvsize, img_ty->depth, img_ty->nChannels);
IplImage *pic5 = cvCreateImage(dst_cvsize, img_ty->depth, img_ty->nChannels);
IplImage *pic6 = cvCreateImage(dst_cvsize, img_ty->depth, img_ty->nChannels);
IplImage *pic7 = cvCreateImage(dst_cvsize, img_ty->depth, img_ty->nChannels);
IplImage* copy_zf = NULL;
copy_zf = cvCloneImage(img_ty);
CvRect ptx;
ptx.x = 0;
ptx.y = 0;
ptx.height = 40;
ptx.width = 20;
cvSetImageROI(copy_zf, ptx);
cvCopy(copy_zf, pic1);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/copy_zf1.jpg", pic1); //注意绝对路径 出错请debug
pic1 = cvLoadImage("/home/panhao/QtProject/MyANPR/img/copy_zf1.jpg", 1); //注意 这两句必须要,否则后面结果就不对
copy_zf = cvCloneImage(img_ty);
ptx.x = 20 + 6;
ptx.y = 0;
ptx.height = 40;
ptx.width = 20;
cvSetImageROI(copy_zf, ptx);
cvCopy(copy_zf, pic2);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/copy_zf2.jpg", pic2);
pic2 = cvLoadImage("/home/panhao/QtProject/MyANPR/img/copy_zf2.jpg", 1);
copy_zf = cvCloneImage(img_ty);
ptx.x = 20 + 6 + 20 + 15;
ptx.y = 0;
ptx.height = 40;
ptx.width = 20;
cvSetImageROI(copy_zf, ptx);
cvCopy(copy_zf, pic3);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/copy_zf3.jpg", pic3);
pic3 = cvLoadImage("/home/panhao/QtProject/MyANPR/img/copy_zf3.jpg", 1);
copy_zf = cvCloneImage(img_ty);
ptx.x = 20 + 6 + 20 + 15 + 20 + 4;
ptx.y = 0;
ptx.height = 40;
ptx.width = 20;
cvSetImageROI(copy_zf, ptx);
cvCopy(copy_zf, pic4);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/copy_zf4.jpg", pic4);
pic4 = cvLoadImage("/home/panhao/QtProject/MyANPR/img/copy_zf4.jpg", 1);
copy_zf = cvCloneImage(img_ty);
ptx.x = 20 + 6 + 20 + 15 + 20 + 6 + 20 + 4;
ptx.y = 0;
ptx.height = 40;
ptx.width = 20;
cvSetImageROI(copy_zf, ptx);
cvCopy(copy_zf, pic5);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/copy_zf5.jpg", pic5);
pic5 = cvLoadImage("/home/panhao/QtProject/MyANPR/img/copy_zf5.jpg", 1);
copy_zf = cvCloneImage(img_ty);
ptx.x = 20 + 6 + 20 + 15 + 20 + 6 + 20 + 6 + 20 + 2;
ptx.y = 0;
ptx.height = 40;
ptx.width = 20;
cvSetImageROI(copy_zf, ptx);
cvCopy(copy_zf, pic6);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/copy_zf6.jpg", pic6);
pic6 = cvLoadImage("/home/panhao/QtProject/MyANPR/img/copy_zf6.jpg", 1);
copy_zf = cvCloneImage(img_ty);
ptx.x = 20 + 6 + 20 + 15 + 20 + 6 + 20 + 6 + 20 + 6 + 20 + 1;
ptx.y = 0;
ptx.height = 40;
ptx.width = 20;
cvSetImageROI(copy_zf, ptx);
cvCopy(copy_zf, pic7);
cvSaveImage("/home/panhao/QtProject/MyANPR/img/copy_zf7.jpg", pic7);
pic7 = cvLoadImage("/home/panhao/QtProject/MyANPR/img/copy_zf7.jpg", 1);
//字符识别(使用模版逐点比对式,相似点*100/总点数=成功率)
string wz_1 = db_successlv_1(pic1); //车牌第一个字符 以下以此类推 做返回值string中若有中文会有乱码
string wz_2 = db_successlv_2(pic2);
string wz_3 = db_successlv_3(pic3);
string wz_4 = db_successlv_3(pic4);
string wz_5 = db_successlv_4_7(pic5);
string wz_6 = db_successlv_4_7(pic6);
string wz_7 = db_successlv_4_7(pic7);
string finish = wz_1 + wz_2 + wz_3 + wz_4 + wz_5 + wz_6 + wz_7; //最后结果
//cout << "finish:"<<finish << endl;
//printf("endl\n");
cvReleaseImage(&pic1);
cvReleaseImage(&pic2);
cvReleaseImage(&pic3);
cvReleaseImage(&pic4);
cvReleaseImage(&pic5);
cvReleaseImage(&pic6);
cvReleaseImage(&pic7);
cvReleaseImage(©_zf);
cvReleaseImage(&img_ty);
cvReleaseImage(&ty_cpimg);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
cvReleaseImage(&pBinaryImage);
cvReleaseImage(&cyp);
return finish;
}
uchar* matToUchar(Mat image)
{
int image_size = image.cols * image.rows;
unsigned char* imageData = new unsigned char[image_size];
int a = 0;
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
imageData[a] = image.at<uchar>(i, j);
a++;
}
}
return imageData;
}
void main()
{
//类VideoCapture实例化再初始化
//VideoCapture capture;
//capture.open("Megamind.avi");
//类VideoCapture实例化的同时初始化
VideoCapture capture("E:\\BaiduNetdiskDownload\\徐平江毕设资料2\\视频去模糊处理\\x64\\Debug\\独山-G105国道-独山路口方向.avi");
if (!capture.isOpened())
{
return;
}
int frameRate = 29; //帧数截取间隔(每隔100帧截取一帧)
int imgIndex = 0;
for (;;)
{
Mat frame;
capture >> frame;
if (frame.empty())
{
break;
}
shibie((char*)matToUchar(frame));
}
cout << "total frames: " << imgIndex << endl;
}
04-01