3

Android 用の OpenCV では、関数 org.opencv.Calib3d.findHomography(..) が同次変換行列を返します。たとえば、これはホモグラフィのみを返します。

Mat homography = Calib3d.findHomography(points1, points2, Calib3d.RANSAC, 0.5);

RANSAC が実際に使用するポイントを Android OpenCV API から返す方法はありますか?

4

1 に答える 1

8

アップデート

それが OpenCV への新しい追加なのか、それとも見逃しただけなのかはわかりませんが、findHomography()関数は実際にインライアを提供できます (OpenCV 2.4.2)。デフォルトでは空である最後のパラメーターはmask、R​​ANSAC によって検出されたインライアのインデックスで 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));

OpenCV ノルム関数

ピタゴラスの定理を使って 2 点間の距離を計算することもできます

それらのどれがそのペアに十分に近いかをポイント 2 で確認します。距離は より小さいか等しい必要がありますmin_distance^2。あなたの場合、0.5*0.5 = 0.25.

于 2012-04-08T07:58:16.670 に答える