Как я могу сохранить кадр с помощью 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. Результат:
Что я делаю неправильно при сохранении изображения и его отображении?
ОБНОВЛЕНИЕ за ответ Марка Маллина:
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 или от моей обработки необработанных данных... есть мысли?