Opencv SVM响应数组大小误差

Opencv SVM响应数组大小误差,opencv,svm,Opencv,Svm,我使用了某种支持向量机: #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/nonfree/nonfree.hpp" #include <iostream> #include <

我使用了某种支持向量机:

#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>

using namespace cv;

int main()
{
    // Data for visual representation
    int width = 512, height = 512;
    Mat image = Mat::zeros(height, width, CV_8UC3);

    //Load Data and Labels from csv files
    CvMLData mlData;
    mlData.read_csv("/home/rahim/workspace/svm/DataTrain1-svm.csv");
    const CvMat* tmpDataTr = mlData.get_values();
    cv::Mat DataTrt(tmpDataTr, true);
    tmpDataTr->CvMat::~CvMat();
    cout << "M = "<< DataTrt << " "  << DataTrt << endl << endl;
    Mat DataTr = DataTrt.t();

    mlData.read_csv("/home/rahim/workspace/svm/LabelTrain1-svm.csv");
    const CvMat* tmpLabelTr = mlData.get_values();
    cv::Mat LabelTrt(tmpLabelTr, true);
    tmpLabelTr->CvMat::~CvMat();
    cout << "M = "<< LabelTrt << " "  << LabelTrt << endl << endl;
    Mat LabelTr = LabelTrt.t();
    cout << "Data size = " << DataTr.size() << endl;
    cout << "labels size = " << LabelTr.size() << endl;

    // Set up SVM's parameters
    CvSVMParams params;
    params.svm_type    = CvSVM::C_SVC;
    params.kernel_type = CvSVM::LINEAR;
    params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

    // Train the SVM
    CvSVM SVM;
    //SVM.train(trainingData, traininglabels, Mat(), Mat(), params);
    SVM.train(DataTr, LabelTr, Mat(), Mat(), params);
    Vec3b green(0,255,0), blue (255,0,0);
    // Show the decision regions given by the SVM
    for (int i = 0; i < image.rows; ++i)
        for (int j = 0; j < image.cols; ++j)
        {
            Mat sampleMat = (Mat_<float>(1,2) << j,i);
            float response = SVM.predict(sampleMat);

            if (response == 1)
                image.at<Vec3b>(i,j)  = green;
            else if (response == -1)
                 image.at<Vec3b>(i,j)  = blue;
        }

    // Show the training data
    int thickness = -1;
    int lineType = 8;
    circle( image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness, lineType);
    circle( image, Point(255,  10), 5, Scalar(255, 255, 255), thickness, lineType);
    circle( image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);
    circle( image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType);

    // Show support vectors
    thickness = 2;
    lineType  = 8;
    int c     = SVM.get_support_vector_count();

    for (int i = 0; i < c; ++i)
    {
        const float* v = SVM.get_support_vector(i);
        circle( image,  Point( (int) v[0], (int) v[1]),   6,  Scalar(128, 128, 128), thickness, lineType);
    }

    imwrite("result.png", image);        // save the image

    imshow("SVM Simple Example", image); // show it to the user
    waitKey(0);

}
但我得到了以下错误: Gments不匹配响应数组必须包含与CVPreprocessCategorialResponses中样本总数相同的元素


DataTr.size和LabelTr.size的输出分别为[1800*9]和[1800*1]

如果我理解正确,您有1800个样本和9个变量

根据CvSVM::train只支持包含行中样本的数据。因此,您无需在线传输列车数据:

Mat DataTr = DataTrt.t();
您也不需要转置标签数据。但这并不是很关键,因为标签数据只必须包含和样本数相等的元素数。行或列都不重要