训练SVM时出现OpenCV错误(无效参数)

3

我已经使用训练图像(大小为144x33的150张图像)创建了Mat,因此我的Mat宽度为4752,高度为150。另一个包含标签的Mat宽度为1,高度为150。现在当我尝试使用这两个Mat进行svm.train()时,我遇到以下错误:

OpenCV Error: Bad argument (response #2 is not integral) in cvPreprocessCategoricalResponses, file ..\..\..\..\opencv\modules\ml\src\inner_functions.cpp, line 715
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: ..\..\..\..\opencv\modules\ml\src\inner_functions.cpp:715: error: (-5) response #2 is not integral in function cvPreprocessCategoricalResponses]

这是我的一部分代码,请问有人能告诉我可能出了什么问题吗?
Mat trainingImages = new Mat(0, imageWidth * imageHeight, CvType.CV_32FC1);
    Mat labels = new Mat(amountOfPlates + amountOfNoPlates, 1, CvType.CV_32FC1);
    List<Integer> trainingLabels = new ArrayList<>();

    for (int i = 0; i < amountOfPlates; i++) {
        int index = i + 1;
        String file = pathPlates + index + ".jpg";

        Mat img = Highgui.imread(file, 0);
        img.convertTo(img, CvType.CV_32FC1);
        img = img.reshape(1, 1);
        trainingImages.push_back(img);
        trainingLabels.add(1);
    }

    for (int i = 0; i < amountOfNoPlates; i++) {
        int index = i + 1;
        String file = pathNoPlates + index + ".jpg";
        Mat img = Highgui.imread(file, 0);
        img.convertTo(img, CvType.CV_32FC1);
        img = img.reshape(1, 1);
        trainingImages.push_back(img);
        trainingLabels.add(0);
    }

    Integer[] array = trainingLabels.toArray(new Integer[trainingLabels.size()]);

    int[] trainLabels = new int[array.length];
    for (int i = 0; i < array.length; i++) {
        trainLabels[i] = array[i];
    }

    for (int i = 0; i < trainingLabels.size(); i++) {
        labels.put(i, 1, trainLabels[i]);
    }

    CvSVMParams params = new CvSVMParams();
    params.set_svm_type(CvSVM.C_SVC);
    params.set_kernel_type(CvSVM.LINEAR);
    params.set_degree(0);
    params.set_gamma(1);
    params.set_coef0(0);
    params.set_C(1);
    params.set_nu(0);
    params.set_p(0);
    TermCriteria tc = new TermCriteria(opencv_core.CV_TERMCRIT_ITER, 1000, 0.01);
    params.set_term_crit(tc);

    Size data = trainingImages.size();
    Size label = labels.size();


    CvSVM svmClassifier = new CvSVM();
    svmClassifier.train(trainingImages, labels, new Mat(), new Mat(), params);
    svmClassifier.save("test.xml");

尺寸数据显示:宽度=4752,高度=150

尺寸标签显示:宽度=1,高度=150

我做错了什么?

1个回答

3

Mat labels被定义为CV_32FC1,但你使用整数从int[] trainLabels扩展它。
你应该使用浮点数trainLabelsCV_32SC1类型的labels


1
标签Mat应该是CV_32SC1,因为这是一个分类任务,如果你给SVM一个浮点标签Mat,它会认为你想要回归。 - berak
谢谢,它立刻帮了我一个大忙! :) 顺便问一下,CV_32SC1 究竟是什么? - Tomek
1
CV_32SC1 是用于有符号整数的,它表示您的矩阵存储 int - Kornel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接