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だとどうなるのでしょうか。
OpenGLでレンズ歪みを考慮してレンダリングする方法
Re: OpenGLでレンズ歪みを考慮してレンダリングする方法
質問がよく理解できていないのですが、4次元ベクトルでも同じ事で (x/w, y/w, z/w) で座標が出ます。
Re: OpenGLでレンズ歪みを考慮してレンダリングする方法
ありがとうございます。同次座標なので確かにそのようにすれば座標が計算出来ますが、困っているのはGLのProjection MatrixはNear面、Far面を考慮した形となっているため、CVで設定するProjection Matrixとは異なり、そのままでは画像座標(2次元)が得られないということです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: OpenGLでレンズ歪みを考慮してレンダリングする方法
OpenGLとOpenCVに詳しくないのですが、実用速度が出るか疑問なのですがそれは問題とされないという事でしょうか。
リアルタイムで歪ませる場合はシェーダーを使うと思います。
リアルタイムで歪ませる場合はシェーダーを使うと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: OpenGLでレンズ歪みを考慮してレンダリングする方法
そうですね。現在はGLSLを使っています。
vertex shaderで歪ませた場合の座標を計算して、gl_Positionにその座標を渡せばよいのですが、GLのProjection Matrixが特殊なため、この歪ませる計算部分がよくわからなくなってしまいました。。。
vertex shaderで歪ませた場合の座標を計算して、gl_Positionにその座標を渡せばよいのですが、GLのProjection Matrixが特殊なため、この歪ませる計算部分がよくわからなくなってしまいました。。。
Re: OpenGLでレンズ歪みを考慮してレンダリングする方法
僕はここの意味が良くわかりませんでした。ghffmj さんが書きました:ありがとうございます。同次座標なので確かにそのようにすれば座標が計算出来ますが、困っているのはGLのProjection MatrixはNear面、Far面を考慮した形となっているため、CVで設定するProjection Matrixとは異なり、そのままでは画像座標(2次元)が得られないということです。
Near面・Far面を考慮する、しないで具体的にどう異なるのか説明していただきたいです。
Near・Farが影響を与えるのって2次元上の座標ではなくてZ深度ではないんでしょうか?