17
私は2つの画像間の一致を見つけるためのアプリケーションを作成しています。私は適切に一致結果を見つけることができません。アンドロイドで記述子を実装できません
マッチング方法では、入力キーポイントと同じ数の記述子が得られますが、この結果を描画することもできません。私は、ワークスペースでOpenCVをライブラリとして使用しています。
ここに私のコードです。
Bitmap mBitmap1 = mimage1.copy(Bitmap.Config.ARGB_8888, false);
Bitmap mBitmap2 = mimage2.copy(Bitmap.Config.ARGB_8888, false);
Mat s_image1 = Utils.bitmapToMat(mBitmap1);
Mat s_image2 = Utils.bitmapToMat(mBitmap2);
Mat rgb1 = new Mat();
Mat rgb2 = new Mat();
Mat rgb3 = new Mat();
Mat temp = new Mat();
Mat o_image1 = new Mat();
Mat o_image2 = new Mat();
Mat o_image3 = new Mat();
List<KeyPoint> points1 = new ArrayList<KeyPoint>();
List<KeyPoint> points2 = new ArrayList<KeyPoint>();
List<DMatch> matches = new ArrayList<DMatch>();
FeatureDetector surf = FeatureDetector.create(FeatureDetector.SURF);
surf.detect(s_image1, points1);
surf.detect(s_image2, points2);
Scalar color1 = new Scalar(0,255,0);
Scalar color2 = new Scalar(255,0,0);
Imgproc.cvtColor(s_image1, rgb1, Imgproc.COLOR_RGBA2RGB);
Imgproc.cvtColor(s_image2, rgb2, Imgproc.COLOR_RGBA2RGB);
Mat descriptors1 = new Mat(), descriptors2 = new Mat();
Features2d.drawKeypoints(rgb1, points1, rgb1, color2);
Features2d.drawKeypoints(rgb2, points2, rgb2, color2);
DescriptorExtractor extracter = DescriptorExtractor.create(DescriptorExtractor.SURF);
extracter.compute(rgb1, points1, descriptors1);
extracter.compute(rgb2, points2, descriptors2);
int k = 5;
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
matcher.match(descriptors2, descriptors1, matches);
Features2d.drawMatches(rgb1, points1, rgb2, points2, matches, rgb3, color1, color2);
Imgproc.cvtColor(rgb1, o_image1, Imgproc.COLOR_RGB2RGBA);
Imgproc.cvtColor(rgb2, o_image2, Imgproc.COLOR_RGB2RGBA);
Utils.matToBitmap(o_image1, mBitmap1);
mimageview1.setImageBitmap(mBitmap1);
Utils.matToBitmap(o_image2, mBitmap2);
mimageview2.setImageBitmap(mBitmap2);
Utils.matToBitmap(o_image3, mBitmap3);
mimageview3.setImageBitmap(mBitmap3);
s_image1.release();
s_image2.release();
o_image1.release();
o_image2.release();
あなたのプログラムはうまく見えます、デバッグしようとしましたか?各ステップが正しいことを確認するだけで、各画像のキーポイントの数を確認できます。私はリストの代わりにベクトルを使用します。 –
あなたが使用しているopencvのバージョンは、opencv 2.4.1でFeatures2d.drawMatches()のパラメータのシーケンスが表示されません。リストを使用しているため、問題はありません。 –
2.4.xには、Features2d.drawMatches(img1、keypoints1、img2、keypoints2、matches1to2、outImg)またはFeatures2d.drawMatches(img1、keypoints1、img2、keypoints2、matches1to2、outImg、matchColor、singlePointColor、matchesMask、flags)があります。 –