关键点匹配只能工作两次......? (java opencv)

2024-01-16

我有一个非常奇怪的问题。我正在使用此代码来检测另一个代码中的图像(java opencv):

更新的代码:

public void startRecognition() {
    //load images, I want to find img_object in img_scene
    Mat img_scene = Highgui.imread("D:/opencvws/ImageRecognition/src/main/resources/ascene.jpg");
    Mat img_object = Highgui.imread("D:/opencvws/ImageRecognition/src/main/resources/aobj1.jpg");
    run++;
    System.out.println("RUN NO: " + run);

    //init detector
    FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);

    //keypoint detection for both images (keyponts_scene for img_scene, keypoint_object for img_object)
    MatOfKeyPoint keypoints_object = new MatOfKeyPoint();
    MatOfKeyPoint keypoints_scene  = new MatOfKeyPoint();
    detector.detect(img_object, keypoints_object);
    detector.detect(img_scene, keypoints_scene);
    System.out.println("OK: " + keypoints_object.total());
    System.out.println("SK: " + keypoints_scene.total());

    //extractor init
    DescriptorExtractor extractor = DescriptorExtractor.create(2); //2 = SURF;
    Mat descriptor_object = new Mat();
    Mat descriptor_scene = new Mat() ;
    //Compute descriptors
    extractor.compute(img_object, keypoints_object, descriptor_object);
    extractor.compute(img_scene, keypoints_scene, descriptor_scene);

    //init matcher
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED); // 1 = FLANNBASED
    matcher.clear();
    MatOfDMatch matches = new MatOfDMatch();

    //match both descriptors
    matcher.match(descriptor_object, descriptor_scene, matches);
    List<DMatch> matchesList = matches.toList();

    //calc min/max dist
    Double max_dist = 0.0;
    Double min_dist = 100.0;
    for(int i = 0; i < descriptor_object.rows(); i++){
        Double dist = (double) matchesList.get(i).distance;
        if(dist < min_dist) min_dist = dist;
        if(dist > max_dist) max_dist = dist;
    }

    //filter good matches
    LinkedList<DMatch> good_matches = new LinkedList<DMatch>();
    MatOfDMatch gm = new MatOfDMatch();

    //good match = distance > 2*min_distance ==> put them in a list
    for(int i = 0; i < descriptor_object.rows(); i++){
        if(matchesList.get(i).distance < 2*min_dist){
            good_matches.addLast(matchesList.get(i));
        }
    }
    //List -> Mat
    gm.fromList(good_matches);

    //mat for resulting image
    Mat img_matches = new Mat();

    //filter keypoints (use only good matches); First in a List, iterate, afterwards ==> Mat
    LinkedList<Point> objList = new LinkedList<Point>();
    LinkedList<Point> sceneList = new LinkedList<Point>();

    List<KeyPoint> keypoints_objectList = keypoints_object.toList();
    List<KeyPoint> keypoints_sceneList = keypoints_scene.toList();

    for(int i = 0; i<good_matches.size(); i++){
        objList.addLast(keypoints_objectList.get(good_matches.get(i).queryIdx).pt);
        sceneList.addLast(keypoints_sceneList.get(good_matches.get(i).trainIdx).pt);
    }

    MatOfPoint2f obj = new MatOfPoint2f();
    obj.fromList(objList);

    MatOfPoint2f scene = new MatOfPoint2f();
    scene.fromList(sceneList);

    //calc transformation matrix; method = 8 (RANSAC) ransacReprojThreshold=3
    Mat hg = Calib3d.findHomography(obj, scene, 8,3);

    //init corners
    Mat obj_corners = new Mat(4,1,CvType.CV_32FC2);
    Mat scene_corners = new Mat(4,1,CvType.CV_32FC2);
    //obj
    obj_corners.put(0, 0, new double[] {0,0});
    obj_corners.put(1, 0, new double[] {img_object.cols(),0});
    obj_corners.put(2, 0, new double[] {img_object.cols(),img_object.rows()});
    obj_corners.put(3, 0, new double[] {0,img_object.rows()});

    //transform obj corners to scene_img (stored in scene_corners)
    Core.perspectiveTransform(obj_corners,scene_corners, hg);

    //move points for img_obg width to the right to fit the matching image
    Point p1 = new Point(scene_corners.get(0,0)[0]+img_object.cols(), scene_corners.get(0,0)[1]);
    Point p2 = new Point(scene_corners.get(1,0)[0]+img_object.cols(), scene_corners.get(1,0)[1]);
    Point p3 = new Point(scene_corners.get(2,0)[0]+img_object.cols(), scene_corners.get(2,0)[1]);
    Point p4 = new Point(scene_corners.get(3,0)[0]+img_object.cols(), scene_corners.get(3,0)[1]);

    //create the matching image
    Features2d.drawMatches(
            img_object,
            keypoints_object, 
            img_scene,
            keypoints_scene, 
            gm, 
            img_matches);
    //draw lines to the matching image
    Core.line(img_matches, p1 , p2, new Scalar(0, 255, 0),4);
    Core.line(img_matches, p2, p3, new Scalar(0, 255, 0),4);
    Core.line(img_matches, p3, p4, new Scalar(0, 255, 0),4);
    Core.line(img_matches, p4, p1, new Scalar(0, 255, 0),4);


    // resizing...
    Mat resizeimage = new Mat();
    Size sz = new Size(1200, 1000);
    Imgproc.resize(img_matches, img_matches, sz);
    panel1.setimagewithMat(img_matches);

    frame1.repaint();

    //tried to prevent any old references to mix up new calculation 
    matcher.clear();
    img_matches = new Mat();
    img_object = new Mat();
    img_scene = new Mat();
    keypoints_object = new MatOfKeyPoint();
    keypoints_scene = new MatOfKeyPoint();
    hg = new Mat();
}

如果我在运行的应用程序中运行 startRecognition 方法两次(opencv 库在启动时加载),则两次识别都会得到相同的结果。对于第三次尝试,它检测其他关键点并计算另一个变换矩阵 (hg)。例子:

第二次尝试后:

第三次之后:

谁能解释为什么?或者告诉我如何预防?当我重新启动整个程序时,它会再次检测到两次正确,然后变化。经过几次尝试后,它将再次计算出正确的汞含量(根据第一次和第二次尝试)。我不明白为什么会发生这种情况。

提前致谢

gemorra


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关键点匹配只能工作两次......? (java opencv) 的相关文章

  • 正确配置JDK环境变量后仍然找不到java命令

    我在 Windows 虚拟机启动时安装 JDK 使用 cloudinit 用户数据将 PowerShell 脚本传输到 Windows 计算机 然后运行该脚本来安装 JDK softwares Get ItemProperty HKLM S
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • 如何在Mac上使用eclipse安装jetty

    我是一个新手 jetty 和 RESTful API 我想使用 Jetty 创建 REST 服务 并希望将嵌入式 jetty 与 eclipse 一起使用 任何人都可以建议我在 Mac OS 中使用 Eclipse 安装 Jetty Jet
  • 在 Android 中绘制一条带有弯曲边缘的线

    I am using canvas drawLine to draw some line in android but the lines are too sharp but i need a curved edges 这里的 1 是我所拥
  • org.postgresql.util.PSQLException:协议错误。会话设置失败

    我知道这些类型的问题已经存在 但提供的解决方案对我不起作用 在我的应用程序中 没有版本不匹配的黑白驱动程序和 PostgreSQL 服务器 我还没有找到任何其他解决方案 我正在使用 PostgreSQL 服务器 9 4 和 postgres
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • 如何在Gradle中支持多种语言(Java和Scala)的多个项目?

    我正在尝试将过时的 Ant 构建转换为 Gradle 该项目包含约50个Java子项目和10个Scala子项目 Java 项目仅包含 Java Scala 项目仅包含 Scala 每个项目都是由 Java 和 Scala 构建的 这大大减慢
  • 用于防止滥用的 Servlet 过滤器? (DoS、垃圾邮件等)

    我正在寻找一个 Servlet 过滤器库 它可以帮助我保护我们的 Web 服务免受未经授权的使用和 DDoS 攻击 我们的网络服务有 授权客户 因此理想情况下 过滤器将帮助检测未经授权或行为不当的客户 或检测使用同一帐户的多个人 此外 我们
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • 如何在命令提示符中检查 JAVA_OPTS 值?

    我们的应用程序部署 JBoss 服务器然后抛出错误 PermGen space 然后在 jboss bat 和配置文件中设置 permgen 变量中的 java OPTS JAVA OPTs 中是否有值 assige 如何检查 如何在命令提
  • MessageDigest MD5 算法未返回我期望的结果

    我脑后的某个东西告诉我 我在这里遗漏了一些明显的东西 我正在将现有的 java 项目与第三方 api 集成 该第三方 api 使用 api 密钥的 md5 哈希进行身份验证 它对我不起作用 在调试过程中我意识到我生成的哈希值与他们提供的示例
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • 如何列出所有可用的 LookAndFeel 主题?

    如何列出所有可用的 LookAndFeel 主题 我想在 JComboBox 中显示以供用户选择 这真的很简单 public static UIManager LookAndFeelInfo getInstalledLookAndFeels
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 在方法内声明类 - Final 关键字 [重复]

    这个问题在这里已经有答案了 给定方法中的以下内部类 IsSomething public class InnerMethod private int x public class Something private int y public
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • Java中的媒体播放器库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在评估用于在 Java 中播放音频 视频的库 它不需要 100 Java Java 与本机库的绑定
  • SWT - 与操作系统无关的获取等宽字体的方法

    SWT 有没有一种方法可以简单地获得跨各种操作系统的等宽字体 例如 这适用于 Linux 但不适用于 Windows Font mono new Font parent getDisplay Mono 10 SWT NONE 或者我是否需要

随机推荐

  • 开源拼写检查

    正在评估向我拥有的产品添加拼写检查 根据我的研究 需要做出的主要决定 要使用的库 词典 可以是特定地区的 英式英语 美式等 排除列表 每当检测到拼写错误时 它都可能不是拼写错误 而是 特定于用户的用语 此时用户应该能够将其添加到他的自定义排
  • 预处理器愚蠢的做法(对 #include 进行字符串化)

    注意 这个问题与 OpenCL 本身无关 请检查最后一段以获取我的问题的简洁陈述 但提供一些背景 我正在编写一些使用 OpenCL 的 C 代码 我喜欢将 OpenCL 内核的源代码保存在自己的文件中 以便于编码和维护 而不是直接将源代码作
  • 如何获取 YouTube 视频的 mp4/mov/m4v 视频链接?

    我们可以获取 youtube 上加载的任何视频的文件 url 吗 我不喜欢在我的应用程序中使用 youtube 播放器 并且想使用 MPMoviePlayerController 的实例启动它 PS 也会将其标记为 php 因为跨域的开发人
  • 实体框架提供列名称作为字符串变量

    我正在寻找获得这样的东西的方法 string col1 first name string name var query from c in ctx Customers select c name query FirstOrDefault
  • 如何删除 python 中输出末尾的空格?

    我有一个程序可以计算并打印句子中包含特定字符的所有单词 忽略大小写 Python 代码 item input ip input tolower r ip count item print r ip ip split for word in
  • 如何使用 C# 搜索一系列范围值

    我有一个像这样的值列表 1000 20400 22200 24444 范围不重叠 我想要做的是有一个 C 函数 可以存储 从数据库加载的值 然后在本地缓存 这些值的相对较大的列表 然后有一个方法来查找提供的值是否在任何范围内 这有道理吗 需
  • 需要 GLbc 优化

    为什么无法重新编译 GLibc 并关闭所有优化 即 O0 特别是在这样做时 make CFLAGS O0 w CXXFLAGS O0 w I get error glibc cannot be compiled without optimi
  • 使用未声明的类型“日期”Xcode 9 Swift 4

    这是我在 xcode 9 Playground 中的代码 class Tutorial Codable let title String let author String let editor String let type String
  • 从正则表达式模式返回不匹配的行

    如果我有一个看起来像这样的 pandas 数据框 Sequence Rating 0 HYHIVQKF 1 1 YGEIFEKF 2 2 TYGGSWKF 3 3 YLESFYKF 4 4 YYNTAVKL 5 5 WPDVIHSF 6 这
  • 使用具有多个输入的 grepl 分配组

    我有一个数据框 df lt data frame name c john david callum joanna allison slocum lisa id 1 7 df name id 1 john 1 2 david 2 3 call
  • 在 PHP 中从 JSON 数组中提取特定键值 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我收到来自
  • DBus与其他进程间通信方式的区别

    当我研究Linux进程间通信时 我知道有一些方法 管道 消息队列 套接字 信号 共享内存 信号量 并且没有名为Dbus的方法 但是今天 当我研究 Dbus 时 我读到 D Bus 是一个进程间通信 IPC 系统 请参阅 该链接 https
  • React 中的 msal.js - Azure 身份验证

    我收到错误 但 azure 中的所有访问都正常 也许我的端点是错误的 你有什么想法吗 错误 APP TEST 需要访问组织中只有管理员才能授予的资源的权限 请先请求管理员授予此应用程序的权限 然后才能使用它 我用这个 example 租户I
  • 如何跟踪SQL Server中记录的变化?

    我有下表 其中包含所有学生的跟踪记录 ID Department Date 001 English Feb 3 2017 001 English Feb 4 2017 001 Science Mar 1 2017 001 Science A
  • 程序仅在调试器之外的发布模式下崩溃

    我有相当庞大的程序 gt 10k 行 C 代码 从 Visual Studio 中启动时 它可以在调试模式或发布模式下完美运行 但从命令行手动启动时 发布模式二进制文件通常会崩溃 并不总是 带删除的行导致崩溃 bool Save const
  • 基于时间的通知架构

    我正在设计一个通知服务 服务器 我可以有两种通知 一种是立即发送 另一种是在将来的某个时间发送 是否有一个框架来处理未来的通知 我知道我可以编写后台工作人员 例如 他们可以对数据库进行采样以查找需要发送的通知 但我确信数百万人已经尝试解决这
  • 构建在 codeigniter 之上的 PHP 应用程序可以同时连接到 MySQL 和 mongoDB 数据库吗?

    我有一个内置于 codeigniter 并托管的 Web 应用程序云控 http www cloudcontrol com 我使用普通的 MySQL 数据库来进行所有数据持久化 现在除了 MySQL 数据库之外 我还想使用 mongodb
  • iPhone/iPad 触发意外的调整大小事件

    我正在开发我的网站的移动版本 我尽可能多地使用媒体查询和 CSS 但我也使用一些 javascript 例如 将导航转换为较小设备上的折叠 展开列表以节省空间 为了处理所有这些 我尝试使用 window resize 事件 这使得桌面浏览器
  • 如何测试用户输入的字符串是否在列表中?

    我是 Python 新手 我正在尝试制作一个脚本 让用户选择打开 Windows 命令提示符等程序 由于 Windows 命令提示符也是使用 cmd 打开的 因此我希望用户能够同时键入两者并获得相同的结果 我知道我可以将它放在多个 elif
  • 关键点匹配只能工作两次......? (java opencv)

    我有一个非常奇怪的问题 我正在使用此代码来检测另一个代码中的图像 java opencv 更新的代码 public void startRecognition load images I want to find img object in