"这篇资源是关于使用C++和OpenCV 2.4.10库实现支持向量机(SVM)分类的教程。主要内容包括读取数据、预处理图像特征以及训练和应用SVM模型。示例代码通过读取`svmtraindata.txt`文件中的数据,将图像路径和对应的类别标签进行分组,并使用HOG(Histogram of Oriented Gradients)特征提取方法。" 在机器学习领域,支持向量机(Support Vector Machine,简称SVM)是一种广泛使用的监督学习算法,尤其在分类和回归问题上表现优秀。它通过构建一个超平面来划分数据,使得两类数据间隔最大化,从而达到良好的分类效果。在这个例子中,我们利用OpenCV库来实现SVM分类。 首先,程序包含了必要的头文件,如`opencv2/opencv.hpp`、`opencv2/ml/ml.hpp`等,这些头文件提供了OpenCV的基本功能和机器学习模块(ML模块),包括SVM的接口。 在`main`函数中,程序定义了两个向量:`img_path`存储图像路径,`img_catg`存储对应的类别标签。通过读取名为`svmtraindata.txt`的文本文件,程序逐行解析数据,偶数行存储图像路径,奇数行存储类别标签。`atoi`函数用于将字符串转换为整数,以便将类别标签(通常为0或1)存储在`img_catg`中。 接着,程序创建了一个`CvMat`矩阵`data_mat`,用于存储图像的特征。在本例中,使用了HOG特征,这是一种描述图像局部结构的统计方法,特别适合于行人检测等任务。`data_mat`的大小是基于HOG特征的尺寸和图像数量计算得出的,这里假设每个图像的HOG特征有1764个元素。 为了获取这些特征,通常需要使用`HOGDescriptor`类来提取HOG特征。在实际操作中,会先加载图片,然后使用`HOGDescriptor::compute()`方法计算每个图像的HOG特征,将结果填充到`data_mat`中。这个过程没有在给出的代码片段中显示,但这是实现SVM分类的关键步骤。 最后,`CvMat`矩阵`res_mat`通常用于存储SVM的预测结果,但在这个示例中没有创建和使用。在完整实现中,应使用`CvSVM`类来训练SVM模型,将`data_mat`作为特征数据,`img_catg`作为对应的类别标签,然后使用训练好的模型对新的数据进行预测。 总结来说,这个资源提供了一个基础的示例,展示了如何使用C++和OpenCV 2.4.10来实现SVM分类,特别是结合HOG特征提取。对于想要学习如何在实际项目中应用SVM的开发者,这是一个很好的起点。不过,实际应用时需要补充完整特征提取、模型训练和预测的代码部分。
#include<opencv\cv.h>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\ml\ml.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
vector<string> img_path;//输入文件名变量
vector<int> img_catg;
int nLine = 0;
string buf;
ifstream svm_data( "svmtraindata.txt" );//首先,文件列表,把训练样本图片的路径都写在这个txt文件
unsigned long n;
while( svm_data )//将训练样本文件依次读取进来
{
if( getline( svm_data, buf ) )
{
nLine ++;
if( nLine % 2 == 0 )//这里的分类比较有意思,看得出来上面的SVM_DATA.txt文本中应该是一行是文件路径,接着下一行就是该图片的类别,可以设置为0或者1,当然多个也无所谓
{
img_catg.push_back( atoi( buf.c_str() ) );//atoi将字符串转换成整型,标志(0,1),注意这里至少要有两个类别,否则会出错
}
else
{
}
}
}
svm_data.close();//关闭文件
CvMat *data_mat, *res_mat;
int nImgNum = nLine / 2; //读入样本数量 ,因为是每隔一行才是图片路径,所以要除以2
////样本矩阵,nImgNum:横坐标是样本数量, WIDTH * HEIGHT:样本特征向量,即图像大小
// data_mat = cvCreateMat( nImgNum, 1764, CV_32FC1 ); //这里第二个参数,即矩阵的列是由下面的descriptors的大小决定的,可以由descriptors.size()得到,且对于不同大小的输入训练图片,这个值是不同的
data_mat = cvCreateMat( nImgNum, 1764, CV_32FC1 );//64*128的训练样本,该矩阵将是totalSample*3780,64*64的训练样本,该矩阵将是totalSample*1764
// data_mat = cvCreateMat( nImgNum, 350000, CV_32FC1 ); //这里第二个参数,即矩阵的列是由下面的descriptors的大小决定的,可以由descriptors.size()得到,且对于不同大小的输入训练图片,这个值是不同的
cvSetZero( data_mat );
//类型矩阵,存储每个样本的类型标志
res_mat = cvCreateMat( nImgNum, 1, CV_32FC1 );
cvSetZero( res_mat );
IplImage* src;
string path;
//IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的图片,这里默认设定图片是64*64大小,所以上面定义了1764,如果要更改图片大小,可以先用debug查看一下descriptors是多少,然后设定好再运行
IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的图片,这里默认设定图片是64*64大小,所以上面定义了1764,如果要更改图片大小,可以先用debug查看一下descriptors是多少,然后设定好再运行
vector<float>descriptors;//结果数组
//开始获取HOG特征
//HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);
for( string::size_type i = 0; i != img_path.size(); i++ )
{
path=img_path[i];
src=cvLoadImage(path.c_str(),1);
if( src == NULL )
{
剩余5页未读,继续阅读
- 粉丝: 14
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全