【问题标题】:OpenCV 3 KNN implementationOpenCV 3 KNN 实现
【发布时间】:2015-03-18 02:22:56
【问题描述】:

您可能知道,OpenCV 3 发生了很多变化。在以前的 OpenCV 版本中,我曾经这样做过:

Mat trainData(classes * samples, ImageSize, CV_32FC1);
Mat trainClasses(classes * samples, 1, CV_32FC1);
KNNLearning(&trainData, &trainClasses); //learning function
KNearest knearest(trainData, trainClasses); //creating

//loading input image
Mat input = imread("input.jpg");

//digital recognition
learningTest(input, knearest);//test

我也找到了一个例子,但是我在创建函数中仍然有错误:

Ptr<KNearest> knearestKdt = KNearest::create(ml::KNearest::Params(10, true, INT_MAX, ml::KNearest::KDTREE));
knearestKdt->train(trainData, ml::ROW_SAMPLE, trainLabels);
knearestKdt->findNearest(testData, 4, bestLabels);

能否请您提供信息,如何正确地将 KNearest 的实际代码重写为 openCV 3?

【问题讨论】:

    标签: c++ opencv knn opencv3.0


    【解决方案1】:

    自@aperture-laboratories 回答以来,API 再次发生了变化。我希望他们在将来发布新功能或更改时跟上文档。

    一个工作示例如下

    using namespace cv::ml;
    
    //Be sure to change number_of_... to fit your data!
    Mat matTrainFeatures(0,number_of_train_elements,CV_32F);
    Mat matSample(0,number_of_sample_elements,CV_32F);
    
    Mat matTrainLabels(0,number_of_train_elements,CV_32F);
    Mat matSampleLabels(0,number_of_sample_elements,CV_32F);
    
    Mat matResults(0,0,CV_32F);
    
    //etcetera code for loading data into Mat variables suppressed
    
    Ptr<TrainData> trainingData;
    Ptr<KNearest> kclassifier=KNearest::create();
    
    trainingData=TrainData::create(matTrainFeatures,
                            SampleTypes::ROW_SAMPLE,matTrainLabels);
    
    
    
    kclassifier->setIsClassifier(true);
    kclassifier->setAlgorithmType(KNearest::Types::BRUTE_FORCE);
    kclassifier->setDefaultK(1);
    
    kclassifier->train(trainingData);
    kclassifier->findNearest(matSample,kclassifier->getDefaultK(),matResults);
    
    //Just checking the settings
    cout<<"Training data: "<<endl
        <<"getNSamples\t"<<trainingData->getNSamples()<<endl
        <<"getSamples\n"<<trainingData->getSamples()<<endl
        <<endl;
    
    cout<<"Classifier :"<<endl
        <<"kclassifier->getDefaultK(): "<<kclassifier->getDefaultK()<<endl
        <<"kclassifier->getIsClassifier()   : "<<kclassifier->getIsClassifier()<<endl   
        <<"kclassifier->getAlgorithmType(): "<<kclassifier->getAlgorithmType()<<endl
        <<endl;
    
    //confirming sample order
    cout<<"matSample: "<<endl
        <<matSample<<endl
        <<endl;
    
    //displaying the results
    cout<<"matResults: "<<endl
        <<matResults<<endl
        <<endl;
    
    //etcetera ending for main function
    

    【讨论】:

      【解决方案2】:
      KNearest::Params params;
      params.defaultK=5;
      params.isclassifier=true;
          //////// Train and find with knearest
              Ptr<TrainData> knn;
              knn= TrainData::create(AmatOfFeatures,ROW_SAMPLE,AmatOfLabels);
              Ptr<KNearest> knn1;
              knn1=StatModel::train<KNearest>(knn,params);
              knn1->findNearest(AmatOfFeaturesToTest,4,ResultMatOfNearestNeighbours);
              /////////////////
      

      这些函数的名称将帮助您在文档中找到它们。 但是,在完全更新之前,文档可能会有点混乱,所以最好的方法是做一个小玩具示例并使用试错法。 这是一个工作示例,直接从我自己的代码中粘贴出来,被证明是有效的。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2020-05-18
        • 2017-01-28
        • 2018-12-04
        • 2015-05-02
        • 1970-01-01
        • 2019-02-18
        • 2018-11-30
        • 1970-01-01
        • 2015-08-17
        相关资源
        最近更新 更多