66

私はカメラのキャリブレーション手法にまったく慣れていません... OpenCVチェス盤手法を使用しています... QuantumのWebカメラを使用しています...

ここに私の観察と手順があります..

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

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

  4. チェス盤の距離の変化でfxとはほぼ 1 でfy変化しています。との値は 200 から 400 のオーダーであり、とは距離を変化させると 300 から 700 のオーダーです。fx:fycxcyfxfy

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

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

4

2 に答える 2

143

うーん、「ハンサム」または「正確」をお探しですか?

カメラのキャリブレーションは、コンピュータ ビジョンで精度を物理的に直接定量化し、物理実験で検証できる数少ない課題の 1 つです。そして通常の教訓は、(a) あなたの数値はあなたがそれらに投入した努力 (およびお金) と同じくらい良いものであり、(b) (想像とは対照的に) 実際の精度は高価であるため、事前に何を把握する必要があるかということです。あなたのアプリケーションは実際に精度を必要とします。

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

ここでは、自家製の機器で適切なキャリブレーションを行うための (個人的な経験からの) いくつかの推奨事項を示します。

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

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

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

  4. 簡単に振動しない安定したマウントにカメラを置きます。アプリケーションに必要に応じて焦点を合わせます (アイリスがある場合はレンズの絞り値を絞ります) (キャリブレーションではありません。キャリブレーション手順とターゲットはアプリのニーズに合わせて設計する必要があり、その逆ではありません)。後でカメラやレンズに触れることさえ考えないでください。ズーム レンズや非常に広角のレンズなど、「複雑な」レンズはできるだけ避けてください。たとえば、アナモルフィック レンズには、ストック OpenCV で利用できるモデルよりもはるかに複雑なモデルが必要です。

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

  6. 写真を撮るときは、キャリブレーションボリュームをスパンしてください。理想的には、作業するスペースのボリュームに測定値が均一に分散されるようにします。最も重要なことは、一部の写真の焦点軸に対してターゲットを大きく傾けることです。焦点距離を調整するには、実際の遠近法の短縮を「見る」必要があります。最良の結果を得るには、反復可能な機械ジグを使用してターゲットを動かします。良いものは、ターゲットの動きの優れた事前モデルを提供する 1 軸のターンテーブルです。

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

  8. 良い照明を使用してください。本当。ゲームの終盤になって、カメラを調整するためにフォトンを大量に供給する必要があることに人々が気付く頻度は驚くべきものです :-) 拡散アンビエント ライティングを使用し、視野の両側にある白いカードに反射させます。

  9. コーナー抽出コードが何をしているかを見てください。検出されたコーナーの位置を画像の上に描画し (たとえば、Matlab または Octave で)、その品質を判断します。バンドル調整コードのロバスト化を信頼するよりも、厳しいしきい値を使用して異常値を早期に除去する方が適切です。

  10. 可能であればモデルを拘束します。たとえば、レンズが画像に対して中心から大きく外れていると信じる正当な理由がない場合は、主点を推定しようとしないでください。最初の試みで画像の中心に固定してください。主点の位置は、本質的に非線形歪みの中心と混同されターゲットからカメラへの移動のイメージ プレーンに平行な成分と混同されるため、通常はほとんど観測されません。それを正しく行うには、シーンの3 つ以上の独立した消失点を生成する慎重に設計された手順が必要です。非線形歪みの非常に良いブラケットです。同様に、レンズの焦点軸がセンサー平面に対して実際に傾いていると疑う理由がない限り、カメラ行列の (1,2) コンポーネントをゼロに固定します。一般的に言えば、測定値アプリケーションのニーズを満たす最も単純なモデルを使用します (それはオッカムのカミソリです)。

  11. オプティマイザから十分に低い RMS エラー (ピクセルの数十分の一、通常は以下の Josh の回答も参照) のキャリブレーション ソリューションがある場合は、残留エラーの XY パターンをプロットします (predicted_xy - すべての画像の各コーナーの測定 xy)。(0, 0) を中心とした丸い雲かどうかを確認します。外れ値の「塊」または残差のクラウドの非丸みは、何かが非常に間違っていることを警告している警告ベルです。不適切なコーナー検出またはマッチング、または不適切なレンズ歪みモデルによる外れ値である可能性があります。

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

于 2012-10-10T13:55:19.337 に答える
43

これはかなり遅い答えですが、Googleからこれに来る人々のために:

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

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

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

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

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

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

The routine provided by Francesco is good, follow that. I use a shelf board as my plane, with the pattern printed on poster paper. Make sure the images are well exposed - avoid specular reflection! I use a standard 8x6 pattern, I've tried denser patterns but I haven't seen such an improvement in accuracy that it makes a difference.

I think this answer should be sufficient for most people wanting to calibrate a camera - realistically unless you're trying to calibrate something exotic like a Fisheye or you're doing it for educational reasons, OpenCV/Matlab is all you need. Zhang's method is considered good enough that virtually everyone in computer vision research uses it, and most of them either use Bouguet's toolbox or OpenCV.

于 2014-06-09T11:33:33.023 に答える