android - 在android中使用opencv加载YAML模型文件时出错
问题描述
我在 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
我不知道是什么问题,因为它在本机部分崩溃。模型文件也很大。这是一个问题吗?
请帮忙!
解决方案
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();
}
推荐阅读
- matplotlib - 如何在条形图的左侧显示负 x 值?
- reactjs - 使用自己的路由渲染另一个根路径
- flutter - 颤振容器变换
- c++ - 添加 2D 水平对齐和 2D 垂直对齐的 boost::multi_array 生成 3D 数组的最有效(时间、内存)方法是什么?
- python - 只要有待处理的取消屏蔽任务剩下但不再存在,我如何运行 asyncio 循环?
- flutter - Flutter - 弹出直到没有路线的屏幕
- python-3.x - 无法使用 cookie 登录 gmail
- c# - 从 C# 脚本调用 Matlab 函数时出错
- python - Pycharm ModuleNotFoundError Twilio 包
- join - 不了解如何正确使用子查询