OpenCV KNearest Problem

manuue

Neues Mitglied
Hallo,
ich möchte mit meiner Software Zahlen in einem Bild erkennen und ausgeben, dazu verwende ich openCV und KNearest. In searchingData() wird nach Zahlen gesucht. Wurden Zahlen im Bild gefunden, wird ein Bildausschnitt als Matrix an recognize() weitergegeben. Beim Aufruf von model.findNearest(..) bekomme ich folgenden Fehler:

OpenCV Error: Assertion failed (test_samples.type() == CV_32F && test_samples.cols == samples.cols) in cv::ml::BruteForceImpl::findNearest, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\ml\src\knearest.cpp, line 325

Ich vermute, dass die Matrizen nicht zusammenpassen. Dennoch weiß ich nicht wie ich das Problem lösen soll. Wo liegt der Fehler?

Java:
private KNearest model;
    private Mat img;
   
    FindNumbers(Mat m) {
        img = m;
        learn();
        searchingData();
    }
   
    private void searchingData() {
       
        Mat img_gray = new Mat();
        Mat img_blur = new Mat();
        Mat img_thres = new Mat();
       
        Imgproc.cvtColor(img, img_gray, Imgproc.COLOR_BGR2GRAY);
        //Imgproc.GaussianBlur(img_gray, img_blur, new Size(5,5), 0);
        //Imgproc.adaptiveThreshold(img_blur, img_thres, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 7, 5);
        Imgproc.Canny(img_blur, img_thres, 10, 100);
       
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();   
       
        Imgproc.findContours(img_thres, contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
       
        for(int i=0; i< contours.size();i++){
           
            Rect rect = Imgproc.boundingRect(contours.get(i));

               if (rect.height < 50 && rect.height > 20){
                   
                   System.out.println(rect.x +","+rect.y+","+rect.height+","+rect.width);
                  
                   Mat subImg = new Mat();
                   Imgproc.resize(img.submat(rect), subImg, new Size(10,10));
                   
                  //Zahlen im Bild finden und an findNearest weitergeben
                   recognize(subImg);
                   //String path = String.format(".../Documents/numbers/%d.png", i);
                   //Imgcodecs.imwrite(path, subImg);
               }
        }
    }
   
    public void learn() {
       
        Mat sample = new Mat(), training_img = new Mat(), res = new Mat();
       
        for (int i = 1; i < 10; i++) {
           
            String path = String.format("..../Documents/numbers/%03d.png", i);
            sample = Imgcodecs.imread(path, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
            training_img.push_back(prepareImg(sample));

            Mat m = new Mat(new Size(1,1), CvType.CV_32FC1);
            m.setTo(new Scalar(i));
            res.push_back(m);
           
        }
        //Testbilder von Zahlen wurden schon vorbereitet, diese müssen nur noch angelernt werden
        model = KNearest.create();
        model.train(training_img, Ml.ROW_SAMPLE, res);
       
    }
   
    private Mat prepareImg(Mat img) {
        Mat sample = new Mat(), sized = new Mat();
       
        Imgproc.resize(img, sized, new Size(10,10));
        sized.reshape(1,1).convertTo(sample, CvType.CV_32FC1);
       
        return sample;
    }
   
    public void recognize(Mat getImg) {

        Mat results = new Mat();
        float result = 0;
       
        result = model.findNearest(prepareImg(getImg), 1, results);

        System.out.println(result);
    }
 

Zurück
Oben