Как сохранить кадр через TangoService_connectOnFrameAvailable() и правильно отобразить его на моем компьютере? Как упоминает this reference page, пиксели сохраняются в формате HAL_PIXEL_FORMAT_YV12. В моей функции обратного вызова для TangoService_connectOnFrameAvailable, я сохранить кадр, как это:Сохранить рамку от 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. Полученный результат:
Что я делаю неправильно, сохраняя изображение и отображая его?
UPDATE в ответ Марк 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 или моей обработки необработанных данных ... какие-то мысли?