ページ 11

OpenGLでレンズ歪みを考慮してレンダリングする方法

Posted: 2013年8月08日(木) 00:26
by ghffmj
OpenGLでレンズ歪みを考慮してレンダリングしたいです。

・条件
OpenGLのProjection Matrix, Modelview Matrixは既知とします。
レンズ歪みはOpenCVモデルに従うとします。(distCoeffs = [k1, k2, p1, p2])
http://opencv.jp/opencv-2svn/cpp/camera ... ction.html#


3次元点をX=(x,y,z)とし、それをGLでレンダリングする(GLSLだとglModelViewProjectionMatrix * X)と、4次元ベクトルが出てきます。そこから、glReadPixelsで得る画像上の座標を取得したいです。画像座標が手に入れば、後はOpenCVモデルに当てはめれば歪ませることが出来るのですが、どうやって得ればよいかが分かりません。CVだと、3次元ベクトルが出てくるだけなので、(x/z, y/z)で取得出来ますが、GLだとどうなるのでしょうか。

Re: OpenGLでレンズ歪みを考慮してレンダリングする方法

Posted: 2013年8月08日(木) 01:19
by h2so5
質問がよく理解できていないのですが、4次元ベクトルでも同じ事で (x/w, y/w, z/w) で座標が出ます。

Re: OpenGLでレンズ歪みを考慮してレンダリングする方法

Posted: 2013年8月08日(木) 02:22
by ghffmj
ありがとうございます。同次座標なので確かにそのようにすれば座標が計算出来ますが、困っているのはGLのProjection MatrixはNear面、Far面を考慮した形となっているため、CVで設定するProjection Matrixとは異なり、そのままでは画像座標(2次元)が得られないということです。

Re: OpenGLでレンズ歪みを考慮してレンダリングする方法

Posted: 2013年8月08日(木) 09:21
by softya(ソフト屋)
OpenGLとOpenCVに詳しくないのですが、実用速度が出るか疑問なのですがそれは問題とされないという事でしょうか。
リアルタイムで歪ませる場合はシェーダーを使うと思います。

Re: OpenGLでレンズ歪みを考慮してレンダリングする方法

Posted: 2013年8月08日(木) 15:48
by ghffmj
そうですね。現在はGLSLを使っています。
vertex shaderで歪ませた場合の座標を計算して、gl_Positionにその座標を渡せばよいのですが、GLのProjection Matrixが特殊なため、この歪ませる計算部分がよくわからなくなってしまいました。。。

Re: OpenGLでレンズ歪みを考慮してレンダリングする方法

Posted: 2013年8月08日(木) 16:09
by h2so5
ghffmj さんが書きました:ありがとうございます。同次座標なので確かにそのようにすれば座標が計算出来ますが、困っているのはGLのProjection MatrixはNear面、Far面を考慮した形となっているため、CVで設定するProjection Matrixとは異なり、そのままでは画像座標(2次元)が得られないということです。
僕はここの意味が良くわかりませんでした。
Near面・Far面を考慮する、しないで具体的にどう異なるのか説明していただきたいです。
Near・Farが影響を与えるのって2次元上の座標ではなくてZ深度ではないんでしょうか?