【问题标题】:opencv java SVM api nullPointExceptionopencv java SVM api nullPointErexception
【发布时间】:2018-04-26 06:40:58
【问题描述】:

这是一个问题,我不知道如何处理。 问题行在svm.trainAuto(param1,....)。我读了 400 个 imgs 并存储在trainningSet(200 个有车牌,200 个没有),它们的标签存储在类中,我想训练一个 SVM 模型但trainAuto 方法捕获异常。 trainningData 和 clusses 不为空,我已经检查过了,

package com.xjtu.svm;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.ml.Ml;
import org.opencv.ml.SVM;

public class ReadInPlate {
private final static int amount=200;
private static int width;
private static int height;
/**
 * @param hasPlate
 * @param label
 */
public static void readInPlateImg(Mat mat, List<Byte>label) {
    String path="E:/HasPlate";
    File file=new File(path);

    File[] fileArray=file.listFiles();
    if(fileArray.length==0) {
        System.out.println("empty file");
    }

    for(int i=0; i<amount; i++) {

        path=fileArray[i].getAbsolutePath();
        Mat tmp=Imgcodecs.imread(path);
        width=tmp.cols();
        height=tmp.rows();
        Mat feature=Feature.extractFeature(tmp);
        mat.push_back(feature);
        label.add((byte)1);
    }
}

/**
 * @param noPlate
 * @param label
 */
public static void readInNoPlateImg(Mat mat, List<Byte>label) {
    String path="E:/NoPlate";
    File file=new File(path);
    File[] fileArray=file.listFiles();
    if(fileArray.length==0) {
        System.out.println("empty file");
    }
    for(int i=0; i<amount; i++) {
        path=fileArray[i].getAbsolutePath();
        Mat tmp=Imgcodecs.imread(path);
        Mat feature=Feature.extractFeature(tmp);
        mat.push_back(feature); 
        label.add((byte)0);
    }
}

public static void main(String []args) {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    List<Byte> label=new ArrayList<Byte>();

    Mat trainningSet=new Mat();
    Mat trainningData=new Mat();
    Mat classes=new Mat(2*amount, 1, CvType.CV_8UC1); 
    Mat clusses=new Mat();
    readInPlateImg(trainningSet, label);
    readInNoPlateImg(trainningSet, label);
    trainningSet.convertTo(trainningData, CvType.CV_32F);       

    for(int i=0; i<label.size(); i++) {
        byte[] t=new byte[1];
        t[0]=label.get(i);
        classes.put(i, 0, t);
    }
    classes.convertTo(clusses, CvType.CV_32F);
    SVM svm =SVM.create();
    svm.setType(SVM.C_SVC);
    svm.setKernel(SVM.LINEAR);
    svm.setDegree(0.1);
    svm.setGamma(1);
    svm.setCoef0(0);
    svm.setC(1);
    System.out.println("trainningDataType: "+CvType.typeToString(trainningData.type()));
    System.out.println("classesType: "+CvType.typeToString(clusses.type()));
    System.out.println(trainningData.rows()==clusses.rows());

    *svm.trainAuto(trainningData, //exception catched in this line
            Ml.ROW_SAMPLE, 
            clusses,
            10,
            SVM.getDefaultGridPtr(SVM.C),
            SVM.getDefaultGridPtr(SVM.GAMMA),
            SVM.getDefaultGridPtr(SVM.P),
            SVM.getDefaultGridPtr(SVM.NU),
            SVM.getDefaultGridPtr(SVM.COEF),
            SVM.getDefaultGridPtr(SVM.DEGREE),
            true);*

    System.out.println("classes.size(): "+classes.rows()+", "+classes.cols());
    System.out.println(label.size()+", "+trainningSet.rows()+", "+trainningSet.cols());
}

}

Exception in thread "main" java.lang.Exception: unknown exception
at org.opencv.ml.SVM.trainAuto_0(Native Method)
at org.opencv.ml.SVM.trainAuto(SVM.java:145)
at com.xjtu.svm.ReadInPlate.main(ReadInPlate.java:106)

【问题讨论】:

  • 请完成堆栈跟踪
  • 这个堆栈跟踪没有用。堆栈跟踪中是否有更多信息?究竟是什么问题?我看到您正在调用一个方法,但我们不知道方法签名或任何其他(技术)信息在幕后发生。您尝试过什么来解决这个问题?这个问题实质上是:“我有问题,请解决。”
  • @mustabelMo @Dudemanword ,我添加了所有代码,请帮我找出问题,非常感谢
  • @yadongzhou 你必须完成stacktrace,否则没人知道是什么问题
  • @mustabelMo @Dudemanword,问题解决了,是因为数据格式不符合opencv的要求

标签: java opencv svm


【解决方案1】:

主要问题是数据格式,opencv SVM要求CvType.CV_32FC1(float)作为训练数据,CvType.CV_32SC1(int)作为数据标签,所以数据格式要满足opencv的要求,改变trainningSet。 converTo(trainningData, CvType.CV_32FC1), classes.convertTo(clusses, CvType.CV_32SC1);,那么它应该可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 2015-05-04
    • 2015-07-25
    • 1970-01-01
    • 2015-04-18
    • 2015-01-22
    • 2012-01-31
    相关资源
    最近更新 更多