一个很简单的实验,2分类,训练集为20张图片,测试集合为500张图片。
折腾了很久才弄好了调用结果,但是结果不是太好,不如SVM。
double classifyByKNN( const cv::Mat& trainData, const cv::Mat& trainResponse, const cv::Mat& testData, const cv::Mat& testResponse ) { const int C = 10001; const int K = 15; // 参数K的取值 int i, j, k; float response; double accuracy = 0; float _sample[C]; CvMat sample = cvMat( 1, C, CV_32FC1, _sample ); //CvMat* traincm = cvCreateMat(trainData.rows, trainData.cols, CV_32FC1); //CvMat* testcm = cvCreateMat(testData.rows, testData.cols, CV_32FC1); CvMat* traincm = &trainData.operator CvMat(); CvMat* testcm = &testData.operator CvMat(); CvMat* trainre = &trainResponse.operator CvMat(); CvMat* nearests = &testResponse.operator CvMat(); //CvKNearest( const CvMat* _train_data, const CvMat* _responses, const CvMat* _sample_idx=0, bool _is_regression=false, int max_k=32 );//有参构造函数 //train( const CvMat* _train_data, const CvMat* _responses,const CvMat* _sample_idx=0, bool is_regression=false,int _max_k=32, bool __base=false ); CvKNearest knn( traincm, trainre, 0, false, K ); //CvKNearest knn(trainData, trainResponse, 0, false, K); knn.train(traincm, trainre, 0, false, K, false); //knn.train(trainData, trainResponse, trainData,false, K, false); cout << "Training Over" << endl << "Testing..." << endl ; for ( int row = 0; row < testData.rows; row++ ) { response = knn.find_nearest(testcm, K, nearests, 0, 0); if ( testResponse.at<float>( row, 0 ) == response) { accuracy++; } } cout << "Testing Over" << endl ; return accuracy / testData.rows ; }