4

我正在处理以 YUV_420 _888 编码的 Android camera2 预览帧,方法是从 Libyuv 库中调用 I420ToARGB 方法,但我得到的图像颜色错误。

 libyuv::I420ToARGB(
    ysrc, //const uint8* src_y,
    ystride, //int src_stride_y,
    usrc, //const uint8* src_u,
    ustride, ///int src_stride_u,
    vsrc, //const uint8* src_v,
    vstride, //int src_stride_v,
    argb, //uint8* dst_argb,
    w*4, //int dst_stride_argb,
    w, //int width,
    h //int height
);
4

1 回答 1

3

如果红色对象显示为蓝色,反之亦然,则 U 和 V 颜色平面向后。根据 Android 开发人员文档,这些平面是:

http://developer.android.com/reference/android/graphics/ImageFormat.html#YUV_420_888

由 Image#getPlanes() 返回的数组中的平面顺序得到保证,即平面 #0 始终为 Y,平面 #1 始终为 U (Cb),平面 #2 始终为 V (Cr)。

另外,这个 libyuv 方法似乎不支持像素步幅,对于 YUY_420_888 图像,像素步幅可能大于 1。在这种情况下,当像素步幅大于 1 时,您需要将平面预处理为连续的,或者使用从 libyuv 接受半平面 420(如果存在)的方法。

于 2016-03-22T19:58:12.660 回答