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