2013-04-25 14 views
5

私はこの機能を動作させることができません。基本的に私は、機能の検出と参照画像とのマッチングを行っています。私は入力画像の上にマッチしたフィーチャーをオーバーレイしたい。私のコードは次のとおりです。Android OpenCV:feature2dと一致する図面

public Mat startProcessing(Mat inputImage) { 

    Imgproc.cvtColor(inputImage, rgb, Imgproc.COLOR_GRAY2RGB); 
    myFeatures.detect(rgb, keypoints); 
    descriptorExtractor.compute(inputImage, keypoints, imageDescriptors); 
    descriptorMatcher.match(templateDescriptors, imageDescriptors, matches); 

    Features2d.drawMatches(rgb, keypoints, templateImage, templateKeypoints, matches, rgb); 

    Imgproc.cvtColor(rgb, outputImage, Imgproc.COLOR_RGB2RGBA); 
    return outputImage; 
} 

これは特に問題の2d.drawMatchesです。私が得たAndroidのエラーによると、いくつかの次元は並んでいません。真実が言われても、どこにもドキュメンテーションがないので、drawMatchesがAndroidでどのように動作するのかわからない。

私ができることをしたいのは、inputImageの上にマッチを描画することです。私はFeature2d.drawKeypointsを稼働させましたが、MatOfDMatch matchesMatOfKeypointオブジェクトに変換する方法は不明です。 MatOfDMatchがどのように動作するのかもわかりません - ディスクリプタに対応する内部にはいくつかの結合性がありませんか?

残念ながら、私はAndroidでOpenCVを使用するのは本当に苦労しています。そこにあるC++のドキュメントは良いですが、Androidの素材にはほとんどありません。助けてくれてありがとう!

答えて

6

最初に気づいたことは、ある色空間から別の色空間に画像を変換していることです。それは少し混乱しています。グレースケール画像でマッチを描きたい場合は、この画像変換を行う必要はありません。 他のものは、RGB画像上のキーポイントを検出し、元の画像からデスクリプタを抽出しています(グレースケールであることがわかります)。

また、画像が同じタイプの場合は、ログinputImageオブジェクトに印刷し、両方がタイプCV_8UC3または同等であるかどうかを確認してください。基本的にはあなたのコードは次のようにする必要があります:

Mat imageOut = inputImage.clone(); 
Features2d.drawMatches(inputImage, keypoints, templateImage, templateKeypoints, matches, imageOut); 
Highgui.imwrite("result_match.jpeg", imageOut); 

は別のご質問に答える:

Qを:私はMatOfKeypointオブジェクトにMatOfDMatch試合の変換については行くだろうかわかりませんよ。 A:drawMatchesの機能は、入力画像とテンプレート画像のMatOfKeypointを受け取るため、これを行う必要はありません。次に、MatOfDMatchを渡すと、それは一致する受信されたキーポイントの間で一致を描画します。

Q:また、それがMatOfDMatchの仕組みであるかどうかもわかりません。ディスクリプタに対応する内部にはいくつかの関連性がありませんか? A:はい。 matches.toList(0).queryIdxmatches.toList(0).trainIdxを実行すると、templateImageの最初の一致のキーポイントに一致するinputImageのキーポイントのインデックスが取得されます。

+0

これまでのところありがとうございます。私はimageOut = inputImage.clone()を使い始めました。これによってdrawMatchesが動作します。しかし、私はこのイメージを返すようにしています。ユーザーがカメラで見るものと同じですが、寸法はわずかに異なります。640 * 480のカメラ解像度ではなく、704 * 480です。テンプレート画像の幅が64であることを考えると、drawMatchesはそれらを並べて配置しているように見えます。入力画像上の一致する領域に矩形などを表示できますか? – JDS

+2

はい私はそう思います。 list matches_list = matches.toList(); List kp_list = keypoints.toList(); 'をリストし、' kp_list.get(matches_list.get(i).queryIdx) 'リストを反復処理するためにマッチとキーポイントを変換するあなたの長方形を定義する2つの点に出会うために、一致するキーポイントの最小値と最大値XとYを求めます。次に、Rectangle = Rect(新しい点(minX、minY)、新しい点(maxX、maxY)) 'を定義し、' Mat imageFinal = new Mat(inputImage、roi);を実行するだけで、マッチした領域 – andriy

関連する問題