java - 将 YUV_420_888 中的图像从 Android 发送到 OpenCV Mat 中的 JNI 的最有效方法

标签 java android opencv java-native-interface opencv4android

我有一个 android 应用程序,我想在其中对来自 android Camera2 API 的实时图像运行一些 OpenCV 图像处理。目前,如果我不进行任何处理,我可以在 OnImageAvailble 函数中以 30 fps 的速度接收常规 1280x720 帧的图像。

现在,作为一个肮脏的黑客,我从 ImageReader 以 JPEG 格式请求图像,然后将位图传递给 jni,这大大降低了性能。

将 YUV 帧传递给 cv Mat 对象中的 jni 的最有效方法是什么。另外,我想将此帧转换为 RGB 以进行进一步处理。我应该在 Java 端更改格式还是应该将 Mat 对象传递给 jni 并仅在此处转换颜色空间。

最佳答案

也许对您有帮助:由于我们进行了大量的图像处理,因此我们在公司为此编写了一个库。它不是用 C 语言编写的,但它的性能非常好。 转换后,您可以简单地将 Mat 指针通过 JNI 传递给您的 C 代码。

它将 YUV(标准 Android 相机格式 YUV_420_888)转换为 RGB Mats。此外,它还允许在转换之前有效地裁剪 YUV(对于非常大的图像很重要,否则您需要转换整个图像,然后再进行裁剪,这很昂贵)。用法很简单:

Mat mat = Yuv.toMat(image)

https://github.com/quickbirdstudios/yuvToMat

关于java - 将 YUV_420_888 中的图像从 Android 发送到 OpenCV Mat 中的 JNI 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50677063/

相关文章:

objective-c - 使用 openCV 在 iphone 中进行对象检测?模板匹配还是haar?

java - 将 Java SE 端点与嵌入式 Tomcat 结合使用

android - 工具栏上均匀分布的菜单项

android - 在 Android 的数据库中保存图像

android - Android:Android Studio中的Gradle错误

c# - 使用 OpenCV(C#、emgu cv)检测屏幕上的输入文本字段

java - 确保在 Struts 2 磁贴使用中每个 View 只有一个 html 和 body 标签

java - Android Studio Java ANR 内存泄漏

java - Clojure : java. lang.Character 无法转换为 clojure.lang.IFn

python - 如何使用 opencv 和 Python 在 ROI 内找到轮廓?