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 であることを確認するように注意しました。結果の出力は次のとおりです。
画像を保存して表示する際に何が間違っていますか?
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;
}
これで下の図が表示されますが、まだいくつかのアーティファクトがあります。それは Tango タブレットのカメラによるものなのか、それとも生データの処理によるものなのか...何か考えはありますか?