基本信息
源码名称:基于颜色车牌检测(opencv)
源码大小:4.53KB
文件格式:.rar
开发语言:C/C++
更新时间:2016-08-29
   源码介绍


int main()
{
    IplImage *imgSrc=cvLoadImage("C:\\carimage\\car.jpg");
    IplImage *imgH,*imgS,*imgV,*imgHSV,*imgGray;
    imgHSV=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,3);
    imgH=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
    imgS=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
    imgV=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
    cvCvtColor(imgSrc,imgHSV,CV_BGR2HSV);
    cvSplit(imgHSV,imgH,imgS,imgV,0);
    cvInRangeS(imgH,cvScalar(94,0,0,0),cvScalar(115,0,0,0),imgH);
    cvInRangeS(imgS,cvScalar(90,0,0,0),cvScalar(255,0,0,0),imgS);
    cvInRangeS(imgV,cvScalar(36,0,0,0),cvScalar(255,0,0,0),imgV);
    IplImage *imgTemp,*imgHsvBinnary;
    imgTemp=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
    imgHsvBinnary=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
    cvAnd(imgH,imgS,imgTemp);
    cvAnd(imgTemp,imgV,imgHsvBinnary);
    //形态学去噪
    //定义结构元素
    IplConvKernel *element=0;
    int values[2]={255,255};
    int rows=2,cols=1,anchor_x=0,anchor_y=1;
    element = cvCreateStructuringElementEx(cols,rows,anchor_x,anchor_y,CV_SHAPE_CUSTOM,values);
    //膨胀腐蚀
    cvDilate(imgHsvBinnary,imgHsvBinnary,element,1);
    cvErode(imgHsvBinnary,imgHsvBinnary,element,1);
    cvNamedWindow("imgh1");
    cvShowImage("imgh1",imgHsvBinnary);
    imgGray=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
    cvCvtColor(imgSrc,imgGray,CV_RGB2GRAY);
    IplImage *imgRgbBinnary;
    imgRgbBinnary=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
    int Thresold=myOtsu(imgGray);//求阈值
    cvThreshold(imgGray,imgRgbBinnary,Thresold,255,CV_THRESH_OTSU);
    cvNamedWindow("imgh2");
    cvShowImage("imgh2",imgRgbBinnary);

    //车牌定位
    //行定位
    int hop_num=10;//字符连续跳变次数的阈值
    int num=0;//计算跳变的次数
    int begin=0;//跳变是否开始
    int mark_Row[2]={0},k=0;//标记车牌的开始行与结束行
    for(int i=imgSrc->height-1;i>=0;i--)
    {
        num=0;
        for(int j=0;j<imgSrc->width-1;j )
        {
            if(cvGet2D(imgHsvBinnary,i,j).val[0]!=cvGet2D(imgHsvBinnary,i,j 1).val[0])
               {
                    num ;
               }
        }
        if(num>hop_num)
            {
                mark_Row[k]=i;
                k ;
                if(k>1)
                    k=1;
             }
    }
    std::cout <<"mark=  " <<  mark_Row[0] << "    " << mark_Row[1];
    cvLine(imgSrc,cvPoint(0,mark_Row[0]),cvPoint(imgSrc->width,mark_Row[0]),CV_RGB(255,255,0));
    cvLine(imgSrc,cvPoint(0,mark_Row[1]),cvPoint(imgSrc->width,mark_Row[1]),CV_RGB(255,255,0));
    //列定位
    int mark_col[2]={0},num_col=0,k_col=0;
    int a[100]={0},Thresold_col=10;
    for(int j=0;j<imgSrc->width;j )
    {
        num_col=0;
        for(int i=mark_Row[1];i<mark_Row[0];i )
            if(cvGet2D(imgHsvBinnary,i,j).val[0]>0)
                num_col ;
                if(num_col>Thresold_col)
                {
                    mark_col[k_col]=j;
                    k_col ;
                    if(k_col>1)
                        k_col=1;
                }
    }
    int i=0;
    cvLine(imgSrc,cvPoint(mark_col[0],0),cvPoint(mark_col[0],imgSrc->height),CV_RGB(255,0,0));
    cvLine(imgSrc,cvPoint(mark_col[1],0),cvPoint(mark_col[1],imgSrc->height),CV_RGB(255,0,0));
    IplImage *imgLicense;
    int license_Width=(mark_col[1]-mark_col[0])/4*4;
    int license_Height =mark_Row[0]-mark_Row[1];

    cvSetImageROI(imgSrc,cvRect(mark_col[0],mark_Row[1],license_Width,license_Height));
    imgLicense=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,imgSrc->nChannels);
    cvCopy(imgSrc,imgLicense,0);
    cvResetImageROI(imgSrc);
    cvNamedWindow("license");
    cvShowImage("license",imgLicense);
    cvNamedWindow("src");
    cvShowImage("src",imgSrc);
    cvWaitKey(0);
    return 0;
}