我正在尝试让OpenCV运行我正在使用以下内容 sample code
我显示以下错误行:
OpenCV Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, file ..\..\..\..\opencv\modules\objdetect\src\cascadedetect.cpp, line 1580
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: ..\..\..\..\opencv\modules\objdetect\src\cascadedetect.cpp:1580: 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:176)
at org.maxbit.opencv.samples.DetectFaceDemo.run(SampleB.java:29)
at org.maxbit.opencv.samples.SampleB.main(SampleB.java:51)
任何机构都可以告诉我该错误的含义或如何调试吗?
答案 0 :(得分:19)
我也遇到了这个问题。问题出在.getPath()返回格式的绝对路径。
例如:" / C:/Users/projects/FaceDetection/bin/com/face/detection/haarcascade_frontalface_alt.xml"。
所以改变这样的代码。
CascadeClassifier faceDecetor = new CascadeClassifier(FaceDetection.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1));
答案 1 :(得分:7)
这种情况通常有两个原因。
lbpcascade_frontalface.xml
在指定路径中不存在。要在运行时获取错误消息而不是异常,请尝试使用以下代码示例。如果CascadeClassifier
constructor无法加载级联分类器XML,则它是静默的。开发人员有责任调用empty()
方法并检查分类器是否正确加载
CascadeClassifier cascade = new CascadeClassifier( CASCADE_CLASSIFIER_PATH );
if ( cascade.empty() ) {
//handler error here
}
您获得的异常来自OpenCV本机代码断言here。
答案 2 :(得分:5)
我遇到了在Windows机器上运行的同样错误。此示例在Linux上运行,但不在Windows上运行。
问题出在.getPath()
之后,getResource()
调用xml文件和图像。
问题是URL.getPath()
和URL.getFile()
都返回格式为“/ c:/ ...”的绝对路径。
OpenCV例程阻塞它必须是“c:/ ...”(没有前导'/')。这似乎是版本3.0.0早期的一个错误?
我希望这会有所帮助,OpenCV for Java似乎是一个很棒的工具......但是当示例不起作用时,它会有点令人沮丧。
答案 3 :(得分:1)
最新的openCV存在问题,当你的路径中有空格时它不起作用,所以这样做:
String s =CameraPanel.class.getResource("lbpcascade_frontalface.xml").getPath().substring(1);
String[] split = s.split("%20");
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < split.length-1; i++) {
stringBuilder.append(split[i]+" ");
}
stringBuilder.append(split[split.length-1]);
faceDetector = new CascadeClassifier(stringBuilder.toString());
答案 4 :(得分:0)
我遇到了同样的问题:在Windows上,OpenCV会在前面的'\'和路径中的任何空格上窒息,正如Imad和Aung都注意到的那样。我的解决方案比Imad的短一点:
改变这个:
CascadeClassifier faceDecetor = new CascadeClassifier(
getClass().class.getResource("haarcascade_frontalface_alt.xml").getPath());
对此:
CascadeClassifier faceDecetor = new CascadeClassifier(
getClass().class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1).replaceAll("%20", " "));
答案 5 :(得分:0)
对我来说,最简单的解决方案是:
private void checkboxSelection(String classifierPath) {
// load the classifier(s)
faceCascade.load(classifierPath);
// Did it work?
if (faceCascade.empty()) {
// Try the full path
String resource = getClass().getResource(classifierPath).getPath();
// Discard leading / if present.
if ( resource.startsWith("/")) {
resource = resource.substring(1);
}
faceCascade.load(resource);
}
// now the video capture can start
cameraButton.setDisable(false);
}
答案 6 :(得分:0)
我正在使用openCv 3.4.1 我认为CascadeClassifier初始化程序中有一个错误。 为了摆脱此错误,我必须再次调用“ load”。希望该解决方案可以有所帮助。
[
{
"@type": "Element_Lists",
"Name": "Some_Element_Name",
"Description": "Some_Element_Description",
"URL": "Some_Element_URL"
}
]
答案 7 :(得分:0)
我在Mac(OSX)Java上遇到了问题。
CameraFrame.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1)
returned "Users/username/Desktop/JavaProjects/Camera/bin/haarcascade_frontalface_alt.xml".
而路径应以"/"
开头,因此我附加了"/"
。
face = new CascadeClassifier("/" +
CameraFrame.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1));
现在可以正常使用:)
答案 8 :(得分:0)
我也面临着同样的问题。仅仅是因为您为“ haarcascade_frontalface_alt2.xml”提供的路径可能不正确或不正确。只需从文件资源管理器复制完整路径并粘贴即可。此解决方案对我有用。
face_cascade = cv2.CascadeClassifier('C:/Users/xyz/FaceDetect/faceId/OpenCV-Python-Series-master/src/cascades/data/haarcascade_frontalface_alt2.xml')