最も正確なカメラキャリブレーションを取得するにはどうすればよいですか?


16

まず、これが正しいStack Exchangeボードであることを願っています。そうでない場合、私の謝罪。

カメラのキャリブレーションを必要とするものに取り組んでいます。OpenCV(C ++)でこれを行うためのコードを正常に実装しました。内蔵のチェス盤機能と印刷したチェス盤を使用しています。

インターネットには、チェス盤の複数のビューを提供し、各フレームからコーナーを抽出することを述べた多くのチュートリアルがあります。

最も正確なカメラキャリブレーションを取得するために、関数に与える最適なビューのセットはありますか?キャリブレーションの精度に影響を与えるものは何ですか?

たとえば、何も動かさずに同じビューの5つの画像を与えると、ウェブカメラフィードを歪ませようとすると、まっすぐな結果が得られます。

ご参考までに:非対称円のグリッドとそれぞれのOpenCV関数を使用することで、より良いカメラキャリブレーションが必要であることが最近わかりました。

回答:


8

さまざまな視点と角度からキャリブレーション用の画像を取得する必要がありますが、角度の差は可能な限り大きくします(3つのオイラー角はすべて異なる必要があります)が、パターンの直径がカメラの視野に収まるようにしました。使用するビューが多いほど、より良いキャリブレーションになります。キャリブレーション中に焦点距離と歪みパラメータを検出し、最小二乗法でそれらを取得するには異なる角度が必要になるため、これが必要です。カメラをまったく動かさないと、新しい情報が得られず、キャリブレーションは役に立ちません。通常、焦点距離のみが必要であることに注意してください。一般消費者向けカメラ、ウェブカメラ、携帯電話カメラでも歪みパラメータは通常無視できます。カメラの仕様から焦点距離がすでにわかっている場合は、キャリブレーションさえ必要ないかもしれません。

歪み係数は、広角や360度などの「特殊な」カメラに多く存在します。

キャリブレーションに関するウィキペディアのエントリを次に示します。そして、ここに非線形歪みがありますが、これはほとんどのカメラでは無視できます。


オイラーの角度では、x、yのチェス盤を中心にカメラを回転させ(チェス盤をピボットとして)、zのチェス盤にカメラを近づけたり遠ざけたりすることを意味すると思いますか?変形したチェス盤を簡単にプリントアウトし、カメラを同じ場所に置いている人のことを読みました。例えば:i.imgur.com/rYzV4.pngi.imgur.com/McG9z.png。このようなものを使用することは、物事が現実にどのように混乱するかを表していない可能性があるため、貧弱な決定ですか?
チーター

はい、カメラの移動について。はい
mirror2image

@ mirror2image実際の操作では、さまざまな角度を変更する方が良いということです。しかし、それは異なる見解が異なる世界調整システムを持つことを意味します。オブジェクトポイントを同じ調整システムに保持するために、共有ワールド調整システムを使用する必要がありますか?
リチャード

3

@Ben-ビューの数は、カメラと必要な最終的な精度に依存します。

歪みをマッピングするために多くのチェスボード画像を使用する非常に高品質で歪みの少ないレンズ(ハイエンド35mm SLR)では、歪みはピクセルの一部であるため、不安定になる可能性があります。
通常、画像の中心は公称x / 2、y / 2の数ピクセル以内であり、フォーカスに応じて変化するため、ボード(またはカメラ)を回転させた状態でいくつかのショットが必要です。そしてもちろん、ズームはすべてを変えます。

レンズチップの中心と焦点距離(XとY)が得られたら、カメラの位置を与えるためにショットに1枚のチェス盤が必要です。


キャリブレーションが非常に悪くなりますが、正直なところその理由がわかりません。壁に印刷されたチェス盤があり、カメラをさまざまな位置に移動しているため、チェス盤上でさまざまなビューが表示されますが、opencvでundistort機能を使用すると、元のものと比べて非常に奇妙で歪んでいます。私のカメラはMicrosoft LifeCam Studio 1080pです。
チーター

@Benオートフォーカスを無効にします。小さなレンズのウェブカメラでは、焦点距離とレンズ中心が焦点に応じて変化します。中心にぴったり合うように十分に回転していますか?四角がコーナーに出ていますか?最後に、すべてのターゲットですべての正方形が検出されていることを確認します。
マーティンベケット

オートフォーカスはすでに無効になっています。十分に定義しますか?私はできる限り極端な角度でポイントを拾おうとしています。画像に抽出された角を描画する関数を意味する場合、「角に出る正方形」が何を意味するのかわかりません-はい。また、すべてのコーナーが検出されたことを確認するためのチェックも既に行っています。私は私の問題だと思うかもしれない私は、キャリブレーション関数に渡すことを本質的なマトリックスに初期の焦点距離を設定したもので横たわります。私は1:1、16:9(ウェブカメラのアスペクト比だと思います)を試しましたが、何も試してみません
チーター

@Martinカメラを文房具の位置に保ち、カメラとチェスボードの間の距離を変えずにチェスボードの向きを変えることでキャリブレーションを行うことは可能ですか??

@Santosh-はい、それは明らかに完全に同等です。さまざまな角度をカバーしていることを確認する必要があります
マーティンベケット

3

この回答をここに投稿することにしました。しばらくして、これがGoogleでの最高の結果として浮上し、その提案が私を助けてくれたからです。そこで、私も自分の経験を共有することにしました。

Kinectで最高のステレオキャリブレーションを取得するために数え切れないほどの時間を費やしてきたので、ここのブログ投稿でヒントと発見を共有しました

ステレオキャリブレーション、具体的にはKinectを対象としていますが、このヒントはカメラをキャリブレーションしようとしている人に役立つと思います。

また、いつか死ぬか、ホスティングを更新するのを忘れた場合に備えて、投稿の引用を修正しました。

  1. 可能な限り最大のキャリブレーションパターンがあることを確認してください。上記の説明に従ってください。プロが印刷した素敵なパターンを入手してください。各正方形が少なくとも8cm x 8cmであることを確認してください。また、キャリブレーションパターンの片側に奇数の正方形があり、反対側に偶数の正方形があることを確認してください(たとえば、9×6または7×8)。ターゲットのポーズを正しく検出するために重要です。また、一部のツールボックスは、この要件が満たされていないパターンを検出できません。前述したように、大きなシートに印刷するのに適した使用したパターンは、ここ(9cmの正方形の場合)とここ(10cmの正方形の場合)にアップロードされます。
  2. 印刷パターンの周囲に十分な白い境界線があることを確認してください。そうしないと、ほとんどのツールボックスで簡単に検出されない場合があります。
  3. Kinectが動かないことを確認してください。Kinectを三脚に取り付けるためにマウントを使用しました。
  4. できるだけ多くのキャリブレーションターゲットの画像を取得してください。私の最高のキャリブレーションは、カメラから0.5メートルから10メートルの距離で300枚の画像を使用して得られました。X、Y、Z軸を中心にパターンを回転させてください。また、同じ距離で撮影した画像でビューを「タイル化」してみてください。つまり、ある画像を撮影し、ターゲットを視野内の次のタイルに移動し、別のタイルを撮影して、視野。目標は、各距離で可能な限り視野全体をカバーすることです。
  5. 可能であれば、MATLABのステレオキャリブレーションアプリを使用します。これにより、各キャリブレーションフェーズの後に外れ値を取り除くことができます。

2

以下は、最初にここに投稿したカメラキャリブレーションの「ベストプラクティス」のリストです。https//calib.io/blogs/knowledge-base/calibration-best-practices

  • 適切なサイズのキャリブレーションターゲットを選択します。パラメータを適切に制約するのに十分な大きさ。できればそれはおよそカバーするべきです。カメラ画像で正面平行に見たときの総面積の半分。
  • 最終アプリケーションのおおよその作動距離(WD)でキャリブレーションを実行します。カメラはこの距離で焦点を合わせる必要があり、キャリブレーション後に焦点は変わらないはずです。
  • ターゲットの機能数が多い必要があります。細かいパターンを使用することをお勧めします。ただし、ある時点で検出の堅牢性が低下します。3MPx以上のカメラで、照明が適切に制御されている場合は、細かいパターンカウントを使用することをお勧めします。
  • さまざまな領域と傾きから画像を収集します。ターゲットを動かして画像領域を完全に覆い、均一なカバレッジを目指します。レンズの歪みは、正面平行画像のみから適切に決定できますが、焦点距離の推定は、短縮の観察に依存しています。正面平行な画像と、水平方向と垂直方向の両方で最大+/- 45度まで傾けたボードで撮影した画像の両方を含めます。機能のローカリゼーションの精度が低下するため、通常、もっと傾けることは良い考えではありません。
  • 良い照明を使用してください。これはしばしば見落とされますが、非常に重要です。較正ターゲットは、制御された写真照明によって拡散照明されることが望ましい。強い点光源は不均一な照明を発生させ、場合によっては検出に失敗し、カメラのダイナミックレンジをあまり活用しません。影でも同じことができます。
  • 十分な観察が必要です。通常、キャリブレーションは、キャリブレーションターゲットの少なくとも6つの観測(画像)で実行する必要があります。高次のカメラまたは歪みモデルが使用される場合、より多くの観測が有益です。
  • CharuCoボードなどの一意にコード化されたターゲットの使用を検討してください。これにより、カメラセンサーとレンズの端から観測値を収集できるため、歪みパラメーターを非常に適切に制限できます。また、単一の特徴点が他の要件を満たさない場合でも、データを収集できます。
  • キャリブレーションは、使用するキャリブレーションターゲットと同じくらい正確です。レーザー印刷されたターゲットは、検証とテストにのみ使用してください。
  • キャリブレーションターゲットとカメラの適切な取り付け。大きなターゲットで歪みと曲がりを最小限に抑えるには、垂直に取り付けるか、剛性のあるサポートに平らに置きます。これらの場合は、代わりにカメラを移動することを検討してください。高品質の三脚を使用し、取得中にカメラに触れないようにします。
  • 悪い観察を削除します。再投影エラーを慎重に検査してください。ビューごとおよび機能ごとの両方。これらのいずれかが外れ値として表示される場合は、それらを除外して再調整します。

キャリブレーションターゲットのPDFを生成するオンラインツールは、https//calib.io/pages/camera-calibration-pattern-generatorにあります。


こんにちは、DSP SEへようこそ。ここでは、一般的に自己宣伝の回答は歓迎されません。より質の高い回答にすることを検討してください。
jojek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.