opencvのキャリブレーション関数による内部パラメータの出力の値に関して疑問


イブラヒモ  2013-11-27 03:40:20  No: 73834

opencvでキャリブレーションをしました。しかし内部パラメータ中のCx、Cyという主点の値の意味がよくわかりません。僕の理解では、「光軸が通る点で、普通は画像の単純な中心を通るよう設計されているがカメラ構造そのものの誤差やキャリブレーションの精度による誤差で若干中心からずれた値が出てくるもの」です。合っているでしょうか?しかし2560×1920ピクセルの画像に対し、出力された値がCx=441、Cy=553くらいで、明らかに中心から外れています。この理由を教えてください。ちなみにこの内部パラメータと歪み係数を使って、歪み補正した画像は綺麗に補正画像が現れました。なのでCx、Cyは正常な値が出ているとおもうのですが、、、


オショウ  2013-11-27 18:33:07  No: 73835

内部パラメータの説明は理解されましたか?

> 内部パラメータと外部パラメータの初期値が計算された後, 逆投影誤差の
> 総和(実際の画像上の座標と cvProjectPoints2 で画像上に投影した座標の
> 差の二乗の総和)が最小になるように各パラメータが最適化される.

と、記載されていますので、座標空間の実座標がcvMatで表現されていること
には、ならないと思うのですが・・・

文面からは、正しくキャリブレーションされ、変換されていますので問題は
無いのですよネ?!

以上。


ホウジョウウサギ  2013-11-27 19:23:08  No: 73836

内部パラメタのキャリブレーションって結局は最適化計算なので,
あるパラメタ値が真の値と大きくずれているとしても
そのパラメタ値を用いて計算したら十分に誤差が小さくなる  なんてことがあると
その値(Local Miminum)を結果として出てしまうということはあり得ると思います.
なので,撮影画像が,目に見えて歪んでいるほど推定しやすく,
そうでないほど,真のパラメタ値(に近い値)を推定しにくい  ということになるような気がします.

  >歪み補正した画像は綺麗に補正画像が現れました
  とのことですが,
  そもそも補正前の原画の時点で歪がほとんど見られない,ということはありませんでしょうか?

既にやられているかもしれませんが,
良い初期値がある程度想像できるのであれば,それを明示的に与えてみると良いかもしれません.

(Cx,Cy)に関する意味的な話は,意図して場所をずらすような設計でなければ
通常はだいたいそうなんじゃないかと思います.
ただ,「若干」という量は思っているよりも大きいかもしれません.
(1pixelに相当するイメージセンサ上の実サイズを考えると,
  本当にちょっとずれただけでもピクセル数にしたら結構な量だったりとか)


イブラヒモ  2013-11-28 00:47:48  No: 73837

オショウさんご返信ありがとうございます。
>座標空間の実座標がcvMatで表現されていること
には、ならない
これはどういった意味でしょうか?
確かに補正できたのはいいのですがこれでゴールではなく、ステレオ撮影をして、距離計測をしようと考えていますのでパラメータを細かく見ていく必要があります。


イブラヒモ  2013-11-28 00:59:15  No: 73838

ホウジョウウサギさん、返信ありがとうございます。
私が使っているカメラはGopro  hero3という有名なアクション小型カメラで、超広角レンズです。したがってめちゃくちゃ樽状に歪みがあります。僕が今やっているのはこのカメラを2台平行に配置し単純な幾何学的関係から奥行距離を調べることです。そういうわけで内部パラメータの値にこだわっているのです。
ちょっと質問が変わるのですが焦点距離がfx,fyと二つでてくるのは何故でしょうか?焦点距離は一つではないのですか?


ホウジョウウサギ  2013-11-28 02:15:08  No: 73839

fx,fyがあるのは,像の縦横比を表現できるようにだと思います.
例えば,「撮影画像を横方向にだけ1.2倍くらいに引き伸ばしたような絵を出力してくるカメラ」
とかがあったら,fxとfyがそれなりに異なる値になります.
(ビデオカメラで撮った絵をPCに取りこんだらそんな感じの絵になった経験があります)
内部パラメタの意味(というかカメラモデルの数式)については
OpenCVのリファレンスマニュアルでも説明されていますので,一度確認されると良いと思います.

樽型歪が目に見えて存在していて,
その歪曲の中心が画像中心付近にあるだろうことが見てわかるような絵なのであれば,
明らかに(Cx,Cy)の結果値がおかしいと思われるので
キャリブレーションの作業がうまくいってないような気がします.

校正結果の確認方法として  歪除去画像を見る  だけでは不十分に思います.
(かなりあまいパラメタ値でも,それなりにまっすぐに見えてしまうことがあるので.)
キャリブレーション作業を行う際にはパターンボード撮影画像を何十枚も使うと思いますが,
特徴点の3次元推定座標を  校正結果パラメタを用いて  画像に逆投影した座標を
それら撮影画像に重畳表示し,正しい位置に一致するかを確認できれば良いのですが……
cvCalibrateCamera2()とかだと外部パラメタを返してくれないので無理?
(戻り値を指標にはできそうですが,
  final re-projection error とだけ書かれているので
  全特徴点での総和なのか,平均とかなのかがいまいち不明ですね.)

あとは,
パターン撮影画像から得られた特徴点座標がおかしくなっていないか?を
全て目視で確認して,
認識に失敗した絵のデータがうっかり校正計算に用いられていないかを再確認すると良いかもしれません.


イブラヒモ  2013-11-28 05:48:24  No: 73840

ホウジョウウサギさん、早い返信ありがとうございます。
opencvの内部パラメータについてリファレンスもう一度熟読します。
たしかに逆投影したポイントが正しいか見るのは手だと思いますが難しいと思います。また、特徴点座標は、チェスパターンの交点が認識できなければプログラムが終了し、成功すれば特徴点が映し出された画像が返され次の画像を読み込むというものです。25枚のパターン画像を読み込み、返されたものを実行中すべて1枚1枚表示され、確認して、次に進んでいるのでそこは大丈夫だと思うのですが、、
また、fxが4805、fyが4970と出てきたのですがこれを用いて距離を割り出すととんでもないことになりました。方法はカメラのレンズ間を平行にh=10cmでならべ、左右の画像から対象物の位置の視差|XlーXr|=400pixを画像からピクセル単位で求め、ワールド座標系のz軸を左カメラの光軸と設定すれば(奥行)=fh/|XlーXr|となってこれに代入して、f=4900pixとするとzが120cmくらいになります。しかし対象物は20cm前に置きました。これってfの値が上手くいっていないからでしょうかね?たしかにカメラを平行にしたり視差をイメージJのカーソルを使ったりカメラ間を定規で測ったりとゴリゴリの手作業でやっていますが対象物が近いのでこんなにずれるわけないと思っています。


ホウジョウウサギ  2013-11-28 18:29:53  No: 73841

●パラメタ初期値を指定しても改善が見られないでしょうか?
cvCalibrateCamera2()であれば,
[Cx, Cy, fx, fy]の4つは初期値を与えることができるので,
Cx,Cyを画像中心,
fx,fyはカタログスペックから求めた値(もちろんカメラモデルの数式に見合う値で)
として与えてみましょう.
Cx,Cyを初期値に固定するモードもあるようなので,どうしても変な箇所が出てきてしまうようなら,
最終手段として,
「Cx,Cyだけを何か別の方法で求め,その値を指定して,残りのパラメタだけを推定させる」という使い方もあるかも.
(例えば,歪具合が魚眼レンズくらいはっきりしていれば,Cx,Cyだけはある程度:少なくとも現状よりはマシな  精度で推定できますよね.)

●画像が25枚というのは個人的には少ないようにも思います.

私が校正作業をする際には,パターンの撮影は,

・それなりの数撮る(予備も含めて80枚くらいとか.特徴点が取れない絵とかも出てくるので)
・画像群全体によって,視野全体が網羅されるようにする
  (特徴点が視野全体に分布するようにする.
・且つ,画像の分布が極端に偏らないこと
  (視野左側のパターンを撮ったら,同じようにして右側を撮るなどして)
・視野外周においては特徴点がなるべく視野ぎりぎりに存在するように撮る
  (パターンの四角形が見切れる形になるので特徴点認識処理が難しくなるのだけど…)
・カメラ→ボード  距離もある程度バリエーションを設ける
  (ボードが視野全体を覆うようにしたり,
    ボードの長辺が画像幅の半分くらいになるようにしたり,とか.
    ただ,この行為が有益か否かは不明w.
    ボードが近いほどパターンの歪がよくわかる絵が撮れるので有益なのかな?
    そう考えると,あまりにも遠すぎ=パターン像が小さすぎる絵はあまり意味が無いかもしれませんが…)

といったことを意識して行っています.
何か一つでもヒントになれば良いのですが.


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加