OpenCV错误:java和opencv 3.0中的断言失败(!empty())是什么意思?

时间:2015-07-27 10:02:35

标签: java opencv image-processing

我正在尝试在java中运行代码,当我运行此代码时,它会抛出以下错误:

OpenCV Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp, line 1634
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp:1634: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
]
    at org.opencv.objdetect.CascadeClassifier.detectMultiScale_1(Native Method)
    at org.opencv.objdetect.CascadeClassifier.detectMultiScale(CascadeClassifier.java:103)
    at FaceDetector.main(FaceDetector.java:30)

我的源代码如下:

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.objdetect.CascadeClassifier;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class FaceDetector {

    public static void main(String[] args) {

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.out.println("\nRunning FaceDetector");

       CascadeClassifier faceDetector = new CascadeClassifier(FaceDetector.class.getResource("haarcascade_frontalface_alt.xml").getPath());
        //CascadeClassifier cascade1 = new CascadeClassifier("C:/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
        //CascadeClassifier cascade1 = new CascadeClassifier("C:/OpenCV/opencv/sources/data/lbpcascade/lbpcascade_frontalface.xml");
        //CascadeClassifier cascade1=new CascadeClassifier();
        //cascade1.load("C:/opencv2.4.9/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
       faceDetector.load("C:/opencv2.4.9/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
        System.out.println("step1");
        Mat image = Imgcodecs.imread(FaceDetector.class.getResource("anuj.jpg").getPath());
        System.out.println("step2");
        MatOfRect faceDetections = new MatOfRect();
        System.out.println("step3");
        faceDetector.detectMultiScale(image, faceDetections);
        System.out.println("step4");
        try {
            System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.err.println("ERROR IS HERE");
            //e.printStackTrace();
        }

        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));
        }

        String filename = "ouput.png";
        System.out.println(String.format("Writing %s", filename));
        Imgcodecs.imwrite(filename, image);
    }
}

请告诉我,我的错误是什么。我无法解决这个问题。我也在代码中尝试了很多变化,但它不起作用。

7 个答案:

答案 0 :(得分:4)

似乎没有从文件中正确加载分类器。

请确保faceDetector.load()返回true,否则文件未被读取。

答案 1 :(得分:3)

这是在5个月前发布的,但是为了那些在尝试所有提议的解决方案之后仍然会面临这一挑战的人们,还有另一种可能性,我在面对同样的挑战后发现了。如果getPath()返回的网址中有空格,则空格将返回为"%20"

例如: /C:/Users/Ayomide.Johnson/Documents/NetBeansProjects/OpenCV%20Test%20Project/build/classes/haarcascade_frontalface_alt.xml
您需要将"%20"更改回空格。

我的推文是: FaceDetector.class.getResource("x.JPG").getPath().substring(1).replace("%20", " ")它有效!

注意:substring(1)是删除路径中的初始"/"。如果您不需要该呼叫,则可以将其删除。

答案 2 :(得分:1)

var bInEditMode = false;

function onclickevent() {
    if ( bInEditMode ) return;

    bInEditMode = true;
    // TODO: call your calendar code
}

function onblurevent() {
    // TODO: call your testing code
    bInEditMode = false;
}

在Windows中提供路径时使用双斜杠。

答案 3 :(得分:1)

我也在努力解决同样的问题。指示 haarcascade_frontalface_alt.xml 文件的目录对我来说很好。你也可以尝试一下。

package faceDetection;

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.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetection
{

    public static void main(String[] args)
    {

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);


        CascadeClassifier faceDetector = new CascadeClassifier();
        faceDetector.load("D:\\OpenCv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
        System.out.println ( "Working" );
        // Input image
        Mat image = Imgcodecs.imread("E:\\input.jpg");

        // Detecting faces
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image, faceDetections);

        // Creating a rectangular box showing faces detected
        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));
        }

        // Saving the output image
        String filename = "Ouput.jpg";
        Imgcodecs.imwrite("E:\\"+filename, image);
    }
}

答案 4 :(得分:0)

将convert-buffered-image添加到mat类型变量可以解决问题。

dll

答案 5 :(得分:0)

Java没有使用getResoure("...").getPath() 因此,将所有行都更改为绝对路径,例如:"C:/Users/USER/workspace/SmallTest/bin/face.jpg" 我刚刚解决了。 对不起英文不好

答案 6 :(得分:0)

首先,在这种情况下,您应该检查CascadeClassifier是否已正确加载指定的XML资源。 有两种方法可以执行此操作:检查load()方法是否返回true。另一种方法(例如,如果你没有使用此方法只是在构造函数中指定必要的资源)是使用empty()方法来确保分类器已正确加载。