【OpenCV】CvSVM分类器进行车牌识别(C++)

资源下载地址:http://download.csdn.net/detail/taily_duan/9633850

// SVM_Train.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <iostream>
#include <cstdlib>
#include <io.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cvaux.h>
#include <windows.h>
#include <vector>


#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;


void getFiles( string path, vector<string>& files )
{
	//文件句柄
	long   hFile   =   0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)
	{
		do
		{
			//如果是目录,迭代之
			//如果不是,加入列表
			if((fileinfo.attrib &  _A_SUBDIR))
			{
				if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)
					getFiles( p.assign(path).append("\\").append(fileinfo.name), files );
			}
			else
			{
				files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
			}
		}while(_findnext(hFile, &fileinfo)  == 0);
		_findclose(hFile);
	}
}

void getPlate(Mat& trainingImages, vector<int>& trainingLabels)
{

	char * filePath = "..\\data\\HasPlate";
	vector<string> files;

	获取该路径下的所有文件
	getFiles(filePath, files );

	int size = files.size();
	if (0 == size)
		cout << "No File Found in train HasPlate!" << endl;

	for (int i = 0;i < size;i++)
	{
		cout << files[i].c_str() << endl;
		Mat img = imread(files[i].c_str());
		//img= img.reshape(1, 1);
		img= img.reshape(1, 1);
		trainingImages.push_back(img);
		trainingLabels.push_back(1);//打上标签1
	}
}

void getNoPlate(Mat& trainingImages, vector<int>& trainingLabels)
{

	char * filePath = "..\\data\\NoPlate";
	vector<string> files;

	获取该路径下的所有文件
	getFiles(filePath, files );
	int size = files.size();
	if (0 == size)
		cout << "No File Found in train NoPlate!" << endl;

	for (int i = 0;i < size;i++)
	{
		cout << files[i].c_str() << endl;
		Mat img = imread(files[i].c_str());
		//img= img.reshape(1, 1);
		img= img.reshape(1, 1);
		trainingImages.push_back(img);
		trainingLabels.push_back(0);//打上标签0
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	double start1 = GetTickCount();
	Mat classes;//(numPlates+numNoPlates, 1, CV_32FC1),车牌与非车牌标签集合;
	Mat trainingData;//(numPlates+numNoPlates, imageWidth*imageHeight, CV_32FC1 );两种训练合并起来的集合

	Mat trainingImages;
	vector<int> trainingLabels;

	getPlate(trainingImages, trainingLabels);
	getNoPlate(trainingImages, trainingLabels);

	Mat(trainingImages).copyTo(trainingData);
	trainingData.convertTo(trainingData, CV_32FC1);
	Mat(trainingLabels).copyTo(classes);

	//参数设置
	CvSVMParams SVM_params;
	SVM_params.svm_type = CvSVM::C_SVC;//2分类器
	SVM_params.kernel_type = CvSVM::LINEAR; //CvSVM::LINEAR;
	SVM_params.degree = 0;
	SVM_params.gamma = 1;
	SVM_params.coef0 = 0;
	SVM_params.C = 1;
	SVM_params.nu = 0;
	SVM_params.p = 0;
	SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);//迭代1000,CV_TERMCRIT_ITER:精度小于0.01算法停止
	//Train SVM

	cout << "Begin to generate svm" << endl;
	CvSVM svmClassifier(trainingData, classes, Mat(), Mat(), SVM_params);

	cout << "Svm generate done!" << endl;

	FileStorage fsTo("..\\out\\svm.xml", cv::FileStorage::WRITE);//训练数据存档
	svmClassifier.write(*fsTo, "svm");
	double end1 = GetTickCount();
	cout << "训练时间时间:" << (end1 - start1) / 1000 << "s" << endl;

	int a;
	cin >> a;

	return 0;
}


使用VC++6.0做开发工具, 采用简单的SDI框架结构 ,一次处理一幅位图(有兴趣的可以作成MDI) 1)位图信息的数据是从左下往右下为一行,一行一行往上排的。 2)每行像素应该是4的倍数,不足的地方用空点补齐,读的时候注意跳过冗余点。 3)主要数据都存在Doc里面,BMP的主要数据存在一个由ImgData指向的BYTE型的内存空间(根据位图的大小,动态分配的)。 4)数据读进来以后,注 意向内存中贴图,以保证刷新的效率。 5)程序执行流程 应用程序生成--》打开--》CDipView的OnFileOpen 函数--》 调用CDipDoc的FileOpen 函数--》并使用myDoc->UpdateAllViews(NULL); 刷新 自动调用CDipView的OnPaint函数--》调用CDipView的OnDraw函数----一个像素点一个像素点的画 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 比较重要的地方 读BMP文件,只能打开256色 (可以是灰度) 显示和内存贴图技术 关于调色板: 调色板实际上是一个数组,4个BYTE 分别是 B,G,R,和 Reserved 每一个像素点都有一个相应的数组。 关于VC和windows 的绘图机制: 使用GDI(图形设备接口)对象,通常使用CDC 类,CPaintDC也一样(device-context)设备上下文 windows下的MFC编程机制,消息驱动,事件等待! 全局的app(应用程序对象) 注意 手工分配内存的清除 和CDC对象的删除 以释放系统的GDI资源 每一个new操作符都要对应一个delete 虽然已经弄出来了,还是希望大家好好读读源程序。 你们以后的工作: 在菜单中添加菜单项,通过ClassWizzard 生成消息响应函数(当然也可手动添加), 所有的操作应当是对 BYTE* ImgData;进行的。 在完成相应的功能后 将 isnewfile 和 isnewiamge 置为真 ,并使用myDoc->UpdateAllViews(NULL); 刷新 当然,可以更加有个性化一点,有能力的同学可以自己完成。 随着课程的进行,菜单功能逐渐丰富,最后完成基本的数字图像处理的功能,而不必最后一下完成一个大的作业。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值