【问题标题】:SVM prediction of images OpenCV图像 OpenCV 的 SVM 预测
【发布时间】:2014-07-09 16:58:39
【问题描述】:

我能够训练系统,但是当我尝试预测时,会引发错误参数异常。

OpenCV 错误:cvPreparePredictData 中的参数错误(样本不是有效向量),文件 ........\opencv\modules\ml\src\inner_functions.cpp,第 1099 行 线程“主”CvException 中的异常 [org.opencv.core.CvException: cv::Exception: ........\opencv\modules\ml\src\inner_functions.cpp:1099: 错误:(-5)样本不是函数 cvPreparePredictData 中的有效向量 ]

这是我的代码:

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        Mat classes = new Mat();
        Mat trainingData = new Mat();
        Mat trainingImages = new Mat();
        Mat trainingLabels = new Mat();
        CvSVM clasificador;
        String path="C:\\java workspace\\ora\\images\\Color_Happy_jpg";
       for (File file : new File(path).listFiles()) {
            Mat img=new Mat();   
            Mat con = Highgui.imread(path+"\\"+file.getName(),Highgui.CV_LOAD_IMAGE_GRAYSCALE);
            con.convertTo(img, CvType.CV_32FC1,1.0/255.0);

                img.reshape(1, 1);
                trainingImages.push_back(img);
               trainingLabels.push_back(Mat.ones(new Size(1, 75), CvType.CV_32FC1));

            }
        System.out.println("divide");
        path="C:\\java workspace\\ora\\images\\Color_Sad_jpg";
          for (File file : new File(path).listFiles()) {
                Mat img=new Mat();
                Mat m=new Mat(new Size(640,480),CvType.CV_32FC1);
                Mat con = Highgui.imread(file.getAbsolutePath(),Highgui.CV_LOAD_IMAGE_GRAYSCALE);

                con.convertTo(img, CvType.CV_32FC1,1.0/255.0);
                img.reshape(1, 1);
                trainingImages.push_back(img);

                trainingLabels.push_back(Mat.zeros(new Size(1, 75), CvType.CV_32FC1));

              }

            trainingLabels.copyTo(classes);
            CvSVMParams params = new CvSVMParams();
            params.set_kernel_type(CvSVM.LINEAR);
            CvType.typeToString(trainingImages.type());
            CvSVM svm=new CvSVM();



            clasificador = new CvSVM(trainingImages,classes, new Mat(), new Mat(), params);

            clasificador.save("C:\\java workspace\\ora\\images\\svm.xml");
            Mat out=new Mat();

            clasificador.load("C:\\java workspace\\ora\\images\\svm.xml");
            Mat sample=Highgui.imread("C:\\java workspace\\ora\\images\\Color_Sad_jpg\\EMBfemale20-2happy.jpg",Highgui.CV_LOAD_IMAGE_GRAYSCALE);

           sample.convertTo(out, CvType.CV_32FC1,1.0/255.0);               
            out.reshape(1, 75);
            System.out.println(clasificador.predict(out));

【问题讨论】:

    标签: java opencv svm


    【解决方案1】:

    1.

    您的 trainLabels 仍然是错误的。

    您需要一个带有 numrows==numimages 和 1 col 的浮动垫。所以,每张图片有 1 个标签。

    所以你悲伤的脸应该有:

    trainingLabels.push_back(-1.0);
    

    你快乐的人应该有:

    trainingLabels.push_back(1.0);
    

    2.

    必须以与训练相同的方式处理预测样本。

    sample.convertTo(out, CvType.CV_32FC1,1.0/255.0);               
    out.reshape(1, 1);
    

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 2013-05-22
      • 2020-08-03
      • 2015-03-15
      • 2016-04-16
      • 2015-10-01
      • 2016-03-29
      • 2018-05-29
      • 2016-02-18
      相关资源
      最近更新 更多