在原生C ++插件中将ARCore图像(YUV_420_888)转换为cv :: Mat

时间:2019-02-21 11:02:28

标签: c++ opencv arcore unity3d-native-plugins

我目前正在努力将从ARCore捕获的YUV_420_888格式的图像转换为OpenCV Mat对象。我使用ARCore作为统一插件,从中我可以捕获代表图像的字节。 我还打算使用OpenCV在c ++中编写一个标记检测程序,并计划将其用作本机插件。到目前为止一切顺利。

ARCore具有返回GoogleARCore.CameraImageBytes对象的功能,该对象包含以下信息(取自传输到本机插件的单个帧):

Width: 640
Height: 480
Y Row Stride: 640
UV Row Stride: -1008586736
UV Pixel Stride: 307200

以及图像数据System.IntPtr,我可以将其转换为byte[],从而在c ++上以unsigned char *的形式接收。

这些信息通过以下函数签名传递给c ++:

extern "C" void findMarkersInImage(int width, int height, int y_row_stride, int uv_row_stride, int uv_pixel_stride,
                               unsigned char *image_data, int buffer_size)

我意识到,在此平台或其他各种平台上,有许多答案提出了转换算法。但是,它们都采用了功能来直接从图像中收集图像平面信息。说每个解决方案都依赖于调用某个称为getImageplanes(image, plane_number)的函数。此外,所有其他解决方案都调用对我不可用的AImage的使用。同样,将收集到的图像字节转换为AImage,然后转换为cv :: Mat似乎对于应该实时运行,支持但不会对整体性能造成负面影响的算法来说是一种计算过大的杀伤力。

最后我想到了三个主要问题:

  1. 有没有办法找出包含整个图像的unsigned char *中的平面位置。

  2. UV行跨度值在每一帧中都不同,不是很大,但确实如此,这是正常行为吗?

  3. 前面提到的值为负。

也许有人可以建议更多可能对我有帮助的文献。或直接回答其中一个问题。

0 个答案:

没有答案