//视频分帧
#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;
}