android - OpenCV Native Android cvtColor 崩溃
问题描述
我需要将图像转换为灰度,然后再转换回 RGBA 才能在其中绘制。
目前,我正在使用两个不同的 cvtColor 调用来做这件事,虽然在 Android 中性能不佳(RGBA -> GREY -> RGBA),但效果很好。
直接从相机获取灰度图像更快,并且只需执行一次 cvtColor 调用就会产生巨大的差异(GRAY -> RGBA)。
问题是第二种方法会使应用程序在几秒钟后关闭。Android Studio 中的 logcat 没有显示应用程序崩溃,但在选择 No Filters 选项时会显示一些错误。这是日志https://pastebin.com/jA7jFSvu。这似乎表明 OpenCV 的相机存在问题。
下面是两段不同的代码。
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
// Method 1 - works
cameraImage = inputFrame.rgba();
native.exampleProcessImage1(cameraImage.getNativeObjAddr(), cameraImage.getNativeObjAddr());
return cameraImage;
// Method 2 - app closes after a few seconds
cameraImage = inputFrame.gray();
Mat result = new Mat();
native.exampleProcessImage2(cameraImage.getNativeObjAddr(), result.getNativeObjAddr());
return result;
}
这是我在 C++ 中的代码:
void Java_com_example_native_exampleProcessImage1(JNIEnv *env, jobject instance, jlong sourceImage, jlong destImage) {
// works!
Mat &src = * ((Mat *) sourceImage);
Mat &dest = * ((Mat *) destImage);
Mat pivot;
// src is RGBA
cvtColor(src, pivot, COLOR_RGBA2GRAY);
cvtColor(pivot, dest, COLOR_GRAY2RGBA);
// dest is RGBA
// process
}
void Java_com_example_native_exampleProcessImage2(JNIEnv *env, jobject instance, jlong sourceImage, jlong destImage) {
// does not work
Mat &src = * ((Mat *) sourceImage);
Mat &dest = * ((Mat *) destImage);
// src is GRAY
cvtColor(src, dest, COLOR_GRAY2RGBA);
// dest is RGBA
// process
}
这在 Linux 和 OpenCV 上按预期工作。
你知道我做错了什么吗?有没有其他方法可以达到同样的效果?性能是关键,尤其是对于 Android 设备。
先感谢您。
解决方案
对于第二种情况,您有内存泄漏,这会导致泄漏
~ 3 sec * fps * frame_resolution * 4 bytes
我认为内存已满后会发生崩溃。
你需要result.release();
在每次exampleProcessImage2
通话后打电话给某个地方
推荐阅读
- javascript - 从 csv 添加数字
- android - 来自 IntentService 的启动活动在 Android 12 中不起作用
- node.js - 反应生产 npm 运行命令以代码 0 退出
- javascript - 我的请求在 Postman 中有效,而不是在浏览器中(React、Node、Cloudinary)
- mysql - 如何使用 SQL 获取列中某个值的百分比?
- c# - 顶级委托引用无法解析
- python - pandas.series.diff 奇怪的输出
- java - 在 Windows 上使用 Jar 文件启动 JMeter 时出现白色空白屏幕
- ruby-on-rails - 升级到 Rails 6 后,rspec-rails 在控制器测试中停止存根视图
- flutter - 消费者未使用 notifyListeners() 进行更新