当前位置: 首页 > 面试题库 >

OpenCV过滤ORB匹配

充修能
2023-03-14
问题内容

我正在使用ORB特征检测器使用以下代码查找两个图像之间的匹配项:

    FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
    DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);;
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);

    // First photo
    Imgproc.cvtColor(img1, img1, Imgproc.COLOR_RGB2GRAY);
    Mat descriptors1 = new Mat();
    MatOfKeyPoint keypoints1 = new MatOfKeyPoint();

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

    // Second photo
    Imgproc.cvtColor(img2, img2, Imgproc.COLOR_RGB2GRAY);
    Mat descriptors2 = new Mat();
    MatOfKeyPoint keypoints2 = new MatOfKeyPoint();

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

    // Matching

    MatOfDMatch matches = new MatOfDMatch();
    MatOfDMatch filteredMatches = new MatOfDMatch();
    matcher.match(descriptors1, descriptors2, matches);

    // Linking
    Scalar RED = new Scalar(255,0,0);
    Scalar GREEN = new Scalar(0,255,0);

    List<DMatch> matchesList = matches.toList();
    Double max_dist = 0.0;
    Double min_dist = 100.0;

    for(int i = 0;i < matchesList.size(); i++){
        Double dist = (double) matchesList.get(i).distance;
        if (dist < min_dist)
            min_dist = dist;
        if ( dist > max_dist)
            max_dist = dist;
    }



    LinkedList<DMatch> good_matches = new LinkedList<DMatch>();
    for(int i = 0;i < matchesList.size(); i++){
        if (matchesList.get(i).distance <= (1.5 * min_dist))
            good_matches.addLast(matchesList.get(i));
    }



    // Printing
    MatOfDMatch goodMatches = new MatOfDMatch();
    goodMatches.fromList(good_matches);

    System.out.println(matches.size() + " " + goodMatches.size());

    Mat outputImg = new Mat();
    MatOfByte drawnMatches = new MatOfByte();
    Features2d.drawMatches(img1, keypoints1, img2, keypoints2, goodMatches, outputImg, GREEN, RED, drawnMatches, Features2d.NOT_DRAW_SINGLE_POINTS);

    Highgui.imwrite("matches.png", outputImg);

我的问题是我找不到过滤匹配项的方法,因此仅当它们在照片中具有相似位置时才匹配。即使一个关键点在位置上距离很远,我也总是会得到多个匹配。

有没有办法更好地过滤它们?


问题答案:

为了获得更好的匹配结果,您应该以给定的顺序包括这些过滤方法。

  1. 在两个方向上执行匹配,即对于第一张图像中的每个点,在第二张图像中找到最佳匹配,反之亦然。

  2. 在比赛之间进行比率测试(欧式距离比测试)以消除不明确的比赛。

  3. 进行RANSAC测试:这是一种模型拟合算法,可以找到适合模型的最佳数据并消除异常值。

  4. 执行单应性:这是一种图像投影算法。

您可以在《计算机视觉应用编程手册》第9章中获得上述方法的所有详细信息。它还具有用于实现这些过滤技术的示例代码。这很容易理解。(注意:本书中的代码是用C
++编写的,但是一旦您理解了,它也可以在JAVA中轻松实现)



 类似资料:
  • 我在ES中有一个多匹配查询,希望添加一个过滤器。 添加此筛选器的语法是什么? 我试过:

  • 问题内容: 我需要按类别过滤项目列表。我希望用户能够单击一个按钮,然后将过滤器应用于列表。 目前,我已经在一定程度上进行了这项工作。 举例来说,我有一个电影列表,如下所示: 我还有一个电影流派列表(渲染为按钮,单击该按钮将过滤电影列表),如下所示: (“ changeGenre()”函数所做的全部工作就是更新范围,以显示当前正在查看的流派)。 现在这个方法可以正常工作,直到我遇到两种类型的情况:“

  • 我的目标是筛选出最佳匹配。在我的例子中,我有一个人员列表,我想按姓氏和名字过滤。 匹配的预趋势将是: < li >姓和名都匹配,返回第一个匹配项 < li >仅姓氏匹配,返回第一个匹配项 < li >不匹配,抛出一些异常 我目前为止的代码:

  • 问题内容: 我在ES中有一个多匹配查询,并希望添加一个过滤器。 添加此过滤器的语法是什么? 我试过了: 问题答案: 根据您的需要,必须将过滤器放置在正确的位置。您有两种选择: 使用顶级过滤器,并将该过滤器仅应用于搜索结果,而不应用于各个方面 使用过滤的查询,并将过滤器应用于搜索结果和构面

  • ORB Studio 是一个用来开发 Corba 应用的 Eclipse 插件。

  • 主要内容:示例可以使用类的方法对图像执行SQRBox滤镜操作。以下是这个方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象。 dst - 表示此操作的目标(输出图像)的对象。 ddepth - 表示输出图像深度的整数类型变量。 ksize - 表示内核大小的对象。 示例 以下程序演示如何在给定图像上执行Sqrbox滤镜操作。 假定以下是上述程序中指定的输入图像。 执行上面示例代