• ベストアンサー

カメラ画像のアフィン変換について

カメラの特性と画像処理にお詳しい方にお伺いします。 カメラを使ってある風景Aを撮影して、そのカメラ位置を保持しながら後ろへ数m下がって、同じ風景Bを撮影します。2枚の画像A,Bを比べると、視差がある為、画像中心から外へ広がるほど相対的な歪が大きくなっていきます。この時、画像Aにアフィン変換Fによる画像処理を施して歪を無くし、画像Bを拡大したものがほぼぴったり画像Aになるようにしたいのです。(u,v)=F(x,y)の関数F、若しくはその導出の仕方を教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.6

[1] 被写体までの距離が長い方をカメラA、短い方をカメラBとします。被写界深度が無限大であるような理想的ピンホールカメラを考えます。  まず、画面の端でなくても、カメラAから見えてカメラBからは見えない部分が存在しうることはお分かりでしょうか。すなわち、カメラBとカメラAの中点を頂点とする円錐(先端を切って円錐台にします)を考えると、その円錐の側面はカメラBからは見えなくなりますが、カメラAからは見える。このとき、円錐の側面がカメラAから見てどう見えるか、という情報の手掛かりは、カメラBの映像からは全く得られません。このことから、カメラBの映像からカメラAの映像を推定するのは不可能と分かります。 また例えば、多数の、色々な大きさの正方形を空間に配置して、大きい正方形はカメラAから遠くに、小さい正方形は近くに並べることで、規則的な市松模様カメラAから見て規則的な市松模様(規則的に並んだ、同じ大きさの正方形)が見えるように調整することが必ず可能です。このとき、カメラBから見てどう見えるか、という情報の手掛かりは、カメラAの映像(市松模様)からは全く得られません。ゆえに、カメラAの映像からカメラBの映像を推定するのは不可能と分かります。  従って、立体物である、という性質については諦めるしかないんです。それで、被写体までの距離はどちらのカメラも十分遠くて、しかも被写体の持つ奥行きは小さいと仮定するしかない。これはすなわち、被写体をカキワリと見なすことに他なりません。収差のない理想的なカメラではただ拡大・縮小するだけのことです。カキワリなら距離が分かっていてもおかしくないんで、拡大率も決められます。(立体物では物の場所ごとに距離が違う。それでなお距離が分かっているなら、それは立体の構造が分かっているも同然であり、モデリング・レンダリングをやれば良い。) [2] 一方、カメラA、Bがピンホールカメラではなくて独特の収差を持っているとなると、A,Bの違いは拡大・縮小だけではなくなります。これは画像の歪み方を変換する問題であって、被写体としてカキワリを撮影しても歪みの変換は必要です。歪みの性質を、市松模様のようなテストパターンを使って測定することがまず必要ですね。 上記二つの、それぞれ別の問題を混同していらっしゃるように思うのですけど。

sisibaba
質問者

お礼

よく分かりました。なんとなくですが、無理のような気がしてきました。 ただ、私が考えている環境は、かなり限定されたものですので、もう少し曖昧性を踏まえて考えて見たいと思います。 回答しにくい質問でしたが、詳細に説明して頂きありがとうございました。

その他の回答 (5)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.5

理想的なカメラの話ですね。 カメラの中心軸と垂直な平面に描かれたカキワリを撮影したのだったら、単に像の大きさが変わるだけです。(勿論、ご質問はこんなことを問題になさってるのではない。) もし被写体が立体物であるなら、ある距離で撮影した像から別の距離で撮影した像を計算で作り出すことはできません。両者の像は単なる拡大・縮小ではない。被写体各部の像の大きさの違いは、カメラからその部分までの距離によって違ってきます。そして、カメラで撮った像には奥行きの情報が欠落している。だから計算では出ないのです。(「写真だけ見ても、カキワリに描いてある絵を撮影したのか、立体物を撮影したのかを区別できない」と言っても同じです。) 逆に言えば、異なる距離で撮影した一対の像から、対応する点をいちいち同定できたとするなら、その点までの距離を算出することが可能です。(原理的には。実際にはなかなか精度が出ないでしょうけれど。) さて、ご質問は「ほぼぴったり」ということですが、せいぜい「適当な距離にカキワリがあるのを撮影した」と仮定して、単に像を拡大・縮小をするしかありません。でも、カキワリまでの距離は全く分からないんで、倍率が決まらない。かくて、結論:ムリ。ってことになります。

sisibaba
質問者

補足

ご回答ありがとうございます。 お返事遅くなりまして、申し訳ありません。 まず、被写体としているのは、カキワリではなく、立体物です。 ですので、立体構造によっては、カメラAからは見えていて、カメラBからは見えない部分というものも出てきますが、その部分に関しては諦めていて、そういう意味で「ほぼぴったり」と書きました。 (カメラBから見えていて、カメラAから見えない部分である、画像の端の方は無視して頂いて構いません。) 今、仮想環境でシミュレーションしているので、立体物を単純な直方体と考えると、サイズや位置は正確に分かります。その時のA→Bへの変換関数が分かるとしたら、その関数は他の立体物であっても適用できるのかということをお伺いしたいです。。 また、何かありましたら、宜しくお願いします。

noname#108554
noname#108554
回答No.4

真剣に考えてみました。 問題設定は、カメラの位置を原点、垂直方向をz軸に、 カメラの向いているほうをx軸にとります。 風景Aまでの距離をa、Bまでの距離をbとします。 このとき、問題は、 A上の点(a,y,z)→B上の点(b,u,v)への射影をy,zを使って書け、 と、こうなります。 画角が十分小さい場合、スクリーン(仮想の)は、 ほとんど平面と見なせるはずなので、 画像AとBは相似で、u=by/a,v=bz/a となります。 さて、問題は画角が十分大きい場合ですが、 同じようにいけるのではと・・・思いますが。 座標を定義しなおさなければならないかな。極座標で。

sisibaba
質問者

お礼

お返事遅くなりまして、申し訳ありません。 画角が十分小さい場合(遠くの画像)は、確かに相似になり問題ないはずですが、 それは、質問にも書いたとおり、画像中心付近は歪が無いのです。問題は、画角が広がるほど(近くの画像)差が大きくなっていくのです。その部分をうまく変換する関数がないかなと思いました。 しかし、「極座標」というのは、なにかヒントになったような気がします。 もう少し考えて見たいと思います。 分からないながらも、一緒に考えていただき、本当にありがとうございました。

noname#108554
noname#108554
回答No.3

ちょっと待ってくださいね。 真剣に考えてみます。 まず、与えられている量を教えてください。 それと、考えている状況を教えてください。 カメラのAを写した時の位置、Bを写した時の位置、 あと画角は与えられている、ということですか? ほかに与えられている量はありませんね? 別に魚眼レンズを使ったとかいうこともなく、 球面収差やら、コマ収差(だったかな)も考えなくていいんですね? そのへんを言われると私の力では到底計算できませんので。

sisibaba
質問者

補足

真剣に考えて頂けるということで、感謝いたします。。 まず、この話はまだ実環境を考慮しておらず、仮想環境で行っています。 ですので仮想カメラは理想的なカメラ(なはず)ですので、収差は無いと思われます。環境がAutoCadですので、カメラの詳細な設定はできないようで、画角もよく分かりません。が、180°の魚眼でなければ何でもいいです。 (できれば定数α[rad]として考えて頂きたいです) AとBの距離も変動するので、数mとしか言えませんが、これも定数で考えていただきたいです。 ibm111さんしか頼れる人がいないので、どうぞよろしくお願いします。m_ _m

noname#108554
noname#108554
回答No.2

>恐らく関数Fはn次関数になりそうです。 >(u,v)=(ax^n,by^n) のa,b,nが導出できればと思います。 あれ・・・?アフィンじゃなかったんですか? それはいいですが、具体的にa,b,nを求めようと思ったら、 適当に分かりやすい点を取って(人物なら目の位置とか) グラフにして求めるしかないのではないでしょうか。

sisibaba
質問者

お礼

関数にしろ、アフィンにしろ、画像を変形すると言うことでは同値だと考えていました。。 >それはいいですが、具体的にa,b,nを求めようと思ったら、 >適当に分かりやすい点を取って(人物なら目の位置とか) >グラフにして求めるしかないのではないでしょうか。 やっぱ、そうするしかないですかね~(悲 カメラの画角などから求められたらいいな~と思います。

noname#108554
noname#108554
回答No.1

全然回答が来ていないようですので、 アドバイス(になるかどうか)をひとつ。 そのアフィン変換により移動しなかった点(不動点)の 座標を原点に、x軸を写真の横軸、y軸を縦軸に取ります。 すると、アフィン変換なので、a,bを非負実数として (u,v)=(ax,by) となりますよね。 あとは不動点をどう求めるかですが、 数学セミナー 2002年2月号「不動点から何が見えるか」 の記事「不動点を見せる」「不動点の存在について」 あたりが参考になるでしょうか。

sisibaba
質問者

お礼

早速のお返事ありがとうございました。 ご指摘の「不動点」は2画像間で歪の無い部分ですから、画像の中心になりそうですね。恐らく関数Fはn次関数になりそうです。(u,v)=(ax^n,by^n) のa,b,nが導出できればと思います。また、何か分かりましたら、よろしくお願い致します。

関連するQ&A

専門家に質問してみよう