如何通过 TangoService_connectOnFrameAvailable() 保存帧并在我的计算机上正确显示?正如此参考页面所述,像素以 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
我小心翼翼地确保在 vooya 中频道顺序是 yvu。结果输出是:
我在保存图像并显示它时做错了什么?
根据 Mark Mullin 的回复更新:
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 平板相机还是我对原始数据的处理……有什么想法吗?