二值化圖像
[cpp] view plain copy
void CMyDialog::Threshold(IplImage *Image, IplImage *Image_O) ?
{ ?
????int thresMax=0,thresMin=255,i=0,j=0,t=0; ?
????//循環得到圖片的最大灰度值和最小灰度值 ?
????for(j=0;j
????????for(i=0;i
????????{ ?
????????????if(CV_IMAGE_ELEM(Image,uchar,j,i)>thresMax) ??
????????????????thresMax=CV_IMAGE_ELEM(Image,uchar,j,i); ?
????????????else if(CV_IMAGE_ELEM(Image,uchar,j,i)
????????} ?
??
????//小閾值用來控制邊緣連接 ?大閾值用來控制強邊緣的初始化分割 ?
????cvCanny(Image,Image_O,AdaptiveThreshold((thresMax+thresMin)*0.5,Image),thresMax*0.7,3); ?
??
} ?
車牌定位
[cpp] view plain copy
int CMyDialog::PlateAreaSearch(IplImage *pImg_Image) ?
{ ?
????// 檢測是否有值 ?
????if (pImg_Image==NULL) ????
????{ ??
????????return 0; ????
????} ?
??????
????IplImage* imgTest =0; ??
????int i=0, j=0,k=0,m=0; ?
????bool flag=0; ?
????int plate_n=0; ?//上邊界 ?
????int plate_s=0; ?//下邊界 ?
????int plate_e=0; ?//右邊界 ?
????int plate_w=0; ?//左邊界 ?
??????????
????int *num_h=new int[MAX(pImg_Image->width,pImg_Image->height)]; ??????
????if ( num_h==NULL ) ???
????{ ?
????????MessageBox("memory exhausted!"); ?
????????return 0; ????
????} ??
??
????//初始化分配的空間 ?
????for(i=0;i
????{ ?
????????num_h[i]=0; ?
????} ???
??
????imgTest = cvCreateImage(cvSize(pImg_Image->width,pImg_Image->height),IPL_DEPTH_8U,1); ?
????cvCopy(pImg_Image, imgTest); ??
??
????//--水平輪廓細化 ?
????for(j=0; j
????{ ?
????????for(i=0;i
???????{ ?
????????????CV_IMAGE_ELEM(imgTest,uchar,j,i)=CV_IMAGE_ELEM(imgTest,uchar,j,i+1)-CV_IMAGE_ELEM(imgTest,uchar,j,i); ?
????????????//記錄每一行的像素值 ?
????????????num_h[j]+=CV_IMAGE_ELEM(imgTest,uchar,j,i)/250; ???????
???????} ?????????
????} ??
???
????int temp_1 = 0; ?//統計20行中最大的每行數據量 ?
????int temp_max = 0; ?//20行最大的數據量 ??
????int temp_i = 0; ?//最大數據量的行 ?
??
????for(j=0; j
????{ ?
??????temp_1=0; ?
??????for(i=0;i<20;i++) ???
????????temp_1 += ?num_h[i+j]; ?
??????if(temp_1>=temp_max) ?
??????{ ?
??????????temp_max=temp_1; ?
??????????temp_i = j; ?
??????} ?
????} ?
??
????//找出上行邊界行 ?
????k=temp_i; ?
????while ( ((num_h[k +1]>POINT_X )||(num_h[k +2]>POINT_X )||(num_h[k]>POINT_X )) && k ) k--; ?
????plate_n=k+1; ??
??
????//找出下邊界行 ?
????k=temp_i+10; ?
????while (((num_h[k -1]>POINT_X )||(num_h[k-2]>POINT_X )||(num_h[k]>POINT_X ))&&(k
????plate_s=k; ?
??
????//沒找到水平分割線,設置為默認值 ?
????if ( !(plate_n && plate_s ?
????????&& (plate_n
????{ ?
????????MessageBox("水平分割失敗!"); ?
????????return 0; ?
????} ?
????//找到水平線 ??
????else ??
????{ ?
????????int ?max_count = 0; ?
????????int ?plate_length = (imgTest->width-(plate_s-plate_n)*HIGH_WITH_CAR); ?
????????plate_w=imgTest->width*WITH_X-1;//車牌寬度 默認 ?
??????
????????//--垂直方向 輪廓細化 ?
????????for(i=0;i
????????????for(j=0;j
???????????{ ?
????????????????CV_IMAGE_ELEM(imgTest,uchar,j,i)=CV_IMAGE_ELEM(imgTest,uchar,j+1,i)-CV_IMAGE_ELEM(imgTest,uchar,j,i); ?
???????????} ?
??
????????for(k=0;k
????????????for(i=0; i<(int)((plate_s-plate_n)*HIGH_WITH_CAR); i++) ?
????????????????for (j=plate_n;j
????????????????????num_h[k] =num_h[k]+ CV_IMAGE_ELEM(imgTest,uchar,j,(i+k))/250; ?
????????????????} ?
????????????if (num_h[k]>max_count) ?
????????????{ ?
????????????????max_count = num_h[k]; ?
????????????????plate_w = k; ?
????????????} ?
??????????
????????} ?
????????????
??
????????CvRect ROI_rect; ????????????????//獲得圖片感興趣區域 ?
????????ROI_rect.x=plate_w; ?
????????ROI_rect.y=plate_n; ?
????????ROI_rect.width=(plate_s-plate_n)*HIGH_WITH_CAR; ?
????????ROI_rect.height=plate_s-plate_n; ?
????????????????
????????if ((ROI_rect.width+ROI_rect.x)> pImg_Image->width) ?
????????{ ?
????????????ROI_rect.width=pImg_Image->width-ROI_rect.x; ????
????????????MessageBox("垂直方向分割失敗!"); ?
????????????return 0; ?
????????} ?
??
????????else ?
????????{ ?
????????????IplImage *pImg8uROI=NULL; ????????//感興趣的圖片 ???
????????????pImg8uROI=cvCreateImage(cvSize(ROI_rect.width,ROI_rect.height), src->depth,src->nChannels); ?
???????????????
????????????IplImage *pImg8u11=NULL; ???????//車牌區域灰度圖 ?
????????????pImg8u11=cvCreateImage(cvSize(40*HIGH_WITH_CAR,40),pImg8uROI->depth,pImg8uROI->nChannels); ?
??
????????????cvSetImageROI(src,ROI_rect); ?
????????????cvCopy(src,pImg8uROI,NULL); ?
????????????cvResetImageROI(src); ?
?????
????????????pImgResize=cvCreateImage(cvSize(40*HIGH_WITH_CAR,40),IPL_DEPTH_8U,1); ????
????????????cvResize(pImg8uROI,pImg8u11,CV_INTER_LINEAR); //線性插值 ?
??
????????????cvCvtColor(pImg8u11,pImgResize,CV_RGB2GRAY); ?
????????????Threshold(pImgResize,pImgResize); ?
??????????????
????????????cvReleaseImage(&pImg8uROI); ?
????????????cvReleaseImage(&pImg8u11); ?
????????????cvReleaseImage(&imgTest); ?
????????} ??
????} ??
???????????
????// 釋放內存 ?
????delete []num_h; ???
????num_h=NULL; ???
????return 1; ?
} ?
?
評論