OpenCV 3 KNN实现

Pio*_*ski 5 c++ opencv knn opencv3.0

您可能知道,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
Run Code Online (Sandbox Code Playgroud)

我还找到了一个如何弄清楚它的例子,但我在创建函数中仍然有错误:

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);
Run Code Online (Sandbox Code Playgroud)

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

小智 8

自@ 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
Run Code Online (Sandbox Code Playgroud)


小智 0

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);
        /////////////////
Run Code Online (Sandbox Code Playgroud)

这些函数的名称将帮助您在文档中找到它们。但是,在完全更新之前,文档可能会有点令人困惑,因此准确执行您想要的操作的最佳方法是制作一个小玩具示例并使用试错方式。这是一个工作示例,直接从我自己的代码中粘贴出来,已被证明是有效的。希望有帮助。