//视频分帧
#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_OTSUcvThreshold(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);                        //注意绝对路径 出错请debugpic1 = 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(&copy_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;
}

opencv视频模糊处理相关推荐

  1. opencv视频处理和检测学习总结

    基于opencv的视频处理--基础数据结构 在一个封装的还算比较好的库中,一般都不会直接采用那些基本的数据结构像char, int 之类,一是 不具有可读性,二是不方便修改移植.通常是通过typede ...

  2. OpenCV视频加速Video acceleration的实例(附完整代码)

    OpenCV视频加速Video acceleration的实例 OpenCV视频加速Video acceleration的实例 OpenCV视频加速Video acceleration的实例 #inc ...

  3. OpenCV视频中的人脸标志检测

    OpenCV视频中的人脸标志检测 视频中的人脸标志检测 简介 命令参数说明 源代码 视频中的人脸标志检测 简介 此应用程序使您可以检测视频中检测到的面部的地标.此应用程序首先检测当前视频帧中的面部,然 ...

  4. 电脑字体模糊_小红书上传视频模糊?做小红书视频99%的工具都在这了

    到现在小红书视频号功能已经上线快三个月了,越来越多的小伙伴开始拍视频.创作视频笔记,但是对于新接触视频的小伙伴来说,拍摄视频好像是一件很难的事,特别是不清楚该选择什么拍摄设备.不知道怎么剪辑视频,还有 ...

  5. android 录制视频模糊,安卓手机录制视频不清晰是什么原因?_科技数码通

    你好,很高兴回答你的问题!安卓手机录制视频不清晰的问题是多方面的,可以从以下角度进行检查: 一.手机的像素配置低 其实以现在主流的手机来讲,录制视频并不应该会不清晰,如果存在不清晰的情况,大概就是手机 ...

  6. C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-夏曹俊-专题视频课程...

    C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-11788人已学习 课程介绍         C++编程FFMpeg实时美颜直播推流实战视频培训教程,本课程 ...

  7. openCV视频操作(C++版本)

    openCV视频操作(C++版本) VideoCapture类详解 opencv的视频操作主要用到 VideoCapture类,有三个构造函数: VideoCapture::VideoCapture( ...

  8. opencv检测图片失焦 python_如何在Python中使用OpenCV执行模糊检测

    如何在Python中使用OpenCV执行模糊检测 目标检测 最后更新 2020-10-12 14:23 阅读 154 最后更新 2020-10-12 14:23 阅读 154 目标检测 ##FlyAI ...

  9. Python OpenCV 图片模糊操作 blur 与 medianBlur

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 函数原型介绍 均值模糊 中值模糊 2D 卷积(图像滤波),自定义模糊 橡皮擦的小 ...

最新文章

  1. JVM Client Server启动设置
  2. NameError: name 'go' is not defined
  3. python walk_Python os.walk()方法
  4. 文巾解题 1765. 地图中的最高点
  5. Dreanmwear能做php模板吗,PHPword模板的使用
  6. C# DES加密/解密类
  7. Auto CAD线性不显示的解决办法
  8. 应届生求职前端工程师岗位,该如何准备?
  9. NOIP 2015 d1t2 信息传递
  10. 网站日志分析(二)——利用Quick BI制作企业化报表分析
  11. 脱单攻略 | 如何找到心仪的另一半?
  12. 如何发现异常商业数据?达摩院用这套算法
  13. 个人对粗糙集的一些理解和简单举例
  14. iconv命令utf-8文件转为gbk文件
  15. 登录时动态验证码的使用
  16. 百年孤独——雪融化的时刻之达人论战
  17. 信号完整性(SIPI)学习--21--串扰
  18. 什么是BI ?BI 能给企业带来什么价值?
  19. elastic search 日志不打印问题(root用户惹的祸)
  20. python 完全面向对象_python面向对象实战

热门文章

  1. 正尝试安装的adobe flash player不是最新版本
  2. QTP的那些事--学习QTP必备的网站整理
  3. 三方会谈进行时,Uber旧金山无人车已被叫停
  4. Django-缓存、信号
  5. PHP各个组件或工具的安装与使用
  6. dom解析和生成XML文件
  7. 如何获得阿里技术offer:从《阿里DBA面试题》体味阿里社会招聘
  8. Oracle JDBC版本区别(转)
  9. Android学习笔记-Service
  10. 200多个js技巧代码(4)