0

Android OpenCVを使用して、カメラの入力フレームから機能を検出しています。私はBFMatcherでORB機能検出器とORB記述子抽出器を使用しています。今、私はいくつかのマッチマットを次の形式で入手しました

matches = Mat [ 421*1*CV_32FC4, isCont=true, isSubmat=false, nativeObj=0x5fad7b30, dataAddr=0x5fab84f0 ]

nativeObjとdataAddrは何のために表されているのだろうか?一致した2つのフィーチャ間の距離をピクセル単位で取得したいのですが、何か考えはありますか?

他の誰かが同じ質問をしていて、返事がなかったのを見つけました。OpenCVマッチャーでポイントの場所にアクセスする方法は?

前もって感謝します!

4

1 に答える 1

2

機能の記述子の一致を実行している場合は、を取得する必要がありますMatOfDMatch。コードは次のようになります。

DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
MatOfDMatch matches = new MatOfDMatch();
matcher.match(descriptors1,descriptors2 ,matches);

あなたがより簡単な操作のためにに変換MatOfDMatchすることができた後。List<DMatch>あなたはそれを行うことができます:

List<DMatch> matchesList = matches.toList();

次に、一致したポイントにアクセスし、次の方法でデカルト座標を取得できます。

Point pt1 = keypoints1.toList().get(matchesList.get(i).queryIdx).pt; 
Point pt2 = keypoints2.toList().get(matchesList.get(i).trainIdx).pt;

2点間の距離を計算した後:

double dist_x_pow = Math.pow(Math.abs(pt1.x - pt2.x),2);
double dist_y_pow = Math.pow(Math.abs(pt1.y - pt2.y),2);
double DISTANCE = Math.sqrt(dist_x_pow + dist_y_pow);

についてはわかりませんがnativeObjdataAddrOpenCVライブラリがCで実装されていることに関係していると思います。この値は、Matオブジェクトのメモリ内のアドレスを表していると思います。

于 2013-03-11T22:37:20.263 に答える