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?