我们先来看一下整个的头文件的构成:
其中:
config.h : 配置头文件,里面定义了一个类:class Config。主要定义的是特征的类型,核函数的类型等等。
Features.h:定义了一个Class Features 。里面定义了int 型的m_featureCount//特征计数Eigen::VectorXd m_featVec 存储特征的向量。其中使用了inline内联函数(inline 说明这个函数是内联的,在编译过程中内联函数会直接被源代码替换,提高执行效率 如果类中的某个函数会被调用很多次或者放在循环中,那么建议将这个函数声明为内联,可以提高程序的运行效率。现在的作用:一个可执行文件的cpp文件中一个函数只能被定义一次。如果你把函数定义在一个.h文件中并让两个cpp包含就会造成这个函数分别在两个cpp中被定义产生错误。但是inline函数是允许在多个cpp中多次定义的,就解决了这个问题。)。
HaarFeature.h:里面定义了一个Eval 函数(简单来说就是放在前面表示这个函数的返回值是const型,只能赋值给const型;放在后面就是函数是const型 总结见:http://www.cppblog.com/jukevin/archive/2008/12/27/70499.html)。声明了几个private的变量:
FloatRect m_bb; //意思是说这个m_bb是Rect(x,y,width,height),并且里面是浮点型
std::vector<FloatRect> m_rects;// 这里也就是说这个Vector里面的每一个元素都是Rect
std::vector<float> m_weights;
float m_factor;
HaarFeatures.h:调用以上的两个头文件,继承features类,在里面定义了自己的 std::vector<HaarFeature> m_features; 同时还声明了自己的函数。
HistogramFeatures.h: 继承features类,定了了一个特征vector更新的向量。
ImageRep.h :定了class ImageRep,里面是一些图片表示的数据变量。
Kernels.h :定义了SMO需要用到的一些的核函数:包括:线性核函数,高斯核,多核等等。
LaRank.h: 定义了和支持向量相关的一些操作函数(详见后面)。
其余的几个也不是很困难,我将在CPP文件中详细的解释。
备注:
代码里面需要一些eigen 的基础,这个包挺好的有了它就可以像在MATLAB里面一样操作矩阵等等了!教程如下(改天自己写一个哈哈):http://eigen.tuxfamily.org/dox-2.0/TutorialCore.html