基于SVM+HOG的花生品种识别

早在大二时,导师做过一个花生品种识别的程序,但当时用于品种识别的特征是自定义特征;而我的当初的本科毕业设计则是基于SVM + HOG的人脸识别;在后来的工作学习中,又用到了HOG特征,想着是不是之前的花生品种的识别也能用Hog特征进行识别;正所谓学以致用,也能巩固下刚刚所学的知识;

所谓的Hog特征与SVM网上资料一大堆,而且讲解得非常详细,在这里不在做过多的讲解;

本程序的开发环境,主要是依赖于VS2013 + OpenCV2.4.9,开发环境,请自行配置,那么,下面贴出代码,不足之处,请各位大侠不吝批评指正:

特征提取功能的实现:

	CvMat* dataMat = NULL;
	Book* book = xlCreateBook();
	Sheet* sheet = book->addSheet("Sheet1");

	for (int j = 1; j <= 13; ++ j)
	{
		CString strLoadPath = "SubImage\\";
		CString strFile;
		strFile.Format("s%d", j);
		strLoadPath = strLoadPath + strFile + "\\";

		for (int i = 1; i <= 45; ++i)
		{
			CString loadPath = strLoadPath;
			CString stri;
			stri.Format("%d.jpg", i);
			loadPath = loadPath + stri;

			IplImage* srcImage = cvLoadImage(loadPath);
			IplImage* grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
			IplImage* hogImage = cvCreateImage(cvSize(96, 64), IPL_DEPTH_8U, 1);		//用于提取Hog特征的图像

			cvCvtColor(srcImage, grayImage, CV_RGB2GRAY);

			cvResize(grayImage, hogImage, CV_INTER_LINEAR);   //线性插值

			std::vector<float> vfDescriptors;
			//vfDescriptors.resize(hogImage->width * hogImage->height);
			cv::Ptr<cv::HOGDescriptor> hog = new cv::HOGDescriptor(cvSize(hogImage->width, hogImage->height), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);
			hog->compute(hogImage, vfDescriptors, cv::Size(1, 1), cv::Size(0, 0));		//使用计算函数进行计算

			//CvMat* mat = cvCreateMat(45 * 13, vfDescriptors.size(), CV_32FC1);
			//cvZero(mat);

			int cols = 0;

			for (auto it = vfDescriptors.begin(); it != vfDescriptors.end(); ++it)
			{
				if (sheet)
				{
					sheet->writeNum(45 * (j-1) + (i - 1), cols++, *it);    //把Hog数据存储到Excel 中
				}
			}

			//释放内存
			cvReleaseImage(&srcImage);
			srcImage = NULL;
			cvReleaseImage(&grayImage);
			grayImage = NULL;
			cvReleaseImage(&hogImage);
			hogImage = NULL;

		}// 内层 for 循环

	}

	book->save("Hog.xls");
	book->release();

SVM训练的实现代码:

Book* book = xlCreateBook();

	if (book->load("Hog.xls"))
	{
		Sheet* sheet = book->getSheet(0);

		if (sheet)
		{

			CvMat* dataMat = cvCreateMat(sheet->lastRow(), sheet->lastCol(), CV_32FC1);		//存储导入的数据

			for (int i = 0; i < sheet->lastRow(); ++ i)
			{
				for (int j = 0; j < sheet->lastCol(); ++ j)
				{
					double temp = sheet->readNum(i, j);
					cvSetReal2D(dataMat, i, j, temp);
				}
			}

			MessageBox("数据导入完成");

			CvMat* lableMat = cvCreateMat(sheet->lastRow(), 1, CV_32FC1);
			cvZero(lableMat);

			for (int i = 0; i < 13; ++ i)
			{
				for (int j = 0; j < 45; ++ j)
				{
					cvSetReal2D(lableMat, i * 45 + j, 0, i + 1);
				}
			}

			CvSVM svm;
			CvSVMParams svmParams;						//向量机参数
			CvTermCriteria  svmCriteria;				//迭代中止条件
			svmCriteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);

			svmParams = CvSVMParams(CvSVM::C_SVC, CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, NULL, svmCriteria);

			//利用训练数据和确定的学习参数,进行SVM学习
			svm.train(dataMat, lableMat, NULL, NULL, svmParams);
			svm.save("svm.xml");

			//以下代码用于SVM识别
			CvMat* svmResult = cvCreateMat(sheet->lastRow(), 1, CV_32FC1);
			CvMat* svmRow = NULL;

			for (int i = 0; i < sheet->lastRow(); ++ i)
			{
				svmRow = cvCreateMat(1, sheet->lastCol(), CV_32FC1);

				for (int j = 0; j < sheet->lastCol(); ++ j)
				{
					float temp = cvGetReal2D(dataMat, i, j);
					cvSetReal2D(svmRow, 0, j, temp);
				}

				unsigned int ret = 0;
				ret = svm.predict(svmRow);
				cvSetReal2D(svmResult, i, 0, ret);

				cvReleaseMat(&svmRow);
				svmRow = NULL;
			}

			int nCount = 0;

			for (int i = 0; i < 13; ++i)
			{
				for (int j = 0; j < 45; ++ j)
				{
					int ret = cvGetReal2D(svmResult, i * 45 + j, 0);
					if (ret == (i + 1))
					{
						++nCount;
					}
				}
			}

			float recognize = 100 * nCount / 13 / 45;

			CString str;
			str.Format("SVM 识别率为: %f", recognize);
			str = str + "%";
			MessageBox(str);

		}
	}

测试功能的实现代码:

CvSVM svm;
	svm.load("svm.xml");

	CFileDialog dlg(TRUE, NULL, NULL, 0, "图片文件(*.jpg)|*.jpg||");
	if (dlg.DoModal() == IDOK)
	{
		IplImage* testImage = cvLoadImage(dlg.GetPathName());
		IplImage* grayImage = cvCreateImage(cvGetSize(testImage), IPL_DEPTH_8U, 1);
		IplImage* hogImage = cvCreateImage(cvSize(96, 64), IPL_DEPTH_8U, 1);

		cvCvtColor(testImage, grayImage, CV_RGB2GRAY);
		cvResize(grayImage, hogImage, CV_INTER_LINEAR);

		std::vector<float> vfDescriptors;
		//vfDescriptors.resize(hogImage->width * hogImage->height);
		cv::Ptr<cv::HOGDescriptor> hog = new cv::HOGDescriptor(cvSize(hogImage->width, hogImage->height), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);
		hog->compute(hogImage, vfDescriptors, cv::Size(1, 1), cv::Size(0, 0));		//使用计算函数进行计算

		CvMat* mat = cvCreateMat(1, 256, CV_32FC1);

		int cols = 0;

		for (auto it = 0; it < 256; ++it)
		{
			cvSetReal2D(mat, 0, it, vfDescriptors[it]);
		}

		int  ret = svm.predict(mat);
		CString str;
		switch (ret)
		{
		case 1:
			str = "品种1:P12";
			break;
		case 2:
			str = "品种2:矮2";
			break;
		case 3:
			str = "品种3:花玉22";
			break;
		case 4:
			str = "品种4:花玉25";
			break;
		case 5:
			str = "品种5:冀花2号";
			break;
		case 6:
			str = "品种6:冀花4号";
			break;
		case 7:
			str = "品种7:冀花5号";
			break;
		case 8:
			str = "品种8:鲁花9号";
			break;
		case 9:
			str = "品种9:青花6号";
			break;
		case 10:
			str = "品种10:天府3号";
			break;
		case 11:
			str = "品种11:维花8号";
			break;
		case 12:
			str = "品种12:小白沙";
			break;
		case 13:
			str = "品种13:中农108";
			break;
		}
		AfxMessageBox(str);
		//cvReleaseMat(&mat);
	}//end if	

相关的程序代码,用于测试的图像样本及程序中用到的操作 Excel 的类,已经打包上传到CSDN,请自行下载:http://download.csdn.net/detail/lingtianyulong/8377461

时间: 2024-11-05 06:25:17

基于SVM+HOG的花生品种识别的相关文章

基于朴素贝叶斯的花生品种识别

最近一段时间,正在学习机器学习与模式识别,为了验证算法,仍然用了之前做过的项目的一些图片作为数据采集的样本,进行数据采集.前段时间,做了一个花生籽粒的识别程序,是基于SVM+HOG的,这次则是采用朴素贝叶斯来进行识别.采集了20个品种,每个品种50个样本,共1K个数据. 朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率.同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单.理论上,NBC模型与

基于svm和pca的人脸识别案例分析

数据集介绍 LFW (Labeled Faces in the Wild) 人脸数据库是由美国马萨诸塞州立大学阿默斯特分校计算机视觉实验室整理完成的数据库,主要用来研究非受限情况下的人脸识别问题.LFW 数据库主要是从互联网上搜集图像,而不是实验室,一共含有13000 多张人脸图像,每张图像都被标识出对应的人的名字,其中有1680 人对应不只一张图像,即大约1680个人包含两个以上的人脸.LFW数据集主要测试人脸识别的准确率. 代码实现 from time import time #记录时间 i

opencv学习笔记(七)SVM+HOG

opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度直方图来构成特征.Hog特征结合SVM分类器已经被广泛用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究院Dalal在2005的CVPR上提出的. 最近在做车标识别相关的研究,用到了SVM+HOG的方法进行识

基于SVM的数据分类预测——意大利葡萄酒种类识别

wine数据来自于UCI数据库,记录的是意大利同一地区3中不同品种的葡萄酒13中化学成分含量,以期通过科学的方法,达到自动分类葡萄酒的目的. 本次分类的数据共有178个样本,每个样本有13个属性,并提供每个样本的正确分类,用于检验SVM分类的准确定. 首先我们画出数据的可视化图: % 载入测试数据wine,其中包含的数据为classnumber = 3,wine:178*13的矩阵,wine_labes:178*1的列向量 load chapter_WineClass.mat; % 画出测试数据

基于SVM的字母验证码识别

基于SVM的字母验证码识别 摘要 本文研究的问题是包含数字和字母的字符验证码的识别.我们采用的是传统的字符分割识别方法,首先将图像中的字符分割出来,然后再对单字符进行识别.首先通过图像的初步去噪.滤波.形态学操作等一系列预处理过程,我们能够将图像中的噪点去除掉.为了将字符分割开来,我们利用Kmeans聚类算法对图像中的像素点聚成五类,分别代表五个字符,结果表明Kmeans算法的聚类准确度能够达到99.2%.对字符分割完成之后,我们采用支持向量机的算法对字符进行识别,通过调节参数能够使得准确率达到

基于QT和OpenCV的人脸识别系统

1 系统方案设计 1.1 引言 人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控.出入口控制.视频会议以及人机交互等领 域都有着广泛的应用前景,因此是模式识别和计算机视觉领域持续的研究热点. 本系统在 FriendlyARM Tiny6410 开发板基础上,利用 OpenCV 计算机视觉库和 QT 图形库,通 过普通的 USB 摄像头实现了自动人脸识别,准确率较高,方便易用. 1.2 系统总体架构 "人脸识别&quo

SVM+HOG特征训练分类器

#1,概念 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类.以及回归分析. SVM的主要思想可以概括为两点:⑴它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而 使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是

基于AForge.Net框架的扑克牌识别

原文:基于AForge.Net框架的扑克牌识别 © 版权所有 野比 2012 原文地址:点击查看 作者:Nazmi Altun Nazmi Altun著,野比 译  下载源代码 - 148.61 KB  下载demo - 3.1 MB 介绍 (图片上的字:方块4,方块J,黑桃2) 用机器人配上扑克牌识别系统,就可以在二十一点一类的扑克游戏中扮演荷官或是人类玩家的角色.实现这样的程序同样也是学习计算机视觉和模式识别的好途径. 本文涉及到的AForge.NET框架技术有二值化.边缘检测.仿射变换.B

图像处理——基于机器视觉技术的人脸在线识别系统设计

基于机器视觉技术的人脸在线识别系统设计 本设计研究人脸检测与识别技术,在基于机器视觉技术上,构建了一套人脸在线检测识别系统,系统将由以下几个部分构成:计算机图像预处理.数据收集和预处理. 人脸图像定位检测.人脸识别模型训练.人脸识别.经过实验,确定该系统可对本人的人脸进行快速并准确的检测与识别. 关键词: 机器视觉: 图像处理: 人脸检测:人脸识别:OpenCV:人脸模型训练 一.设计目标 掌握人脸识别步骤: 熟悉条人脸识别的相关算法: 熟悉机器视觉系统设计的一般流程: 掌握常用图像处理技术与O