微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与Android中的ORB匹配错误

我的代码工作良好,但是当它提取关键点时,它匹配的两个图像差.
在这里你可以找到我的代码,但是我不知道如何在JAVA Android中绘制出很好的匹配
descriptors = new Mat();
        keypoints = new MatOfKeyPoint();
        detector = FeatureDetector.create(FeatureDetector.ORB);
        detector.detect(img1,keypoints);
        descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
        descriptor.compute(img1,keypoints,descriptors);
        matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
     ColorDetection.cvt_YUVtoRGBtoHSV(mYuv,mGraySubmat);
          MatOfKeyPoint mKeyPoints = new MatOfKeyPoint();
        MatOfDMatch  matches = new MatOfDmatch();

          detector.detect(mGraySubmat,mKeyPoints);
          descriptor.compute(mGraySubmat,mKeyPoints,mIntermediateMat);

        matcher.match(mIntermediateMat,descriptors,matches);
        mIntermediateMat2.create(resultSize,CvType.CV_8UC1);
        Features2d.drawMatches(img1,mGraySubmat,matches,mIntermediateMat2,GREEN,RED,MATCH_MASK,Features2d.NOT_DRAW_SINGLE_POINTS);

          Imgproc.resize(mIntermediateMat2,mRgba.size());
          Imgproc.cvtColor(mIntermediateMat2,mRgba,Imgproc.COLOR_RGBA2BGRA,4);
     Utils.matToBitmap(mRgba,bmp);

      DMatch dm[] = matches.toArray();
          List<Point> lp1 = new ArrayList<Point>(dm.length);
          List<Point> lp2 = new ArrayList<Point>(dm.length);
          KeyPoint tkp[] = keypoints.toArray();
          KeyPoint qkp[] = mKeyPoints.toArray();
          for (int i = 0; i < dm.length; i++) {
              DMatch dma = dm[i];
              lp1.add(tkp[dma.trainIdx].pt);
              lp2.add(qkp[dma.queryIdx].pt);
          }
          MatOfPoint2f pointsPrev = new MatOfPoint2f(lp1.toArray(new Point[0]));
          MatOfPoint2f pointsAct  = new MatOfPoint2f(lp2.toArray(new Point[0]));
        Log.i("pointsPrev",pointsPrev.size().toString());
        Log.i("pointsAct",pointsAct.size().toString());
          fundamental_matrix.create(resultSize,CvType.CV_8UC1);
        fundamental_matrix = Calib3d.findFundamentalMat(
                  pointsAct,pointsPrev,Calib3d.FM_RANSAC,3,0.99);

任何建议?

编辑:

我无法将比赛转换成列表!因为Feature2d.drawMatches()
需要一个MatOfDmatch而不是List< Dmatch>

MatOfDMatch matches,matches12,matches21;
matcher.match( descriptors1,descriptors2,matches12 );
matcher.match( descriptors2,descriptors1,matches21 );

iterate matches12
    DMatch forward = matches12[i];  
    DMatch backward = matches21[forward.trainIdx]; 
    if( backward.trainIdx == forward.queryIdx ) 
 //add forward to matches 
Features2d.drawMatches(img1,mIntermediateMat2);

解决方法

你的代码应该是这样的:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
 DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);;
 DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);

 //first image
 Mat img1 = Highgui.imread("<image1 path>");
 Mat descriptors1 = new Mat();
 MatOfKeyPoint keypoints1 = new MatOfKeyPoint();

 detector.detect(img1,keypoints1);
 descriptor.compute(img1,keypoints1,descriptors1);

 //second image
 Mat img2 = Highgui.imread("<image2 path>");
 Mat descriptors2 = new Mat();
 MatOfKeyPoint keypoints2 = new MatOfKeyPoint();

 detector.detect(img2,keypoints2);
 descriptor.compute(img2,keypoints2,descriptors2);

 //matcher should include 2 different image's descriptors
 MatOfDMatch  matches = new MatOfDmatch();             
 matcher.match(descriptors1,matches);
 //feature and connection colors
 Scalar RED = new Scalar(255,0);
 Scalar GREEN = new Scalar(0,255,0);
 //output image
 Mat outputImg = new Mat();
 MatOfByte drawnMatches = new MatOfByte();
 //this will draw all matches,works fine
 Features2d.drawMatches(img1,img2,outputImg,drawnMatches,Features2d.NOT_DRAW_SINGLE_POINTS);

此外,如果您只想显示功能,可以添加以下代码

Mat featuredImg = new Mat();
 Scalar kpColor = new Scalar(255,159,10);//this will be color of keypoints
 //featuredImg will be the output of first image
 Features2d.drawKeypoints(img1,featuredImg,kpColor,0);
 //featuredImg will be the output of first image
 Features2d.drawKeypoints(img1,0);

那么你可以显示这样的匹配点:

Bitmap imageMatched = Bitmap.createBitmap(outputImg.cols(),outputImg.rows(),Bitmap.Config.RGB_565);//need to save bitmap
  Utils.matToBitmap(outputImg,imageMatched);
  ImageView.setimageBitmap(imageMatched);

最终你可以实现好的比赛.我希望this thread将会有所帮助.

原文地址:https://www.jb51.cc/android/312473.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐