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/