Frame von TangoService_connectOnFrameAvailable speichern

Wie kann ich einen Frame über TangoService_connectOnFrameAvailable () speichern und auf meinem Computer korrekt anzeigen? Wiediese Referenzseiteei Erwähnungen werden die Pixel im Format HAL_PIXEL_FORMAT_YV12 gespeichert. In meiner Rückruffunktion für TangoService_connectOnFrameAvailable speichere ich den Frame wie folgt:

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();
}

Dann, um die Metadaten in der ersten Zeile zu entfernen und das von mir ausgeführte Bild anzuzeigen:

$ dd if="input.raw" of="new.raw" bs=1 skip=1280
$ vooya new.raw

Ich habe in vooya darauf geachtet, dass die Kanalreihenfolge yvu ist. Die resultierende Ausgabe ist:

Was mache ich falsch, wenn ich das Bild speichere und anzeige?

UPDATE per Mark Mullins Antwort:

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;
}

Dies zeigt jetzt das Bild unten, aber es gibt immer noch einige Artefakte. Ich frage mich, ob das von der Tango-Tablet-Kamera oder meiner Verarbeitung der Rohdaten kommt ... irgendwelche Gedanken?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage