我是HOG描述符和支持向量机的初学者。 我成功实现了OpenCV示例hog.cpp,peopledetect.cpp和train_hog.cpp(CV版本3.4.1)。
现在,由于文档非常少,我在理解HOG方法setSVMDetector()时遇到了一些问题。在我仅有的示例中,有几行没有注释(请参阅train_hog.cpp中的get_svm_detector()函数),我的意思是我不清楚必须如何构建setSVMDetector()的参数。
例如,在train_hog.cpp中,setSVMDetector的参数由函数给出
vector< float > get_svm_detector(const Ptr< SVM >& svm)
{
// get the support vectors
Mat sv = svm->getSupportVectors();
const int sv_total = sv.rows;
// get the decision function
Mat alpha, svidx;
double rho = svm->getDecisionFunction( 0, alpha, svidx );
CV_Assert( alpha.total() == 1 && svidx.total() == 1 && sv_total == 1 );
CV_Assert( (alpha.type() == CV_64F && alpha.at<double>(0) == 1.) ||
(alpha.type() == CV_32F && alpha.at<float>(0) == 1.f) );
CV_Assert( sv.type() == CV_32F );
vector< float > hog_detector( sv.cols + 1 );
memcpy( &hog_detector[0], sv.ptr(), sv.cols*sizeof( hog_detector[0] ) );
hog_detector[sv.cols] = (float)-rho;
return hog_detector;
}
如果SVM参数为(如示例中所示),则此功能有效:
svm->setCoef0( 0.0 );
svm->setDegree( 3 );
svm->setTermCriteria( TermCriteria( CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 1000, 1e-3 ));
svm->setGamma( 0 );
svm->setKernel( SVM::LINEAR );
svm->setNu( 0.5 );
svm->setP( 0.1 );
svm->setC( 0.01 );
svm->setType( SVM::EPS_SVR ); // Support Vector Regression
但是,如果我更改SVM参数的类型,例如:
svm->setGamma(1.0); //default is 1
svm->setC(0.01); // soft is 0.01 12.5
svm->setKernel(SVM::RBF); //Radial Basis Function Kernel
svm->setType(SVM::C_SVC); // n-class classification, with n>=2
函数崩溃。所以我的问题是:如果我使用了最后一个SVM参数,应该给setSVMDetector()什么?