车牌识别(包括车牌检测,车牌跟踪,车牌识别)源代码下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
车牌识别(包括车牌检测,车牌跟踪,车牌识别)源代码下载:
本程序开发环境:vc6.0 opencv1.0
整体功能:是为了实现车牌自动跟踪,检测,并拍照,定位,识别,但是跟踪和拍照等于没有实现。
实现功能: 能实现视频中物体跟踪,但必须是手动圈住才行,摄像头是usb摄像头.
打开车牌图片,能进行定位,车牌分割,字符分割,字符识别。
操作步骤:程序主界面:有打开摄像头,关闭摄像头,截取图片,车牌识别
打开摄像头,可以看到视频中画面,移动鼠标圈住物体,可以自动跟踪。
截取图片,在打开设摄像头的情况下,可以截取并保存一张图片。
关闭摄像头,不用摄像头时,需先关闭摄像头,不然执行其他的会有错误。
车牌识别,弹出程序子界面。
在程序子界面里: 依次又打开图片,图像二值化,车牌定位,字符分割,字符识别按钮。
按钮点击顺序是:打开图片,图像二值化,车牌定位,字符分割,字符识别。
操作完就可以看到结果。只要图片大小合适(不能太大),一般都能较准确的结果。车牌定位识别那块有详细注释。
部分代码如下:
void COpencvCarDlg::OnOpencamera()
{
// TODO: Add your control notification handler code here
IplImage* frame = 0;
IplImage* framecopy = 0;
capture = cvCaptureFromCAM(-1);
if(!capture)
{
MessageBox("摄像头读取错误...",NULL,MB_ICONEXCLAMATION | MB_ICONWARNING | MB_OK);
cvWaitKey(0);
}
cvNamedWindow( "CamShift", 1 );
cvSetMouseCallback("CamShift", on_mouse,NULL);
for(;;)//进入视频帧处理主循环
{
int i, bin_w, c;
framecopy = cvQueryFrame( capture );
if( !framecopy )
break;
if(!frame)
frame = cvCreateImage(cvSize(framecopy->width,framecopy->height),framecopy->depth,framecopy->nChannels);
imageSave = cvCreateImage(cvSize(framecopy->width,framecopy->height),framecopy->depth,framecopy->nChannels);
cvCopy(framecopy,imageSave,0);
if(framecopy->origin==IPL_ORIGIN_TL)
cvCopy(framecopy,frame,0);
else cvFlip(framecopy,frame,0);
if( !image )//刚开始先建立一些缓冲区
{
image = cvCreateImage( cvGetSize(frame), 8, 3 );//
image->origin = frame->origin;
hsv = cvCreateImage( cvGetSize(frame), 8, 3 );
hue = cvCreateImage( cvGetSize(frame), 8, 1 );
mask = cvCreateImage( cvGetSize(frame), 8, 1 );//分配掩膜图像空间
backproject = cvCreateImage( cvGetSize(frame), 8
, 1 );//分配反向投影图空间,大小一样,单通道
hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 ); //分配建立直方图空间
histimg = cvCreateImage( cvSize(320,200), 8, 3 );//分配用于画直方图的空间
cvZero( histimg );//背景为黑色
}
cvCopy( frame, image, 0 );
cvCvtColor( image, hsv, CV_BGR2HSV ); // 把图像从RGB表色系转为HSV表色系
if( track_object )// 如果当前有需要跟踪的物体
{
int _vmin = vmin, _vmax = vmax;
cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),cvScalar(180,256,MAX(_vmin,_vmax),0), mask ); //制作掩膜板,只处理像素值为H:0~180,S:smin~256,V:vmin~vmax之间的部分
cvSplit( hsv, hue, 0, 0, 0 ); // 取得H分量
if( track_object < 0 )//如果需要跟踪的物体还没有进行属性提取,则进行选取框类的图像属性提取
{
float max_val = 0.f;
cvSetImageROI( hue, selection ); // 设置原选择框
cvSetImageROI( mask, selection ); // 设置Mask的选择框
cvCalcHist( &hue, hist, 0, mask ); // 得到选择框内且满足掩膜板内的直方图
cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 ); // 对直方图转为0~255
cvResetImageROI( hue ); // remove ROI
cvResetImageROI( mask );
track_window = selection;
track_object = 1;
cvZero( histimg );
bin_w = histimg->width / hdims;
for( i = 0; i < hdims; i++ )
{
int val = cvRound(
cvGetReal1D(hist->bins,i)*histimg->height/255 );
CvScalar color = hsv2rgb(i*180.f/hdims);
cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),
cvPoint((i+1)*bin_w,histimg->height - val),color, -1, 8, 0 );//画直方图到图像空间
}
}
cvCalcBackProject( &hue, backproject, hist ); // 得到hue的反向投影图
cvAnd( backproject, mask, backproject, 0 );//得到反向投影图mask内的内容
cvCamShift( backproject, track_window,cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),&track_comp, &track_box );//使用MeanShift算法对backproject中的内容进行搜索,返回跟踪结果
track_window = track_comp.rect;//得到跟踪结果的矩形框
if( backproject_mode )
cvCvtColor( backproject, image, CV_GRAY2BGR ); // 显示模式
if( image->origin )
track_box.angle = -track_box.angle;
cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );//画出跟踪结果的位置
}
if( select_object && selection.width > 0 && selection.height > 0 )//如果正处于物体选择,画出选择框
{
cvSetImageROI( image, selection );
cvXorS( image, cvScalarAll(255), image, 0 );
cvResetImageROI( image );
}
c = cvWaitKey(10);
cvShowImage( "CamShift", image );
DrawPicToHDC(image, IDC_SHOWVIDEO);
}
}