2

この画像があり、その中にオブジェクト(立方体)があるとします。そのオブジェクトは(ラベルを使用して)追跡されており、仮想キューブをその上にレンダリングすることができます(拡張現実)。仮想立方体をその上にレンダリングできるようになったので、「修復」と呼ばれる非常に基本的な現実性の低下した手法を使用して、オブジェクトを「非表示」にできるようにしたいと思います。問題のインペイントは非常に単純であり(そうでない場合はFPSが低下します)、ピクセルとその隣接ピクセルに対していくつかの操作を行う必要があります(ガウスぼかしやその他の基本的な画像処理など)。

それを行うには、最初に必要なものは次のとおりです。

  1. マスク:白い立方体が入った黒い背景。
  2. 初期画像の各ピクセル(座標xとy)とその近傍にアクセスし、同じx座標とy座標でのマスクのピクセル値に基づいて処理を行います。したがって、基本的にマスクは、このピクセルを無視するか、このピクセルを使用すると言う方法として機能します。

OpenGLを使用してこれを行うにはどうすればよいですか?隣接するピクセル値に1つずつ、できれば2Dでアクセスできるようにしたいと思います。

FBOまたはPBOを使用しますか?バッファやメソッドについて多くのことを読みましglDrawPixels()たが、それらをすべてまとめるのに苦労しています。私がこの方法を見た論文はGL_BACKバッファーを使用していましたが、私のものはすでに使用されています。私はまだOpenGLの初心者なので、いくつかのサンプルコード(C ++)は、すべての形式(OpenG`呼び出し)で本当に感謝されます。

私のARライブラリ(Aruco)はOpenCV上で動作するため、OpenGLでピクセル操作が難しすぎる場合はOpenCVを使用することも考えています。その場合でも、マスク(黒い背景に白い立方体)を取得し、それをに変換してからcv::Mat処理を行う必要があります。

私はこのアプローチが非効率的であることを知っています(GPU / CPUから行き来する)が、私の目標(今のところ)は少なくとも基本を機能させることです。

4

1 に答える 1

2

フレームバッファオブジェクトを設定して、元の画像と仮想立方体をレンダリングします。これがチュートリアルです。

次に、そのフレームバッファテクスチャを次のステージの入力(サンプラー)テクスチャとしてアタッチし、マスクを覆う四角形(2つの三角形)をレンダリングできます。

フラグメントシェーダーでは、変数gl_FragCoordを読み取ることで、「画面座標」をサンプリングできるはずです。テクスチャフィルタ機能をGL_NEARESTとして設定すると、正確なテクスチャ座標にアクセスできます。また、隣接するピクセルは変位で使用できます(deltaX = 2 / Width、deltaY = 2 / Height)。

現在アクティブなフレームバッファは書き込み専用であるため、以前のフレームバッファテクスチャをソースとして使用することは必須です。

于 2012-12-24T08:25:27.300 に答える