我的代码工作良好,但是当它提取关键点时,它匹配的两个图像差.
在这里你可以找到我的代码,但是我不知道如何在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将会有所帮助.

与Android中的ORB匹配错误的更多相关文章

  1. android – Espresso – 检查ListView中是否存在TextView

    我想在列表中查看SaveXX的显示.保存XX是一个可见或不可见的TextView.我使用JUnit4和Espresso2.2.1.我试着像这样检查:但总是得到一个错误:如果使用Espresso在ListView中存在TextView,有没有办法?UPDATE我也试过使用onData:但似乎onData适用于数据层,但不适用于视图层.因此,我收到错误:解决方法经过几次尝试,我找到了方法.在这种情况下,我们应该使用组合方法并使用数据和视图层.我们按ID访问ListView并选择第一项.然后检查它是否为“保存”

  2. Android Espresso:如何断言不应显示视图

    但它抛出了这个异常:不应该显示断言视图的最佳方法是什么?

  3. android – Espresso与意图之间的区别是什么?

    自从我学习浓缩咖啡以来已经有两周时间了,我无法掌握有意和有意的事情.我何时使用有意和有意?解决方法区别在于Intended仅验证Intent是否已启动.当Intent启动时,Intending将返回结果.对于预期如果您按下按钮并启动,例如MyActivity,并且您针对TagListActivity进行测试,则会失败.它会抛出以下错误:现在,如果您正在测试onActivityResult是否已正确处理,您将使用Intending并传入类似于此的ActivityResult:因此,在这种情况下,如果您希望“

  4. 与Android中的ORB匹配错误

    我的代码工作良好,但是当它提取关键点时,它匹配的两个图像差.在这里你可以找到我的代码,但是我不知道如何在JAVAAndroid中绘制出很好的匹配任何建议?

  5. OpenCV基于ORB算法实现角点检测

    这篇文章主要为大家详细介绍了OpenCV基于ORB算法实现角点检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. php – 如果是IE 6,我想制作警告并免费下载其他浏览器图标

    我的网站想要打开IE7及以上版本.如果是IE6,我想制作警告并免费下载其他浏览器图标.这可能吗?

  7. php – 如何在Steam WebAPI中获取应用程序的价格?

    有没有可能通过WebAPI从Steam获取游戏的价格?

  8. php – 如何根据解释结果改进此查询

    所以它也应该是一个整数,以避免将varchars转换为int的开销,反之亦然,并允许在任何一种情况下使用索引.虽然与此特定查询无关,但以下两个字段也需要注意并正确转换:在改进查询…)子句的单独查询,如前所述.

  9. 正则表达式匹配任何字符串powershell

    无论我觉得我如何知道正则表达式,他们总是似乎打败了我.我正在寻找一个匹配任何字符串的通用模式.我唯一可以弄清楚如何处理所有这些不同的命名约定的方法,是制作了一堆不同的正则表达式,现在我甚至不确定所有的数据是否被拾取,所以我必须手动交叉检查它.我只是想拿起任何可能在两个方括号内的东西[]:我这样做的方式不会产生错误,但我不确定它是否处理了我可能遇到的所有情况.手动检查几乎不可能有这么多的数据.另外,

  10. windows-server-2008-r2 – PowerShell脚本的电子邮件结果

    我有一个powershell脚本,用于检查证书存储区是否存在过期证书.它将在CLI中显示这些结果.我想修改此脚本以通过电子邮件发送电子邮件正文中的输出结果.我知道如何使用send-mailmessageCmdLet通过PowerShell发送电子邮件,但我不确定如何获取脚本的结果并将其发送到电子邮件中…

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部