web-dev-qa-db-ja.com

ウェブカメラのキャリブレーションの正確さを確認する方法は?

カメラキャリブレーションテクニックはまったく初めてです... OpenCVチェスボードテクニックを使用しています... Quantumのウェブカメラを使用しています...

これが私の観察と手順です。

  1. 各チェスの正方形の辺= 3.5 cmを維持しました。それは6 x 4内側の角を持つ7 x 5のチェス盤です。ウェブカメラから1〜1.5 mの距離で、異なるビュー/ポーズで合計10枚の画像を撮影しています。
  2. Learning OpenCV by BradskiのCコードに従っています。キャリブレーション用のコードは

    cvCalibrateCamera2(object_points,image_points,point_counts,cvSize(640,480),intrinsic_matrix,distortion_coeffs,NULL,NULL,CV_CALIB_FIX_ASPECT_RATIO);
    
  3. この関数を呼び出す前に、焦点距離の比を一定に保ち、CV_CALIB_FIX_ASPECT_RATIOを使用して、固有の行列の対角線に沿って最初と2番目の要素を作成しています。

  4. チェスボードの距離が変化すると、fxfyfx:fyが1にほぼ等しくなり、cxcyの値が順番に変化します距離を変更すると、fxfyは300から700のオーダーになります。

  5. 現在、歪み係数を含む良い結果が得られなかったため、すべての歪み係数をゼロにしました。私の元の画像は、歪みのないものよりもハンサムに見えました!!

キャリブレーションを正しく行っていますか? CV_CALIB_FIX_ASPECT_RATIO以外のオプションを使用する必要がありますか?はいの場合、どれですか?

49
rotating_image

うーん、あなたは「ハンサム」または「正確」を探していますか?

カメラキャリブレーションは、コンピュータービジョンにおいて非常に数少ない対象の1つであり、物理的な観点から精度を直接定量化し、物理的な実験によって検証することができます。そして、通常の教訓は、(a)あなたの数字はあなたがそれらに費やす努力(およびお金)と同じくらい良いことであり、(b)実際の正確性(想像とは対照的に)が高価であるため、事前に何を理解すべきかあなたのアプリケーションは本当に正確さを求めています。

非常に安価なレンズ/センサーの組み合わせ(メガピクセル以上)の幾何学的仕様を調べてみると、サブサブmmのキャリブレーション精度が卓上の空間内で理論的に達成可能であることがすぐにわかります。 (カメラのセンサーのスペックシートから)1ピクセルの立体角を計算するだけで、財布の届く範囲にある空間解像度に驚かされます。ただし、実際にその理論的な精度に近いものを実際に達成するには作業が必要です。

自家製の機器で良好なキャリブレーションエクスペリエンスを得るための推奨事項(個人的な経験から)を次に示します。

  1. メソッドでフラットターゲット(「チェッカーボード」など)を使用する場合は、適切なターゲットを製造します。非常に平らなバッキングを選択します(サイズが5 mm以上の窓ガラスの場合は明らかに優れていますが、明らかに壊れやすいです)。別のエッジ(またはレーザービーム)に対して平坦度を確認します。簡単に伸びない厚手の紙にパターンを印刷します。接着する前に裏地に印刷した後に置き、正方形の辺が実際にほぼ直交していることを確認します。安価なインクジェットプリンターまたはレーザープリンターは、厳密な幾何学的精度を目的として設計されたものではなく、盲目的に信頼しないでください。ベストプラクティスは、専門のプリントショップを使用することです(Kinkoでさえ、ほとんどの家庭用プリンターよりもはるかに優れた仕事をします)。次に、スプ​​レー式の接着剤を使用して、泡や伸びを防ぐために柔らかい布でゆっくりと拭いて、パターンを裏に非常に慎重に取り付けます。接着剤が硬化し、糊紙のストレスが長期的な定常状態に達するまで1日以上待ちます。最後にmeasure良いキャリパーと拡大鏡のあるコーナー位置。 「平均」平方サイズの1つの数値で逃げることができますが、それは実際の測定値の平均であり、希望と祈りの平均ではないはずです。ベストプラクティスは、測定された位置のテーブルを実際に使用することです。

  2. 温度と湿度の変化に注意してください。紙は空気から水分を吸収し、裏材は膨張して収縮します。環境条件(またはそれらに対するターゲットの応答)を引用することなく、サブミリメートルの校正精度を報告する記事をいくつ見つけることができるかは驚くべきことです。言うまでもなく、それらはほとんどがらくたです。一般的な板金に比べてガラスの温度膨張係数が低いことが、前者をバッキングとして好むもう1つの理由です。

  3. 言うまでもなく、カメラのオートフォーカスを無効にする機能が必要です:レンズ内の1つまたは複数のガラスを物理的に動かして、視野を(わずかに)変えるそして(通常は大量に)レンズの歪みと主点。

  4. 振動しにくい安定したマウントにカメラを置きます。アプリケーションに必要なフォーカス(レンズに虹彩がある場合はFストップ)(キャリブレーションではなく、キャリブレーション手順とターゲットは、アプリのニーズに合わせて設計する必要があり、その逆ではありません)。後でカメラやレンズに触れても思考しないでください。可能な限り、「複雑な」レンズは避けてください。ズームレンズまたは非常に広角のもの。魚眼レンズまたはアナモルフィックレンズには、OpenCVが提供するストックよりもはるかに複雑なモデルが必要です。

  5. 多くの測定値と写真を撮ります。画像ごとに数百の測定(コーナー)と数十の画像が必要です。データが関係する場合、より多くの陽気です。 10x10チェッカーボードは、私が検討する絶対的な最小値です。私は通常20x20で働いていました。

  6. 写真を撮るときにキャリブレーションボリュームをスパン。理想的には、作業対象の空間の容積に測定値を均一に分散させたいと考えています。最も重要なことは、ターゲットを焦点軸に対して大幅に角度を付けるいくつかの写真で-実際の遠近法の短縮を「見る」必要がある焦点距離を調整することです。最良の結果を得るには、反復可能な機械式治具を使用してターゲットを移動します。良いものは、1軸のターンテーブルです。これにより、ターゲットの動きの優れた事前モデルが得られます。

  7. 写真を撮るときの振動とそれに伴うモーションブラーを最小限に抑えます。

  8. 良い照明を使用してください。本当に。ゲームの後半で、カメラのキャリブレーションにフォトンが必要だと人々が気づくのを見るのは驚くべきことです:-)拡散アンビエント照明を使用し、視野の両側の白いカードで反射させます。

  9. コーナー抽出コードの動作を確認してください。検出されたコーナー位置を画像の上に描き(MatlabやOctaveなどで)、その品質を判断します。厳密なしきい値を使用して異常値を早期に削除する方が、バンドル調整コードの堅牢性を信頼するよりも優れています。

  10. 可能な場合はモデルを制約します。たとえば、レンズが画像の中心から大幅に外れていると考える正当な理由がない場合は、主点を推定しようとせず、最初の試行で画像の中心に固定してください。主点の位置は、本質的に混同されるため、通常はあまり観察されませんwith非線形歪みの中心およびbyカメラの翻訳。それを正しく行うには、シーンの3つ以上の独立した消失点を生成する慎重に設計された手順が必要です。and非線形歪みの非常に優れたブラケット。同様に、レンズの焦点軸が本当に傾いていると疑う理由がない限り、センサープレーン、カメラマトリックスの(1,2)コンポーネントをゼロに固定します。一般的に、測定を満たす最も単純なモデルを使用しますandアプリケーションのニーズ(これはOckamのカミソリです)。

  11. 十分に低いRMSエラー(通常、ピクセルの数十分、以下のJoshの回答も参照)のオプティマイザーからのキャリブレーションソリューションがある場合、残差エラーのXYパターン(predicted_xy -すべての画像の各コーナーのmeasured_xy)および(0、0)を中心とする丸みを帯びた雲かどうかを確認。異常値の「塊」または残差の雲の非円形性が叫び声を上げています何かが非常に間違っているという鐘-悪いコーナー検出またはマッチング、または不適切なレンズ歪みモデルによる可能性のある外れ値。

  12. 余分な画像を取得してソリューションの精度を確認します。これらを使用して、レンズの歪みが実際に除去されていること、およびキャリブレーションモデルによって予測される平面ホモグラフィが実際に測定コーナーから回復したものと一致することを確認します。

115

これはかなり遅い回答ですが、Googleからこれにアクセスする人にとっては:

キャリブレーションの精度を確認する正しい方法は、OpenCVが提供する再投影エラーを使用するです。なぜこれが回答やコメントのどこにも記載されていないのかはわかりません。手動で計算する必要はありません。calibrateCameraの戻り値です。 Pythonでは、最初の戻り値です(カメラマトリックスなどがそれに続きます)。

再投影エラーは、固有係数を使用してポイントが投影される場所と、実際の画像内の場所との間のRMSエラーです。 通常、0.5px未満のRMSエラーを予期する必要があります-マシンビジョンカメラで定期的に0.1pxを取得できます。再投影エラーは多くのコンピュータービジョンの論文で使用されていますが、キャリブレーションがどれほど優れているかを判断するための非常に簡単または正確な方法はありません。

ステレオシステムを使用していない限り、ポイントではなくレイまでの3D空間のどこかでしか解決できません。ただし、各平面キャリブレーション画像のポーズを計算できるため、各チェス盤のコーナーがイメージセンサーのどこにあるかを計算することができます。キャリブレーションプロセス(多かれ少なかれ)は、これらの光線が当たる場所を解決しようとし、すべての異なるキャリブレーションイメージでエラーを最小限に抑えます。 Zhangの元の論文とその後の評価では、約10〜15枚の画像で十分なようです。この時点で、画像を追加してもエラーは大幅に減少しません。

Matlabのような他のソフトウェアパッケージは、個々の組み込み関数のエラー推定値を提供します。焦点距離、投影の中心。 OpenCVがその情報を吐き出すことはできませんでしたが、おそらくどこかにあるのでしょう。カメラキャリブレーションはMatlab 2014aでネイティブになりましたが、コンピュータービジョンユーザーに非常に人気のあるカメラキャリブレーションツールボックスを引き続き入手できます。

http://www.vision.caltech.edu/bouguetj/calib_doc/

目視検査は必要ですが、結果を処理する場合は十分ではありません。探すのが最も簡単なのは、歪みのない画像では世界の直線が直線になるです。それを超えると、出力画像を見るだけでカメラが適切に調整されているかどうかを本当に確認することは不可能です。

Francescoが提供するルーチンは優れています。それに従ってください。棚板を飛行機として使用し、パターンをポスター用紙に印刷します。画像が十分に露出していることを確認してください-鏡面反射を避けてください!私は標準の8x6パターンを使用し、より密度の高いパターンを試しましたが、違いを生むほどの精度の向上は見ていません。

この答えは、カメラを調整したいほとんどの人にとって十分であると思います-魚眼レンズのようなエキゾチックなものを調整しようとしている場合、または教育的な理由でそれをしている場合を除き、現実的にはOpenCV/Matlabが必要です。 Zhangの方法は十分に優れていると考えられており、コンピュータービジョン研究のほぼすべての人がそれを使用しており、それらのほとんどはBouguetのツールボックスまたはOpenCVを使用しています。

29
Josh