カニカニクラブライフ

Python系技術メモ、書評とか

カメラの内部パラメータと歪み係数を求めるキャリブレーションって、チェスボードを視線に水平にしなくちゃダメなんじゃないの?

 

実験して確かめる。

 

何の話?

ステレオ視の話。

・カメラキャリブレーションにより、内部パラメータ・歪み係数と、外部パラメータを求める必要がある。 (過去ブログ記事参照)

・これにはよくZhangの方法と呼ばれる、チェスボードを撮影し、マスの交点を自動探索させる方法が用いられる。

・内部パラメータ・歪み係数は、左右のカメラに対し、それぞれ個別に求める必要がある。

・カメラ位置と対象物の関係、つまり奥行きに関する直接的な情報を決めるのは、2つのステレオカメラの位置についての外部パラメータである。 

・tutorial*1でも、内部パラメータ・歪み係数を求める際には、zは一定で入力する、という記述があるし、実際のコードも、z=0を入力している。

What about the 3D points from real world space? Those images are taken from a static camera and chess boards are placed at different locations and orientations. So we need to know (X,Y,Z) values. But for simplicity, we can say chess board was kept stationary at XY plane, (so Z=0 always) and camera was moved accordingly. This consideration helps us to find only X,Y values.

・実際、内部パラメータと歪み係数を得てできる画像への操作は、レンズ方向の歪みの補正である。

 

疑問 

では、奥行き情報はひとつのカメラではわからないのだから、チェスボード内のすべての点で奥行距離を一致させなくてはいけないのでは?

→つまり、カメラに対して水平にチェスボードを設置させなくてはいけないのじゃないの?

 

・しかしながら既存のいろんな資料*2で、チェスボードを「いろんな角度で」撮影することとしている。

・そして元のZhangの論文は英語なので読む気にならない。

・そうは言っても、チェスボードのマスの大きさは与えているわけだし、マスが小さく映っているか、大きく映っているかで、カメラからの距離と、チェスボードの傾きはわかっているのじゃないの?

 

よくわからないので実験します。

方法:「チェスボードをわざと傾ける」グループと、「チェスボードまあまあ水平にした」グループで、各パラメータや補正結果に違いが出るのか。

 

●準備作業

 ・ステレオカメラ、つまり2台のカメラを用意する*3

 ・2台のカメラをなんらかの方法で固定した計測システムをつくる

 ・カメラの自動明るさ調整などのスイッチを切る*4

 ・カメラを2台接続し、同時に映像を記録するためのコードを用意する*5

 

●手順1 : 内部パラメータと歪み係数を求めて比較する

 ・キャリブレーションするコードはこんな感じ

russeng.hatenablog.jp

 

・「斜めにチェスボードを撮影した場合、交点が正確に検出できない場合がある*6」現象が起こるらしいので、目視で確認するコードを作ったりする。

 

●手順2 : 外部パラメータを求めて比較する

 ・まだやってません。

 

結果