Java OpenCV haarcascade_frontalface_default.xml

标签 java xml opencv javacv

import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import static com.googlecode.javacv.cpp.opencv_objdetect.*;

public class FaceDetection{

    public static final String XML_FILE = 
            "resources/haarcascade_frontalface_default.xml";

    public static void main(String[] args){

        IplImage img = cvLoadImage("resources/lena.jpg");       
        detect(img);        
    }   

    public static void detect(IplImage src){

        CvHaarClassifierCascade cascade = new 
                CvHaarClassifierCascade(cvLoad(XML_FILE));
        CvMemStorage storage = CvMemStorage.create();
        CvSeq sign = cvHaarDetectObjects(
                src,
                cascade,
                storage,
                1.5,
                3,
                CV_HAAR_DO_CANNY_PRUNING);

        cvClearMemStorage(storage);

        int total_Faces = sign.total();     

        for(int i = 0; i < total_Faces; i++){
            CvRect r = new CvRect(cvGetSeqElem(sign, i));
            cvRectangle (
                    src,
                    cvPoint(r.x(), r.y()),
                    cvPoint(r.width() + r.x(), r.height() + r.y()),
                    CvScalar.RED,
                    2,
                    CV_AA,
                    0);

        }

        cvShowImage("Result", src);
        cvWaitKey(0);

    }           

异常

OpenCV Error: Unspecified error (The node does not represent a user
object (unknown type?)) in cvRead, file src\persistence.cpp, line 4976
Exception in thread "main" java.lang.RuntimeException:
src\persistence.cpp:4976: error: (-2) The node does not represent a
user object (unknown type?) in function cvRead

有人知道如何解决这个问题吗?

最佳答案

据我所知,您正试图将 OpenCV haarcascades XML 资源文件传递给 cvLoad 函数,该函数并非设计用于处理 Java 资源文件,因为它是一个 C++ 函数,不知道这个概念。

我遇到了同样的问题,我找到的唯一解决方法是将此 xml 文件从 Java 资源复制到临时目录,将其提供给 cvLoad 函数,然后将其删除。有效。此外,它还有一个特殊的 OpenCV 函数,它可以完成所有这些工作。

我使用了 https://github.com/bytedeco/javacv/blob/master/samples/FaceApplet.java 中的示例

String classiferName = "haarcascade_frontalface_alt.xml";

// copying xml file into temp directory
File classifierFile = Loader.extractResource(classiferName, null, "classifier", ".xml");
if (classifierFile == null || classifierFile.length() <= 0) {
    throw new IOException("Could not extract \"" + classiferName + "\" from Java resources.");
}

// Preload the opencv_objdetect module to work around a known bug.
Loader.load(opencv_objdetect.class);

classifier = new CvHaarClassifierCascade(cvLoad(classifierFile.getAbsolutePath()));

// deleting temp file
classifierFile.delete();
if (classifier.isNull()) {
     throw new IOException("Could not load the classifier file.");
}

希望对您有所帮助!

关于Java OpenCV haarcascade_frontalface_default.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899800/

相关文章:

php - 如何使用 php simpleXML 在现有 xml 中添加节点?

python - Minidom - 检查 XML 中是否存在标签

python - OpenCV CascadeClassifier Python 内存不足

java - 设置CheckboxTableViewer的标题

java Swing 重复使用 JFrame.pack() - 效率如何?

Java:有界类型的 getClass()

xml - 在 Eclipse 中维护关于自动格式化的 XML 注释部分的格式

opencv - 我正在使用拼接器类从多个图像创建全景图。如何减少计算时间?

python - 当参数在方括号中时,文档中的含义是什么?

java - 检查以确保在执行之前至少已进行一次调用 - 此方法必须返回 int 类型的结果