Ошибка при загрузке файла модели YAML с использованием opencv в Android - PullRequest
0 голосов
/ 30 ноября 2018

Я использую OpenCV для обнаружения лицевой ориентир в Android.Я использую 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 Ответ

0 голосов
/ 30 ноября 2018

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

...