座標変換関数findHomography
Coordinate Transformation Function Findhomography
//ここではfindHomography関数が使用され、この関数の戻り値は実際の変換行列です
マットm_homography
ベクトルm
m_homography = findHomography(p1、p2、CV_RANSAC、3、m)
参照:
https://blog.csdn.net/fb_help/article/details/70365853
ホモグラフィ、つまりホモグラフィ。この関数は、src_pointsからdst_poinstsに変換されたホモグラフィ行列を見つけるために使用されます。
ホモグラフィを理解するために、透視変換の概念を最初に導入する必要があります。空間座標系の3次元オブジェクトまたはオブジェクトを2次元画像表現に変換するプロセスは、投影変換と呼ばれ、間の距離に基づいています。視点(投影中心)と投影面。異なる、投影は平行投影と透視投影に分けることができます、透視投影は透視変換です。平行投影は、光源が物体から無限に離れている場合にのみ実現できるため、理論的には存在しません。したがって、日常生活で目にするのは、スライドやカメラなどの遠近法の変換です。
2つの画像AとBが同じ透視変換に準拠している場合、ホモグラフィ行列Hが存在し、B = A * Hになります。ここから、画像Aの点が(x、y)であり、画像Bの点が(x '、y')であると仮定すると、ホモグラフィが実際には1つの平面から別の平面へのプロジェクションマッピングであると推測することは難しくありません。パースペクティブ変換は、次の式で表すことができます。
関数の3番目のパラメーターはCV_RANSACであることがわかりました。これは、RANSAC(ランダムサンプルコンセンサス)アルゴリズムを呼び出すことを意味します。 src_pointsとdst_pointsの点はすべての点に1対1で対応しているわけではなく、誤った一致を含むこれらのデータからRANSACメソッドを使用できるため、正しい一致を分離してホモグラフィ行列を取得します。
https://www.cnblogs.com/canyeweiwei/p/10597474.html
findHomography:最小平均二乗誤差またはRANSAC法を使用して、複数の2次元ポイントペア間の最適な単一マッピング変換行列H(3行x 3列)を計算します。
機能:2つの平面間の変換行列を見つけます。
Mat cv::findHomography ( InputArray srcPoints, InputArray dstPoints, int method = 0, double ransacReprojThreshold = 3, OutputArray mask = noArray(), const int maxIters = 2000, const double confidence = 0.995 )
詳細なパラメータ:
srcPoints | タイプCV_32FC2またはベクトルのソース平面内の点の座標行列 |
dstPoints | ターゲット平面の中点の座標行列。タイプはCV_32FC2またはベクトルです。 |
方法 | ホモグラフィ行列の計算に使用される方法。次のように、さまざまなメソッドがさまざまなパラメータに対応します。
|
ransacReprojThreshold | ポイントペアを内部ポイントとして扱うための最大許容再投影エラーしきい値(RANSACおよびRHOメソッドの場合のみ)。万一に備えて ポイント これは外れ値(つまり、不一致のポイントのペア)と見なされます。 srcPointsとdstPointsがピクセル単位の場合、このパラメーターは通常1から10の範囲で設定されます。 |
マスク | オプションの出力マスクマトリックス。通常、堅牢なアルゴリズム(RANSACまたはLMEDS)によって設定されます。入力マスク行列を設定する必要がないことに注意してください。 |
maxIters | RANSACアルゴリズムの最大反復回数。デフォルト値は2000です。 |
信頼 | 信頼性の値。値の範囲は0から1です。 |
この関数は、ソース平面とターゲット平面の間の変換行列Hを見つけて返すことができるため、逆投影エラー率を最小限に抑えることができます。
逆投影エラー率は次のように計算されます。
メソッドパラメーターの値がデフォルト値の0の場合、関数はすべてのポイントペアを使用して、単純な最小二乗法で初期ホモグラフィ推定値を計算します。
ただし、すべてのポイントペア(srcPointsi、dstPointsi)が厳密な遠近法変換に適しているわけではない場合(つまり、いくつかの外部ポイント(一致するエラーポイントペア)がある場合)、この初期推定は不十分になります。この場合、3つの堅牢な方法のいずれかを使用できます。 RANSAC、LMeDS、RHOなどのアルゴリズムは、ポイントペアの多くの異なるランダムサブセット(ペアごとに4ペア)に対応し、このサブセットと単純な最小二乗アルゴリズムを使用してホモグラフィマトリックスを推定し、計算された品質/良さを計算しようとします。ホモグラフィ(RANSACの場合、ホモグラフィの品質は内部点の数を指し、LMeDの場合、ホモグラフィの品質は再投影の中央値の誤差を指します)。最後に、最良のサブセットを使用して、ホモグラフィ行列の初期推定値とインライア/アウトライアのマスクを生成します。
計算方法がロバストであるかどうかに関係なく、ホモグラフィ行列の計算は、再投影エラーをさらに減らすために、Levenberg-Marquardt法(ロバストな方法の場合は内部点のみが使用されます)を使用して洗練されます。
RANSACメソッドとRHOメソッドは、ほぼすべての割合の外れ値を処理できますが、インライアと外れ値を区別するにはしきい値が必要です。 LMeDSアルゴリズムはしきい値を必要としませんが、内部ポイントの50%を超えた場合にのみ正常に機能します。最後に、外部ポイントがなく、ノイズが小さい場合は、デフォルトの方法(method = 0)を使用します。
この関数は、初期の内部行列と外部行列を見つけるために使用されます。ホモグラフィマトリックスは比例して決定されます。したがって、それを正規化して作成します 。 H行列を推定できない場合は、空行列が返されます。
方法2:
Mat cv::findHomography ( InputArray srcPoints, InputArray dstPoints, OutputArray mask, int method = 0, double ransacReprojThreshold = 3 )
これは、主に使用の便宜のために提案されたオーバーロードされたメンバー関数です。上記の関数とは、受け入れるパラメーターのみが異なります。
参照: https://blog.csdn.net/fengyeer20120/article/details/87798638