【发布时间】:2016-01-28 22:46:22
【问题描述】:
我正在尝试使用 HOG 特征提取器的描述符值来训练 svm。
//pRow, nRow, pCol, nCol are positive and negative columns and rows.
Mat posneg_descriptor_mat( pRow + nRow, pCol, CV_32FC1 );
// data is descriptor values
memcpy(posneg_descriptor_mat.data, pMat.data, sizeof(float) * pMat.cols * pMat.rows );
int startP = sizeof(float) * pMat.cols * pMat.rows;
memcpy(&(posneg_descriptor_mat.data[ startP ]), nMat.data, sizeof(float) * nMat.cols * nMat.rows );
//data labeling
Mat labels( pRow + nRow, 1, CV_32FC1, Scalar(-1.0) );
labels.rowRange( 0, pRow ) = Scalar( 1.0 );
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 10000, 1e-6));
Ptr<TrainData> td =TrainData::create(posneg_descriptor_mat, ROW_SAMPLE, labels);
当代码在错误(浮点异常(核心转储))下面的行时:
svm->trainAuto(td);
【问题讨论】:
-
是这样吗? svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 10000, 1e-6));
-
可能与问题没有直接关系,但您确实应该避免使用
memcpy。使用正确安装的Mat构造函数,不易出错。 @jas- 是的,形式上是正确的。但我看不到PN_Descriptor_mtx的定义位置 -
对不起,我忘了在这个地方更新变量名。现在更新了。
-
你能在调试中运行并得到错误信息吗?
-
是的,错误信息是:
Program received signal SIGFPE, Arithmetic exception. 0x00007ffff7b94cfd in cv::ml::SVMImpl::trainAuto(cv::Ptr<cv::ml::TrainData> const&, int, cv::ml::ParamGrid, cv::ml::ParamGrid, cv::ml::ParamGrid, cv::ml::ParamGrid, cv::ml::ParamGrid, cv::ml::ParamGrid, bool) () from /usr/local/lib/libopencv_ml.so.3.0 Single stepping until exit from function _ZN2cv2ml7SVMImpl9trainAutoERKNS_3PtrINS0_9TrainDataEEEiNS0_9ParamGridES7_S7_S7_S7_S7_b, which has no line number information.Program terminated with signal SIGFPE, Arithmetic exception. The program no longer exists.