为什么从 Project Tango 平板电脑中提取的图像显示为灰色?

Why does the image extracted from the Project Tango Tablet appear gray?

似乎在撰写本文时 post,Project Tango 参考确实不正确。

图片格式为NV21.

char format_str[100] = {0};

switch (tango_image_buffer->format)
{
  case TANGO_HAL_PIXEL_FORMAT_RGBA_8888:
        sprintf(format_str, "%s", "RGBA8888");
        break;
  case TANGO_HAL_PIXEL_FORMAT_YV12:
        sprintf(format_str, "%s", "YV12");
        break;
  case TANGO_HAL_PIXEL_FORMAT_YCrCb_420_SP:
        sprintf(format_str, "%s", "NV21");
        break;
  default:
        break;

}
__android_log_print(ANDROID_LOG_VERBOSE, "Capture Info",
        "stride: %u, width: %u, height: %u, timestamp: %lf, frame: %llu, format: %s",
        tango_image_buffer->stride, 
        tango_image_buffer->width, 
        tango_image_buffer->height,
        tango_image_buffer->timestamp, 
        tango_image_buffer->frame_number, 
        format_str);

上面这段代码的输出是:

   V/Capture Info﹕ stride: 1280, width: 1280, height: 720, timestamp: 22157.368703, frame: 0, format: NV21

这是我在 python 中使用 opencv 和 numpy 的新可视化代码:

import sys

import cv2
import numpy as np

input_filename  = sys.argv[1]
output_filename = sys.argv[2]


# dimensions of the image
stride    = 1280
width     = 1280
height    = 720
channels  = 4

# load file into buffer
data = np.fromfile(input_filename, dtype=np.uint8)

# create yuv image
yuv = np.ndarray((height + height / 2, width), dtype=np.uint8, buffer=data)

# create a height x width x channels matrix with the datatype uint8 for rgb image
img = np.zeros((height, width, channels), dtype=np.uint8);

# convert yuv image to rgb image
cv2.cvtColor(yuv, cv2.COLOR_YUV2BGRA_NV21, img, channels)

# display and save the resulting image
cv2.namedWindow("tango-rgba")
cv2.imshow("tango-rgba", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite(output_filename, img)

resulting image.

TLDR:图像格式为 NV21。 OpenCV 提供了将 NV21 转换为 RGB 的功能。 result 看起来很棒。