Guardar marco de TangoService_connectOnFrameAvailable
¿Cómo puedo guardar un marco a través de TangoService_connectOnFrameAvailable () y mostrarlo correctamente en mi computadora? Comoesta página de referencia menciona que los píxeles se almacenan en el formato HAL_PIXEL_FORMAT_YV12. En mi función de devolución de llamada para TangoService_connectOnFrameAvailable, guardo el marco de esta manera:
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();
}
Luego, para deshacerme de los metadatos en la primera fila y mostrar la imagen que ejecuto:
$ dd if="input.raw" of="new.raw" bs=1 skip=1280
$ vooya new.raw
Tuve cuidado de asegurarme en vooya de que el orden del canal es yvu. El resultado resultante es:
¿Qué estoy haciendo mal al guardar la imagen y mostrarla?
ACTUALIZACIÓN según la respuesta de 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;
}
Esto ahora muestra la imagen a continuación, pero todavía hay algunos artefactos; Me pregunto si eso es de la cámara de la tableta Tango o mi procesamiento de los datos en bruto ... ¿alguna idea?