如何通过 TangoService_connectOnFrameAvailable() 保存帧并在我的计算机上正确显示它?作为此参考页 https://developers.google.com/project-tango/apis/c/struct_tango_image_buffer提到,像素以 HAL_PIXEL_FORMAT_YV12 格式存储。在 TangoService_connectOnFrameAvailable 的回调函数中,我像这样保存框架:
static void onColorFrameAvailable(void* context, TangoCameraId id, const TangoImageBuffer* buffer)
{
...
std::ofstream fp;
fp.open(imagefile, std::ios::out | std::ios::binary );
int offset = 0;
for(int i = 0; i < buffer->height*2 + 1; i++) {
fp.write((char*)(buffer->data + offset), buffer->width);
offset += buffer->stride;
}
fp.close();
}
然后删除第一行中的元数据并显示我运行的图像:
$ dd if="input.raw" of="new.raw" bs=1 skip=1280
$ vooya new.raw
I was careful to make sure in vooya that the channel order is yvu. The resulting output is:
![yv12 test image](https://i.stack.imgur.com/Rj0i3.jpg)
我在保存图像并显示它时做错了什么?
根据马克·穆林的回复更新:
int offset = buffer->stride; // header offset
// copy Y channel
for(int i = 0; i < buffer->height; i++) {
fp.write((char*)(buffer->data + offset), buffer->width);
offset += buffer->stride;
}
// copy V channel
for(int i = 0; i < buffer->height / 2; i++) {
fp.write((char*)(buffer->data + offset), buffer->width / 2);
offset += buffer->stride / 2;
}
// copy U channel
for(int i = 0; i < buffer->height / 2; i++) {
fp.write((char*)(buffer->data + offset), buffer->width / 2);
offset += buffer->stride / 2;
}
现在显示了下图,但仍然存在一些伪影;我想知道这是来自 Tango 平板电脑相机还是我对原始数据的处理……有什么想法吗?