什么是火车CvNormalBayesClassifier opencv中的组件掩码?

时间:2014-08-17 10:24:43

标签: java c++ opencv javacv

我正在使用普通贝叶斯分类器训练SIFT BOW描述符。我的训练数据有79行,每行代表一个样本和500列。响应数据有79行和1列。 varIdx和sampleIdx为0且update = true。

    CvNormalBayesClassifier classifier=new CvNormalBayesClassifier();

         CvMat val1 =cvCreateMat(1,1,CV_8U);
         double[] myarr1=new double[1];
         myarr1[0]=0.0;
         val1.put(myarr1);
         CvMat val2 =cvCreateMat(1,1,CV_8U);
         double[] myarr2=new double[1];
         myarr2[0]=0.0;
         val2.put(myarr2);

         classifier.train(trainingdata, label,val1,val2 ,true);

错误:

OpenCV Error: Sizes of input arguments do not match (Component mask should contain as many elements as the total number of input variables) in cvPreprocessIndexArray, file ..\..\..\..\opencv\modules\ml\src\inner_functions.cpp, line 426
Exception in thread "main" java.lang.RuntimeException: ..\..\..\..\opencv\modules\ml\src\inner_functions.cpp:426: error: (-209) Component mask should contain as many elements as the total number of input variables in function cvPreprocessIndexArray

    at com.googlecode.javacv.cpp.opencv_ml$CvNormalBayesClassifier.train(Native Method)
    at com.cis.project.Recognition.main(Recognition.java:74)

什么是组件掩码?

1 个答案:

答案 0 :(得分:0)

来自docs

可以在所选特征子集上和/或在训练集的所选样本子集上训练许多ML模型。为方便您使用,方法序列通常包括var_idx和sample_idx参数。前一个参数识别感兴趣的变量(特征),后者识别感兴趣的样本。两个向量都是整数(CV_32SC1)向量(基于0的索引的列表)或活动变量/样本的8位(CV_8UC1)掩码。您可以传递NULL指针而不是任何一个参数,这意味着所有变量/样本都用于训练。

所以,要么传递1d整数,要么传递与标签/样本相同长度的uchar Mat,填充0和1作为掩码,或传递空对象(或空指针,具体取决于你的api) )。