简体   繁体   English

opencv java SVM API nullPointException

[英]opencv java SVM api nullPointException

This is the question, I don't know how to handle it. 这是问题,我不知道如何处理。 The problem line is in svm.trainAuto(param1,....) . 问题行在svm.trainAuto(param1,....) I read 400 imgs and stored in trainningSet (200 has car plate and 200 not), and their labels stored in classes, I wanna train a SVM model but trainAuto method catch an exception. 我读了400个IMGS并存储在trainningSet (200汽车板和200没有),并存储在班它们的标签,我想训练一个SVM模型,但trainAuto方法捕获异常。 The trainningData and clusses is not null, i already checked, trainningData和clusses不为null,我已经检查过了,

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)

The main problem is the data format, opencv SVM requested CvType.CV_32FC1(float) for trainning data and CvType.CV_32SC1(int) for data's label, so the data format should satisfied opencv's request, and change trainningSet.converTo(trainningData, CvType.CV_32FC1) , classes.convertTo(clusses, CvType.CV_32SC1); 主要问题是数据格式,opencv SVM请求CvType.CV_32FC1(float)用于训练数据,而CvType.CV_32SC1(int)用于数据标签,因此数据格式应满足opencv的要求,并更改trainningSet.converTo(trainningData,CvType。 CV_32FC1)classes.convertTo(clusses,CvType.CV_32SC1); , then it should work. ,那么它应该可以工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM