• 大小: 37.36MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-07-23
  • 语言: C/C++
  • 标签:

资源简介

这是opencv svm图像分类的整个工程代码,在VS2010下打开即可。整个工程文件以及我的所有训练的图片存放在这里,需要的可以下载,自己在找训练图片写代码花了很多时间,下载完后自行解压,训练图片和测试图片可以从这免费下载http://download.csdn.net/detail/always2015/8944959,project data文件夹直接放在D盘就行,里面存放训练的图片和待测试图片,以及训练过程中生成的中间文件,现在这个下载object_classfication_end则是工程文件,我用的是vs2010打开即可,下面工程里有几个要注意的地方: 1、在这个模块中使用到了c++的boost库,但是在这里有一个版本的限制。这个模块的代码只能在boost版本1.46以上使用,这个版本以下的就不能用了,直接运行就会出错,这是最需要注意的。因为在1.46版本以上中对比CsSVM这个类一些成员函数做了一些私有化的修改,所以在使用该类初始化对象时候需要注意。 2、我的模块所使用到的函数和产生的中间结果都是在一个categorizer类中声明的,由于不同的执行阶段中间结果有很多个,例如:训练图片聚类后所得到单词表矩阵,svm分类器的训练的结果等,中间结果的产生是相当耗时的,所以在刚开始就考虑到第一次运行时候把他以文件XML的格式保存下来,下次使用到的时候在读取。将一个矩阵存入文本的时候可以直接用输出流的方式将一个矩阵存入,但是读取时候如果用输入流直接一个矩阵变量的形式读取,那就肯定报错,因为输入流不支持直接对矩阵的操作,所以这时候只能对矩阵的元素一个一个进行读取了。 3、在测试的时候,如果输入的图片太小,或者全为黑色,当经过特征提取和单词构造完成使用svm进行分类时候会出现错误。经过调试代码,发现上述图片在生成该图片的单词的时候所得到的单词矩阵会是一个空矩阵,即该矩阵的行列数都为0,所以在使用svm分类器时候就出错。所以在使用每个输入图片的单词矩阵的时候先做一个判断,如果该矩阵行列数都为0,那么该图片直接跳过。

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//boost 库
#include

#include“Config.h“

using namespace cv;
using namespace std;
//定义一个boost库的命名空间
namespace fs=boost::filesystem;
using namespace fs;


class categorizer
{
private :
//从类目名称到数据的map映射
map result_objects;
//存放所有训练图片的BOW
map allsamples_bow;
//从类目名称到训练图集的映射,关键字可以重复出现
multimap train_set;
// 训练得到的SVM
CvSVM *stor_svms;
//类目名称,也就是TRAIN_FOLDER设置的目录名
vector category_name;
//类目数目
int categories_size;
//用SURF特征构造视觉词库的聚类数目
int clusters;
//存放训练图片词典
Mat vocab;

//特征检测器detectors与描述子提取器extractors   泛型句柄类Ptr
Ptr featureDecter;
PtrriptorExtractor> descriptorExtractor;

Ptr bowtrainer;
PtrriptorExtractor> bowDescriptorExtractor;
PtrsedMatcher> descriptorMacher;

//构造训练集合
void make_train_set();
// 移除扩展名,用来讲模板组织成类目
string remove_extention(string);

public:
//构造函数
categorizer(int);
// 聚类得出词典
void bulid_vacab();
//构造BOW
void compute_bow_image();
//训练分类器
void trainSvm();
//将测试图片分类
void category_By_svm();
};

// 移除扩展名,用来讲模板组织成类目
string categorizer::remove_extention(string full_name)
{
//find_last_of找出字符最后一次出现的地方
int last_index=full_name.find_last_of(“.“);
string name=full_name.substr(0last_index);
return name;
}

// 构造函数
categorizer::categorizer(int _clusters)
{
cout<<“开始初始化...“< clusters=_clusters;
//初始化指针
featureDecter=new SurfFeatureDetector();
descriptorExtractor=new SurfDescriptorExtractor();

bowtrainer=new BOWKMeansTrainer(clusters);
descriptorMacher=new FlannbasedMatcher();
bowDescriptorExtractor=new BOWImgDescriptorExtractor(descriptorExtractordescriptorMacher);

//boost库文件 遍历数据文件夹  directory_iterator(p)就是迭代器的起点,无参数的directory_iterator()就是迭代器的终点。
directory_iterator begin_iter(TEMPLATE_FOLDER);
directory_iterator end_iter;
//获取该目录下的所有文件名
for(;begin_iter!=end_iter;++begin_iter)
{
string filename=string(TEMPLATE_FOLDER)+begin_iter->path().filename().string();
string sub_category =remove_extention(begin_iter->path().filename().string());
//读入模板图片
Mat image=imread(filename);
Mat templ_image;

//存储原图模板
result_objects[sub_category]=image;
}

cout<<“初始化完毕...“< //读取训练集
make_train_set();
}


//构造训练集合
void categorizer::make_train_set()
{
cout<<“读取训练集...“< string categor;
//递归迭代rescursive 直接定义两个迭代器:i为迭代起点(有参数),end_iter迭代终点
for(recursive_directory_iterator i(TRAIN_FOLDER)end_iter;i!=end_iter;i++)
{
// level == 0即为目录,因为TRAIN__FOLDER中设置如此
if(i.level()==0)
{
// 将类目名称设置为目录的名称
categor=(i->path()).filename().string();
categor

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2015-07-28 09:34  object_classfication_end\
     目录           0  2015-07-28 09:34  object_classfication_end\Debug\
     文件      396800  2015-07-13 16:12  object_classfication_end\Debug\object_classfication_end.exe
     文件     2557804  2015-07-13 16:12  object_classfication_end\Debug\object_classfication_end.ilk
     文件     4606976  2015-07-13 16:12  object_classfication_end\Debug\object_classfication_end.pdb
     目录           0  2015-07-28 09:34  object_classfication_end\Release\
     文件      111616  2015-05-28 20:40  object_classfication_end\Release\object_classfication_end.exe
     文件     1338368  2015-05-28 20:40  object_classfication_end\Release\object_classfication_end.pdb
     目录           0  2015-07-28 09:34  object_classfication_end\ipch\
     目录           0  2015-07-28 09:34  object_classfication_end\ipch\object_classfication_end-11ed1bd5\
     文件   122224640  2015-07-28 09:29  object_classfication_end\ipch\object_classfication_end-11ed1bd5\object_classfication_end-a7045f3b.ipch
     目录           0  2015-07-28 09:34  object_classfication_end\object_classfication_end\
     文件         273  2015-07-13 16:12  object_classfication_end\object_classfication_end\Config.h
     目录           0  2015-07-28 09:34  object_classfication_end\object_classfication_end\Debug\
     文件      186452  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\CL.read.1.tlog
     文件        1616  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\CL.write.1.tlog
     文件        2354  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\cl.command.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link-cvtres.read.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link-cvtres.write.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1056-cvtres.read.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1056-cvtres.write.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1056.read.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1056.write.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1128-cvtres.read.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1128-cvtres.write.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1128.read.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1128.write.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1196-cvtres.read.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1196-cvtres.write.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1196.read.1.tlog
     文件           2  2015-07-13 16:12  object_classfication_end\object_classfication_end\Debug\link.1196.write.1.tlog
............此处省略477个文件信息

评论

共有 条评论

相关资源