基于opencv2.0的车牌检测与字符分割的代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本程序主要实现的是车牌的定位与检测

主要是利用申继龙论文里面的方法

1、采集得到的图像

2、把RGB图像转换成HSI彩色图像

3、利用设定的H、S阈值得到二值图像

4、对二值图像水平投影获得候选区域

5、对候选区域的HSI图像边缘检测

*/

#include "stdafx.h"

#include "opencv2/opencv.hpp"

#include "opencv2/objdetect/objdetect.hpp"

#include "opencv2/features2d/features2d.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/calib3d/calib3d.hpp"

#include "opencv2/nonfree/nonfree.hpp"

#include "opencv2/nonfree/features2d.hpp"

#include "opencv2/imgproc/imgproc_c.h"

#include "opencv2/legacy/legacy.hpp"

#include "opencv2/legacy/compat.hpp"

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

using namespace cv;

#define pi 3.14159265

IplImage* srcImage=NULL;//存储原图片

IplImage*srcImage1=NULL;//存储原始图片的副本

IplImage* HSI=NULL;

static IplImage* grayImage=NULL;//存储原图片灰度图

static double posdouble=0.0;

IplImage* channelOneImage=NULL;

IplImage* channelTwoImage=NULL;

IplImage* channelThreeImage=NULL;

IplImage* plateImage=NULL;//存储车牌图像

IplImage* grayPlateImage=NULL;//存储车牌灰度图像

vectorcharacterImageList;//存储7个车牌字符图像的容器vectorxList;//存储7个车牌字符的起始和结束位置

vector>keyPointsList;//存储车牌字符特征点的集合vectordescriptorsMatList;//存储每一个车牌字符的特征点描述子矩阵vector> contours;//用来存储经过闭开操作处理后的车牌轮廓double GetH(int r,int g,int b)

{

double H=0;//H分量

double fenZi=1/2.0*((r-g)+(r-b));

double sq=pow(double(r-b),2)+(r-b)*(g-b);

double fenMu=sqrt(sq);

H=acos(fenZi/fenMu)*180/pi;

if(b>g)

{

H=360-H;

}

return H;

}

double GetS(int r,int g,int b)

{

double s=0;//S分量

int min=r;

if(g

{

min=g;

if(b

{

min=b;

}

}

else

{

if(b

{

min=b;

}

}

s=1-3.0*min/((r+g+b)*1.0);

return s;

}

double GetI(int r,int g,int b)

{

double i=0.0;

i=1/3.0*(r+g+b);

i=i/255.0;

return i;

}

//通过公式来直接求H的值然后对H分量进行处理

void doHByMath(IplImage* eleImage)

{

int width=eleImage->width;

int height=eleImage->height;

for(int col=0;col

{

uchar* ptr=(uchar*)(eleImage->imageData+col*eleImage->widthStep);//

uchar* ptrGray=(uchar*)(grayImage->imageData+col*grayImage->widthStep);//

for(int row=0;row

{

int b=ptr[3*row];

int g=ptr[3*row+1];

int r=ptr[3*row+2];

double H=GetH(r,g,b);

double S=GetS(r,g,b);

double I=GetI(r,g,b);

if(H>=190&&H<=255&&S>0.3)

{

ptrGray[row]=255;

}

else

{

ptrGray[row]=0;

}

if(I<0.25&&S<0.4)

{

ptrGray[row]=0;

}

}

}

cvShowImage("H分量处理后的图像",grayImage);

//考虑H分量处理后就提取尽量多的有用的区域

vector>contours;

相关文档
最新文档