0

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 であることを確認するように注意しました。結果の出力は次のとおりです。 yv12 テスト画像

画像を保存して表示する際に何が間違っていますか?

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 タブレットのカメラによるものなのか、それとも生データの処理によるものなのか...何か考えはありますか?

yv12 テスト 2

4

2 に答える 2