基于opencv2.0的车牌检测与字符分割的代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;//存储车牌灰度图像
vector
vector
{
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