Android 用の OpenCV では、関数 org.opencv.Calib3d.findHomography(..) が同次変換行列を返します。たとえば、これはホモグラフィのみを返します。
Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5);
RANSAC が実際に使用するポイントを Android OpenCV API から返す方法はありますか?
Android 用の OpenCV では、関数 org.opencv.Calib3d.findHomography(..) が同次変換行列を返します。たとえば、これはホモグラフィのみを返します。
Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5);
RANSAC が実際に使用するポイントを Android OpenCV API から返す方法はありますか?
アップデート
それが OpenCV への新しい追加なのか、それとも見逃しただけなのかはわかりませんが、findHomography()関数は実際にインライアを提供できます (OpenCV 2.4.2)。デフォルトでは空である最後のパラメーターはmask
、RANSAC によって検出されたインライアのインデックスで 1 (または 255) で埋められます。
Mat findHomography(InputArray srcPoints, InputArray dstPoints,
int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
// ^
// |
古い答え
RANSAC がホモグラフィを推定するために使用するポイント (テクニカル ドキュメントではインライアと呼ばれます) を直接抽出することはできません。それらは内部で計算されますが、リストは削除されます。
それらを抽出する方法は、findHomography 関数 (および対応する RANSAC 関数) を変更することです。しかし、これは醜いです。
もう 1 つのよりクリーンな方法は、入力内のどのポイント ペアが th ホモグラフィに一致するかをテストすることです。
(これが関数名であることを願っています)を使用projectPoints(points1, homography, points1_dest)
して、ポイント1にホモグラフィを適用します。
関数名と入力引数の正しい順序は次の とおり です。
使用するcv::distance(points1_dest, points2)
関数名と入力引数の正しい順序は次のとおりです。 double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())
可能な実装:
std::array<cv::Point2f, 1> pt1;
pt1[0] = points1_dest;
std::array<cv::Point2f, 1> pt2;
pt2[0] = points2;
distance = cv::norm(pt1, pt2));
ピタゴラスの定理を使って 2 点間の距離を計算することもできます
それらのどれがそのペアに十分に近いかをポイント 2 で確認します。距離は より小さいか等しい必要がありますmin_distance^2
。あなたの場合、0.5*0.5 = 0.25
.