Ask Your Question
0

OpenCV Face detection works on PC but not on Laptop

asked 2015-09-17 21:04:31 -0600

RolandC gravatar image

updated 2015-09-18 10:22:34 -0600

I was trying out the face detection mechanism of OpenCV 3.0 using Java 8u40, i. e. the very simple HelloOpenCV example. Exactly the same code and libraries on PC and Laptop.

Problem

The face gets detected on my PC, but not on my laptop. Both are Win7 x64. I tried executing the code in a development environment and I created a JAR and executed it on both system. Same problem. The face detection doesn't work on the laptop. However, I found out that the haar cascades work on the laptop.

Question

Does anyone how it could be possible that the face gets detected with exactly the same code on the one system and not on the other?

Is there some way to activate OpenCV logging in the Java version? There aren't any exceptions.

Code

Code is the HelloOpenCV code from here:

http://docs.opencv.org/master/d9/d52/...

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
class DetectFaceDemo {
  public void run() {
    System.out.println("\nRunning DetectFaceDemo");
    // Create a face detector from the cascade file in the resources
    // directory.
    CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("/lbpcascade_frontalface.xml").getPath());
    Mat image = Imgcodecs.imread(getClass().getResource("/lena.png").getPath());
    // Detect faces in the image.
    // MatOfRect is a special container class for Rect.
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);
    System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
    // Draw a bounding box around each face.
    for (Rect rect : faceDetections.toArray()) {
        Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
    }
    // Save the visualized detection.
    String filename = "faceDetection.png";
    System.out.println(String.format("Writing %s", filename));
    Imgcodecs.imwrite(filename, image);
  }
}
public class HelloOpenCV {
  public static void main(String[] args) {
    System.out.println("Hello, OpenCV");
    // Load the native library.
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    new DetectFaceDemo().run();
  }
}

Thank you very much for the help!

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
1

answered 2015-09-18 00:34:47 -0600

berak gravatar image

updated 2015-09-18 01:37:55 -0600

"Is there some way to activate OpenCV logging in the Java version? " - none of the functions used will throw exceptions(not even in c++), you will have to do manual checks:

import org.opencv.imgproc.*;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
class DetectFaceDemo {
  public void run() {
    System.out.println("\nRunning DetectFaceDemo");
    // Create a face detector from the cascade file in the resources directory:
    String cascadePath = getClass().getResource("/lbpcascade_frontalface.xml").getPath();
    //
    // maybe we should get rid of the whole getClass().getResource()getPath() cruft
    // in favour of a simple String containing the (absolute) path, 
    // like "d:/ocv/lbpcascade_frontalface.xml"
    //
    // also note, that opencv functions cannot read from a zip/jar/apk file,
    // so the whole 'resource' approach might be inappropriate.
    //
    CascadeClassifier faceDetector = new CascadeClassifier(cascadePath);

    // sanity check:
    if (faceDetector.empty()) {
        System.out.println("could not load cascade from " + cascadePath);
    }

    String imgPath = getClass().getResource("/lena.png").getPath();
    Mat image = Imgcodecs.imread(imgPath);

    // sanity check:
    if (image.empty()) {
        System.out.println("could not load image from " + imgPath);
    }

    // Detect faces in the image.
    // MatOfRect is a special container class for Rect.
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);
    System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
    // Draw a bounding box around each face.
    for (Rect rect : faceDetections.toArray()) {
        Imgproc.rectangle(image, new Point(rect.x, rect.y), 
                                 new Point(rect.x + rect.width, rect.y + rect.height), 
                                 new Scalar(0, 255, 0));
    }
    // Save the visualized detection.
    String filename = "faceDetection.png";
    System.out.println(String.format("Writing %s", filename));
    boolean ok = Imgcodecs.imwrite(filename, image);
    // sanity check:
    if (! ok) {
        System.out.println("could not save image to " + filename);
    }

  }
}
public class HelloOpenCV {
  public static void main(String[] args) {
    System.out.println("Hello, OpenCV");
    // Load the native library.
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    new DetectFaceDemo().run();
  }
}
edit flag offensive delete link more

Comments

Thank you, but that didn't work either, i. e. no errors shown. I even created a JAR and executed exactly the same code on both systems. It works on the PC, but not on the Laptop. It does however work with the haar cascades on both systems. A note: the getPath() doesn't work on windows, you have to use getPath().substring(1). Better yet would be to use Paths.get(...) to get a proper path. Anyway, problem isn't solved unfortunately.

RolandC gravatar imageRolandC ( 2015-09-18 10:20:57 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2015-09-17 21:04:31 -0600

Seen: 245 times

Last updated: Sep 18 '15