2016-03-08 66 views
3

我試圖加載級聯分類中的Android應用程序,但下面的條件總是返回true,因此代碼不能執行成功:無法加載CascadeClassifier

cascadeClassifier.empty() 

的代碼如下:

try 
     { 
      InputStream is = getResources().openRawResource(R.raw.cascade); 
      File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); 
      mCascadeFile = new File(cascadeDir, "cascade.xml"); 
      FileOutputStream os = new FileOutputStream(mCascadeFile); 


      byte[] buffer = new byte[4096]; 
      int bytesRead; 

      while ((bytesRead = is.read(buffer)) != -1) 
      { 
       os.write(buffer, 0, bytesRead); 
      } 

      is.close(); 
      os.close(); 

      // Load the cascade classifier 
      cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath()); 
      if (cascadeClassifier.empty()) { 
       Log.e(TAG, "Failed to load cascade classifier"); 
       cascadeClassifier = null; 
      } 
     } 
     catch (Exception e) 
     { 
      Log.e("OpenCVActivity", "Error loading cascade", e); 
     } 

cascade.xml文件存儲在原始文件夾中,我已用python腳本成功測試過它 - 它成功檢測到對象。

如果this答案成立,那麼我不知道上面的代碼中可能會出現什麼問題,因爲訓練過的級聯已經過測試,輸入流似乎指向正確的位置(自動完成列表R.raw。級聯)。

如果有人幫助解決問題,我將非常感激。

+0

你能輸出mCascadeFile.getAbsolutePath()來測試它是否是你期望它是什麼? – Micka

回答

3

問題被實例化後CascadeClassifier添加以下行解決:

cascadeClassifier.load(mCascadeFile.getAbsolutePath()); 

工作代碼如下:

InputStream is = getResources().openRawResource(R.raw.object_detector); 
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); 
mCascadeFile = new File(cascadeDir, "cascade.xml"); 
FileOutputStream os = new FileOutputStream(mCascadeFile); 


byte[] buffer = new byte[4096]; 
int bytesRead; 

while ((bytesRead = is.read(buffer)) != -1) 
{ 
    os.write(buffer, 0, bytesRead); 
    Log.d(TAG, "buffer: " + buffer.toString()); 
} 
is.close(); 
os.close(); 
// Load the cascade classifier 
cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath()); 
cascadeClassifier.load(mCascadeFile.getAbsolutePath()); 
if (cascadeClassifier.empty()) { 
    Log.e(TAG, "Failed to load cascade classifier"); 
    cascadeClassifier = null; 
}