2014-12-07 60 views
10

我想我用得到的OpenCV運行以下 sample codeOpenCV的3.0.0 FaceDetect樣品失敗

我得到顯示以下錯誤行:

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) 

任何機構可以告訴我那是什麼錯誤意味着如何調試?

回答

7

發生這種情況通常有兩個原因。

  1. 級聯分類器文件lbpcascade_frontalface.xml不存在於指定的路徑。
  2. 級聯分類器文件已損壞。

要在運行時獲取錯誤消息而不是異常,請嘗試下面的代碼示例。如果無法加載級聯分類器XML,則CascadeClassifierconstructor處於靜默狀態。該責任是開發者調用empty()方法,並檢查是否分類是否正確裝入

CascadeClassifier cascade = new CascadeClassifier(CASCADE_CLASSIFIER_PATH); 
if (cascade.empty()) { 
    //handler error here 
} 

異常你得到的是來自OpenCV的本地代碼斷言here

+0

感謝那個比較好我想念拼寫到XML:S的路徑,但現在我有這個問題,它在這一行失敗:https://github.com/Itseez/opencv/blob/master/modules/cor e/src/ocl.cpp#L3961 – maxbit89 2014-12-07 17:48:56

+0

@ maxbit89對不起。我忍不住了。用更多細節分開提問可能會有幫助。 – Kiran 2014-12-07 17:55:46

+0

這裏是新的問題希望這有助於:S http://stackoverflow.com/questions/27346517/open-cv-3-0-0-face-detection-detectmultiscale-fails – maxbit89 2014-12-07 19:14:48

5

我遇到了運行在Windows機器上的同樣的錯誤。此示例運行在Linux上,但不是Windows。

問題出在.getPath()調用getResource()爲xml文件和圖像。

問題是,URL.getPath()URL.getFile()都返回格式爲「/ c:/ ...」的絕對路徑。 OpenCV例程在此扼殺它,它必須是「c:/ ...」(不是前導'/')。這似乎是版本3.0.0早期的一個錯誤?

我希望這會有所幫助,OpenCV for Java似乎是一個很好的工具......但是當這些示例不起作用時,這有點令人沮喪。

18

我也遇到了這個問題。問題出在.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

這應該是答案,如果你正在使用opecv 3.0.0 – 2015-09-11 03:10:14

+0

這應該是使用opencv 3時的答案 – 2016-07-21 15:15:23

1

有與最新的OpenCV的問題WHN你有空間在你的路徑,以便做到這一點不起作用:

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()); 
0

我碰到了同樣的問題:在Windows上,OpenCV的扼流圈就像Imad和Aung都注意到的那樣,在路徑中的前綴'\'和任何空格中。我的解決方案比伊馬德的短一點:

更改此:

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