2017-06-11 14 views
1

私のSLAMプロジェクトのレンズ歪み効果をシミュレートしようとしています。 スキャンされたカラーの3D点群は既にOpenGLで与えられ、ロードされています。 私がしようとしているのは、2Dシーンを与えられた姿勢でレンダリングし、魚眼カメラからの実際の画像とレンダリングされた画像の間にいくつかの視覚的オドメトリを行います。 レンズの歪みがひどいため、レンダリング段階でも考慮する必要があります。OpenGLのカメラレンズ歪み

問題は、レンズの歪みをどこに置くかわからないということです。シェイダー?

some open codesがジオメトリシェーダに歪みを与えています。しかし、私はこの歪みモデルがコンピュータビジョンコミュニティのレンズ歪みモデルとは違うと考えています。 CVコミュニティでは、通常、投影された面にレンズ歪みが発生します。

This oneは私の仕事とよく似ていますが、歪みモデルは使用しませんでした。

誰でも良いアイデアはありますか?

ただ見つけたanother implementation。それらのコードは、フラグメントシェーダとジオメトリシェーダの両方で歪みを実装しました。しかし、私の状況では、フラグメントシェーダのバージョンを適用することができます。したがって、次のようになります:

# vertex shader 
p'=T.model x T.view x p 
p_f = FisheyeProjection(p') // custom fish eye projection 
+0

もう1つの方法は、テクスチャにレンダリングして、次に矩形にマップし、次に形状を歪ませることです。 – p10ben

答えて

2

レンズ歪みは、通常、直線を曲線に変えます。 OpenGLを使用して線や三角形をラスタライズするとき、プリミティブのエッジは、どのように頂点を変換してもそのままです。

モデルの細かさが十分であれば、歪みを頂点変換に組み込むことが可能です。ポイントをレンダリングする場合にも機能します。

しかし、あなたの目的が一般的な適用性である場合は、まっすぐに縁取られたプリミティブをどうにか処理しなければなりません。 1つの方法は、ジオメトリシェーダを使用して着信モデルをさらに細分化することです。また、テッセレーションシェーダを使用することもできます。

もう1つの方法はキューブマップにレンダリングしてからシェーダを使って同等のレンズを作成する方法です。私は実際に魚眼レンズ画像を生成するためにそれをお勧めします。

歪みそのものは、光学中心軸から歪んだ角度距離まで歪みのない角度距離をマッピングする3次〜5次の多項式で表されます。

+0

こんにちは!アイデアをありがとう。私はサーフェルベースのマップ表現を使用していますが、各ポイントには1cm以下の固定半径のディスクがあり、それは十分に小さいです。だから、私はあなたの最初の解決策は、それらを細分化せずに私のために動作すると思います。 2番目のアイデアも良いと思います。私はキューブマップをチェックします。ありがとう! –

関連する問題