Question

I'm trying to use FaceRecognition with javacv. But when I have more than 5 train images I get this error:

# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6a30b400, pid=4856, tid=32
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) Client VM (24.51-b03 mixed mode, sharing windows-x86 )
# Problematic frame:
# C [opencv_core246.dll+0x4b400]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\reco\workspace\hellow\hs_err_pid4856.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

This is my code:

import com.googlecode.javacv.cpp.opencv_core;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_contrib.*;
import java.io.File;
import java.io.FilenameFilter;

public class OpenCVFaceRecognizer {
public static void main(String[] args) {
    String trainingDir = "C:/Users/reco/workspace/hellow";

    IplImage testImage = cvLoadImage("C:/Users/reco/workspace/0.png");

    File root = new File(trainingDir);

    FilenameFilter pngFilter = new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".png");
        }
    };

    File[] imageFiles = root.listFiles(pngFilter);

     MatVector images = new MatVector(imageFiles.length);

    int[] labels = new int[imageFiles.length];

    int counter = 0;
    int label;

    IplImage img;
    IplImage grayImg;

    for (File image : imageFiles) {
        img = cvLoadImage(image.getAbsolutePath());
        String temp= image.getName();
        label = Integer.parseInt(temp.charAt(0)+"");

        grayImg = IplImage.create(img.width(), img.height(), IPL_DEPTH_8U, 1);

        cvCvtColor(img, grayImg, CV_BGR2GRAY);

        images.put(counter, grayImg);

        labels[counter] = label;

        counter++;
    }

    IplImage greyTestImage = IplImage.create(testImage.width(), testImage.height(), IPL_DEPTH_8U, 1);

    //FaceRecognizer faceRecognizer = createFisherFaceRecognizer();
     FaceRecognizer faceRecognizer = createEigenFaceRecognizer();
    // FaceRecognizer faceRecognizer = createLBPHFaceRecognizer()

    faceRecognizer.train(images, labels);

    cvCvtColor(testImage, greyTestImage, CV_BGR2GRAY);

    int predictedLabel = faceRecognizer.predict(greyTestImage);

    System.out.println("Predicted label: " + predictedLabel);
}
}

edit::i just removed

    grayImg = IplImage.create(img.width(), img.height(), IPL_DEPTH_8U, 1);

    cvCvtColor(img, grayImg, CV_BGR2GRAY);

and it worked :)

Was it helpful?

Solution

    IplImage img;
    IplImage grayImg=null;

    for (File image : imageFiles) {
        img = cvLoadImage(image.getAbsolutePath(),CV_BGR2GRAY);
        int yer = image.getName().indexOf(".");
        String isim=image.getName().substring(0,yer);

        label = Integer.parseInt(isim);

        images.put(counter, img);

        labels[counter] = label;

        counter++;
    }

it is the final of my code and it works like a charm :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top