代码之家  ›  专栏  ›  技术社区  ›  Sar

在android中使用opencv加载YAML模型文件时出错

  •  4
  • Sar  · 技术社区  · 6 年前

    我在android中使用opencv进行面部地标检测。我正在使用JNI与库进行交互。我已将“lbfmodel.yaml”文件保存在资产中,并尝试加载:

    const char* jnamestr2 = jenv->GetStringUTFChars(jModelFileName, NULL);
    cv::String stdFileName2(jnamestr2);
    LOGD( "jModelFileName path : %s", jnamestr2);
    FacemarkLBF::Params params;
    params.model_filename = stdFileName2;
    params.cascade_face = stdFileName;
    Ptr<FacemarkLBF> facemark = FacemarkLBF::create(params);
    

    但我收到了一个错误:

    Invalid address 0x9b2d2e08 passed to free: value not allocated
    Fatal signal 6 (SIGABRT), code -6 in tid 27673
    

    我已经记录了文件路径,它是:

    jModelFileName path : /data/user/0/com.ds.openworld/app_model/lbfmodel.yaml
    

    我不知道是什么问题,因为它在本土正在崩溃。模型文件也很大。这是个问题吗?

    请帮忙!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Florian Echtler    6 年前

    OpenCV不能直接使用存储为资产的文件,首先需要将其转换为“常规”文件。请使用以下代码片段:

    public String initAssetFile(String filename)  {
        File file = new File(getFilesDir(), filename);
        if (!file.exists()) try {
            InputStream is = getAssets().open(filename);
            OutputStream os = new FileOutputStream(file);
            byte[] data = new byte[is.available()];
            is.read(data); os.write(data); is.close(); os.close();
        } catch (IOException e) { e.printStackTrace(); }
        Log.d(TAG,"prepared local file: "+filename);
        return file.getAbsolutePath();
    }
    

    原始资料来源: https://github.com/mmbuw/mis-2018-exercise-4-opencv/blob/master/app/src/main/java/com/example/mis/opencv/MainActivity.java#L129-L139

    推荐文章