2016-03-08 156 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; 
}