両眼視位ポジショニングキャリブレーション機能の技術的な詳細を掘り下げます

       両眼のポジショニングについて言えば、今の私のように、既成の公式を使い、いくつかの定義を理解し、それらのパラメーターの意味を理解する人は多いと思いますが、詳細には張正陽教授の校正アルゴリズムすら理解されていないと推定されます。マトリックス計算のスキルが必要なため、数学的な基礎がないか、基礎が強くなく、深く理解することは不可能です。私は2年間両眼視力に携わっています。以前は深度マップを生成したり、両眼レンジングを実行したりしていました。コードをコピーしてインターネットに貼り付けて変更しました。しかし今、高精度の両眼視力ポジショニングを開発するには、深くする必要があります。掘り下げて、イメージング光路のすべての側面を理解します。ここでは、新しい友達のための道を開くために、オンラインでより適切に要約したいくつかのブログを提供します:https//www.cnblogs.com/zyly/p/9366080.html  ;このブログは、イメージング調整プロセスを体系的に説明するだけでなく、一連のリファレンスブログがブログ投稿の最後にリストされています。それを置いてくれてありがとう!"ビッグウルトラマンは小さなモンスターと戦う";

           今日は、まずレンズの歪みについてお話します。歪みのないレンズはありませんが、歪みの大きさが異なります。たとえば、4.3mmカメラ(小型USBカメラ)を使用する場合、基本的にフラットレンズです。レンズの歪みを考慮する必要があります。デプスマップや距離測定をしている場合は、基本的には問題ありませんが、いずれも精度が低く、誤差が大きいかどうかは関係ありません。張正陽の校正方法やMatlibダブルターゲットを使って精度を判断するのは素晴らしいことです。しかし、正確な測定を行い、mmとの精度を絡ませたい場合、これらの方法は必ずしも満足できるものではありません。たとえば、あなたは今私を満足させることはできません!何をすべきか、技術的な詳細を掘り下げて、ルートを見つけてください!

           張の校正方法の素晴らしさは、校正プロセスを簡略化してA4用紙のチェッカーボードを印刷し、比較的高い精度を得ることができることです。写真測量カメラの校正フィールドにA4用紙を貼り付けることはできません。ただし、ZhangZhengyouキャリブレーション方法は引き続き使用できます。ただし、この方法は、さまざまな要因をより真剣に考慮して、キャリブレーションの問題に対処するために使用されます。これがメソッドイノベーションの意味です!

非常に多くの余分な言葉を言ったので、2つのカメラキャリブレーション関数を投げるだけです:OPENCV関数:

【A】CV_EXPORTS_AS(calibrateCameraExtended)二重calibrateCamera(InputArrayOfArrays objectPoints、
                                     InputArrayOfArrays imagePoints、サイズIMAGESIZE、
                                     InputOutputArray cameraMatrix、InputOutputArray distCoeffs、
                                     OutputArrayOfArrays rvecs、OutputArrayOfArrays tvecs、
                                     OutputArray stdDeviationsIntrinsics、
                                     OutputArray stdDeviationsExtrinsics、
                                     OutputArray perViewErrors、
                                     INTフラグ= 0、TermCriteria基準= TermCriteria(
                                        TermCriteria :: COUNT + TermCriteria :: EPS、30、DBL_EPSILON));

この[A]関数は、分析とキャリブレーションをサポートする関数であり、評価結果は出力パラメーターに示されます。
[B] CV_EXPORTS_W double calibrateCamera(InputArrayOfArrays objectPoints、
                                     InputArrayOfArrays imagePoints、Size imageSize、
                                     InputOutputArray cameraMatrix、InputOutputArray distCoeffs、
                                     OutputArrayOfArrays rvecs、OutputArrayOfArrays tvecs、
                                     int flags = 0、TermCriteria Criteria =
                                        TermCriteria:+ TermCriteria: DBL_EPSILON));

この[B]機能は、[A]と機能的にのみ異なります。

以下は、OPENCV関数から直接変換された、これら2つの関数の使用方法に関するいくつかの紹介です。変換にエラーがあります。これが、私の理解です。

1.InputArrayOfArrays objectPoints

このobjectPointsは、使用されるチェスボードのコーナーポイントのワールド座標です。もちろん、これは使用するキャリブレーションボードによって与えられます。もちろん、独自のキャリブレーションルールを作成する必要がある場合は、そのデータタイプがstd :: vector <std :: vector <cv :: Vec3f >>であることに注意してください。つまり、写真を撮る回数だけ生成でき、z座標はすべてです。 0; 2.InputArrayOfArrays imagePoints

このimagePointsは、その名前が示すように、画像内のチェッカーボードのコーナーポイントの画像ポイント座標を抽出するためのものです。これはstd :: vector <std :: vector <cv :: Vec2f >>のデータタイプであることに注意してください。これにより、これらの座標の写真が表示されます。 1対1の対応

3. InputOutputArray cameraMatrix

これは、カメラ内のパラメータマトリックスであり、初期化できるかどうかに関係なく、後で選択する計算モードに関連していると言えます。

4.InputOutputArray distCoeffs

これが今日の焦点である歪みパラメータです。4、5、8、12、または14の要素にすることができます。一般的に誰もが5つのパラメーターを使用し、一般的な精度で十分です。高精度にはパラメータが多いほど良いのかというと、不安定になりやすいという方もいらっしゃると思いますが、モデルを記述するためのパラメータが多いほど良いと思います。現在の深層学習について考えてみてください。ネットワークモデルのパラメータは数千ではありません!ただし、パラメータが多いほど、撮影する必要のある画像も多くなり、キャリブレーションフィールドを適切に構築する必要があります。キャリブレーションボードとしてA4用紙を使用する場合は、非常に多くのパラメーターを設定する必要があります。考えてみませんか?あなたのデータ品質は構造化されていません、方程式を調整して解決する方法!したがって、この場所は分水嶺ですが、一般的なコンピュータービジョンの要件では、5つのパラメーターはほぼ同じです。

5. OutputArrayOfArrays rvecs、6.OutputArrayOfArrays tvecs

これらの2つのパラメーターは、キャリブレーションプロセス中の基準としてキャリブレーションボードを備えたカメラの回転および平行移動パラメーターです。Matlibがキャリブレーションプロセス中に最終的に提供するレンズのおおよその方向について考えてください。

 7.OutputArray stdDeviationsIntrinsics 8.OutputArray stdDeviationsExtrinsics 9.OutputArray perViewErrors

これらのパラメータは、このキャリブレーションの結果を評価したものです。値が小さいほど、キャリブレーションが向上します。

10.intフラグ= 0、

flagsパラメータは通常0に設定されており、トリックはここにあります。通常、精密な校正が必要であり、校正は通常数回必要です。一部の信頼性の高いパラメータを変更せずに制御してから、他のパラメータを解決します。歪みパラメータが5パラメータモデルでない場合、この設定は機能の説明を参照します。

11.TermCriteria基準= TermCriteria(TermCriteria :: COUNT + TermCriteria :: EPS、30、DBL_EPSILON)

この設定は計算反復設定であり、通常は変更されません。高精度のキャリブレーションを行う場合は、慎重に検討する必要があります。最初のパラメーターはタイプが計算反復の終了条件、2番目が反復回数、3番目が設定しきい値です。デフォルトでは、反復終了条件は次の2つのパラメーターを調べ、反復の最大数は30、最小しきい値はDBL_EPSILONです。

キャリブレーション機能の技術的な詳細はそれ自体です。何か洞察があれば、議論することを歓迎します、そして私は現在精密視力測定を研究しています!

参照は次のとおりです。

/ ** @briefは、キャリブレーションパターンの複数のビューからカメラの内部パラメーターと外部パラメーターを検索します。

@param objectPoints新しいインターフェイスでは、これはキャリブレーションモードのポイントベクトルのベクトルです。
キャリブレーションモードの座標空間(たとえば、std :: vector <std :: vector <cv :: Vec3f >>)。外側の
ベクトルには、スキーマビューと同じ数の要素が含まれています。キャリブレーションモードが
各ビューに同じように表示され、完全に表示されている場合、すべてのベクトルは同じになります。それにもかかわらず、
部分的に隠されたパターンを使用することも、異なるビューで異なるパターンを使用することもできます。その場合、
ベクトルは異なります。これらのポイントは3Dですが、パターン座標系
にあるため、掘削機がフラットの場合、モデルをXY座標平面に配置するのが理にかなっています。
各入力オブジェクトポイントのZ座標は0です。
古いインターフェースでは、異なるビューからのオブジェクトポイントのすべてのベクトルが相互に接続され
ています。
@param imagePoints新しいインターフェースでは、これはキャリブレーション投影ベクトルのベクトル
モードポイントです(例:std :: vector <std :: vector <cv :: Vec2f >>)。imagePoints.size()と
objectPoints.size()およびimagePoints [i] .size()は、各iのobjectPoints [i] .size()と等しくなければなりません。
古いインターフェースでは、異なるビューからのオブジェクトポイントのすべてのベクトルが相互に接続され
ています。
@param imageSizeは、組み込みカメラマトリックスの画像サイズを初期化するためにのみ使用されます。
@paramcameraMatrix出力3x3フローティングポイントカメラマトリックス
\ f $ A = \ vecthreethree {f_x} {0} {c_x} {0} {f_y} {c_y} {0} {0} {1} \ f $。CV \ _CALIB \ _USE \ _INTRINSIC \ _GUESS
および/またはCV_CALIB_FIX_ASPECT_RATIOが指定されている場合
、関数を呼び出す前にfx、fy、cx、cyの一部またはすべてを初期化する必要があります。
@paramdistCoeffs歪み係数の出力ベクトル
\ f $(k_1、k_2、p_1、p_2 [、k_3 [、k_4、k_5、k_6 [、s_1、s_2、s_3、s_4 [、\ tau_x、\ tau_y]]]]) \ f $ 4、5、8、12、
または14要素。
@param rvecsは、各モードビューの推定回転ベクトルの出力ベクトルです(Rodriguesを参照)
(例:std :: vector <cv :: Mat >>)。つまり、各k番目の回転ベクトルと対応する
k番目の変換ベクトル(次の出力パラメーターの説明を参照)
は、モデル座標空間(オブジェクトポイントが指定されている)からワールド座標
空間、つまりk番目にキャリブレーションモードもたらします。各モードビューでのキャリブレーションパターンの実際の位置(k = 0 .. * M * -1)。
@param tvecsは、各モードビューに対して推定された変換ベクトルの出力ベクトルです。
@param stdDeviationsIntrinsicsは、固有パラメーターによって推定された標準偏差の出力ベクトルです。
 偏差値の順序:
\ f $(f_x、f_y、c_x、c_y、k_1、k_2、p_1、p_2、k_3、k_4、k_5、k_6、s_1、s_2、s_3、
 s_4、\ tau_x、\ tau_y)\ f $パラメータの1つが推定されていない場合、その偏差はゼロに等しくなります。
@paramstdDeviationsExtrinsics外部パラメータ推定値の標準偏差の出力ベクトル。
 偏差値の順序:\ f $(R_1、T_1、\ dotsc、R_M、T_M)\ f $ここで、Mはモードビューの数、
 \ f $ R_i、T_i \ f $は1x3ベクトルを接続します。
 @param perViewErrorsは、各モードビューの推定RMS再投影エラーの出力ベクトルです。
@paramフラグは、ゼロの異なるフラグ、または次の値の組み合わせにすることができます
 。-** CV_CALIB_USE_INTRINSIC_GUESS ** cameraMatrixには
、さらに最適化するための有効な初期値fx、fy、cx、cyが含まれますそれ以外の場合、(cx、cy)は最初に
(imageSizeを使用して)画像の中心に設定され、焦点の長さは最小二乗法で計算されます。
内部パラメータがわかっている場合は
、外部パラメータ推定するためだけにこの関数を使用する必要はないことに注意してください。代わりにsolvePnPを使用してください。
 -** CV_CALIB_FIX_PRINCIPAL_POINT **グローバル期間中にメインポイントは変更されていません
。最適化。中央に留まるか、
CV_CALIB_USE_INTRINSIC_GUESSと指定された別の場所も設定されます。
 -** CV_CALIB_FIX_ASPECT_RATIO **関数は、fyを空きパラメーターとしてのみ考慮します。
比FX / fyが入力cameraMatrixと同じままです。いつ
CV_CALIB_USE_INTRINSIC_GUESSは設定されておらず、fxとfyの実際の入力値は
無視され、それらの比率のみが計算されてさらに使用されます。
 -** CV_CALIB_ZERO_TANGENT_DIST **接線方向の歪み係数\ f $(p_1、p_2)\ f $を
ゼロに設定し、ゼロに保ちます。
 -** CV_CALIB_FIX_K1、...、CV_CALIB_FIX_K6 **対応するラジアル歪み
係数は、最適化中も変更されません。CV_CALIB_USE_INTRINSIC_GUESSが
設定されている場合、提供されたdistCoeffs行列の係数が使用されます。それ以外の場合は、0に設定されます。
 -** CV_CALIB_RATIONAL_MODEL **係数k4、k5、およびk6を有効にします。
後方互換性を提供するには、この追加フラグを明確に指定し
て、有理モデルを使用し、8つの係数を返すキャリブレーション関数を作成する必要がありますフラグが
設定されていない場合、関数は5つの歪み係数のみを計算して返します。
 -** CALIB_THIN_PRISM_MODEL **係数s1、s2、s3、およびs4を有効にします。

後方互換性を提供するために、この追加フラグを明確に指定し
て、薄いプリズムモデルを使用してキャリブレーション機能を作成し、12個の係数を返す必要がありますフラグが
設定されていない場合、関数は5つの歪み係数のみを計算して返します。
 -** CALIB_FIX_S1_S2_S3_S4 **この
最適化期間中、薄いプリズムの歪み係数は変化しませんCV_CALIB_USE_INTRINSIC_GUESSが設定されている場合、係数は
提供されたdistCoeffs行列から取得されます。それ以外の場合は、0に設定されます。
 -** CALIB_TILTED_MODEL **係数tauXおよびtauYが有効になります。
後方互換性を提供するには、この追加フラグを明確に指定し
て、傾斜センサーモデルを使用してキャリブレーション機能を作成し、14個の係数を返す必要がありますフラグが
設定されていない場合、関数は5つの歪み係数のみを計算して返します。
 -** CALIB_FIX_TAUX_TAUY **傾斜センサーモデルの係数は、この
最適化期間中は変更されませんCV_CALIB_USE_INTRINSIC_GUESSが設定されている場合、係数は
提供されたdistCoeffs行列から取得されます。それ以外の場合は、0に設定されます。
@paramcriteria反復最適化アルゴリズムの終了基準。

この関数は、ステレオペアを作成する2台のカメラ間の変換を推定します。あなたは、ステレオている場合
、カメラは固定された2台のカメラの相対位置と方向をあなたが計算した場合
、第1のカメラ及び第2カメラ(R1、T1)と(R2、T2)に対して、オブジェクトのポーズを、
それぞれ(これはすることができresolvePnP)を使用すると、これらのポーズは確実に相互に関連しています。
これは、(\ f $ R_1 \ f $、\ f $ T_1 \ f $)が与えられると、(\ f $ R_2 \ f $、\ f $ T_2 \ f $)を計算できるはずであることを意味します。
最初のカメラに対する2番目のカメラの位置と向きを知る必要があるのはあなただけですこれは
、説明されている関数の関数です。次の目的で(\ f $ R \ f $、\ f $ T \ f $)を計算します。

\ F [R_2 = R * R_1
T_2 = R * T_1 + T、\ f]

オプションで、基本行列Eを計算します。

\ f [E = \ vecthreethree {0} {--T_2} {T_1} {T_2} {0} {--T_0} {--T_1} {T_0} {0} * R \ f]

その中で、\ f $ T_i \ f $は変換ベクトル\ f $ T \ f $のコンポーネントです:\ f $ T = [T_0、T_1、T_2] ^ T \ f $。また、関数
は基本行列Fを計算することもできます。

\ f [F = cameraMatrix2 ^ {--T} E cameraMatrix1 ^ {-1} \ f]

この機能は、ステレオ関連の情報に加えて、
2台のカメラそれぞれの完全なキャリブレーションを実行することもできます。ただし、パラメータスペースの次元が高く
入力のデータにノイズが多いため、この関数は正しい解から外れる可能性があります。内部パラメータを
カメラごとに個別に高精度で推定できる場合(たとえば、
calibrateCameraを使用)、そうしてから、CV_CALIB_FIX_INTRINSICフラグを
関数と計算された内部パラメータに渡すことをお勧めします。それ以外の場合、すべてのパラメーターを
一度に推定する場合は、たとえば
CV_CALIB_SAME_FOCAL_LENGTHフラグとCV_CALIB_ZERO_TANGENT_DISTフラグを使用して、一部のパラメーターを制限するのが
理にかなっています。これは通常、妥当な仮定です。

calibrateCameraと同様に、この機能
は、2台のカメラで使用可能なすべてのビューを指すすべての再投影エラーを最小限に抑えますこの関数によって返される最終値は、
正しく再投影されません。
 * /

 

おすすめ

転載: blog.csdn.net/sun19890716/article/details/89372497