slambook2+ch7+orb_self 源码的一点小问题

2023-05-16

slambook2+ch7+orb_self 源码的一点小问题+解读

    • 源码详细解读
    • 小错误调试,有的真的属实自己菜
    • 运行结果

源码详细解读

下面是一些个人的见解内联代码片

// compute the descriptor
void ComputeORB(const cv::Mat &img, vector<cv::KeyPoint> &keypoints, vector<DescType> &descriptors) {
  const int half_patch_size = 8;
  const int half_boundary = 16;
  int bad_points = 0;
  for (auto &kp: keypoints) {//剔除在边界上的关键点
    if (kp.pt.x < half_boundary || kp.pt.y < half_boundary ||
        kp.pt.x >= img.cols - half_boundary || kp.pt.y >= img.rows - half_boundary) {
      // outside
      bad_points++;
      descriptors.push_back({});
      continue;
    }
    //这里并没有计算图像块的灰度质心,只是计算了m10,m01,然后算的角度
    float m01 = 0, m10 = 0;
    for (int dx = -half_patch_size; dx < half_patch_size; ++dx) {
      for (int dy = -half_patch_size; dy < half_patch_size; ++dy) {
        uchar pixel = img.at<uchar>(kp.pt.y + dy, kp.pt.x + dx);
        m10 += dx * pixel;
        m01 += dy * pixel;
      }
    }

    // angle should be arc tan(m01/m10);
    float m_sqrt = sqrt(m01 * m01 + m10 * m10) + 1e-18; // avoid divide by zero
    float sin_theta = m01 / m_sqrt;
    float cos_theta = m10 / m_sqrt;

    // compute the angle of this point
    DescType desc(8, 0);
    for (int i = 0; i < 8; i++) {       //8*32=256位的描述子
      uint32_t d = 0;                   //定义一个32位的数据。存储32个0,1数据
      for (int k = 0; k < 32; k++) {    //循环32次,比较p,q值,计算BRIEF描述子
        int idx_pq = i * 32 + k;        //每次循环用掉4个值,一共256行数据,一次循环32行,故乘以系数32
        cv::Point2f p(ORB_pattern[idx_pq * 4], ORB_pattern[idx_pq * 4 + 1]);
        cv::Point2f q(ORB_pattern[idx_pq * 4 + 2], ORB_pattern[idx_pq * 4 + 3]);

        // rotate with theta
        //这一部分点为double型,有点类似于插值的干法
        cv::Point2f pp = cv::Point2f(cos_theta * p.x - sin_theta * p.y, sin_theta * p.x + cos_theta * p.y)
                         + kp.pt;
        cv::Point2f qq = cv::Point2f(cos_theta * q.x - sin_theta * q.y, sin_theta * q.x + cos_theta * q.y)
                         + kp.pt;
        //这里再强制类型转换,取最近邻像素坐标的灰度值用于计算
        if (img.at<uchar>(pp.y, pp.x) < img.at<uchar>(qq.y, qq.x)) {
          d |= 1 << k;
        }
      }
      desc[i] = d;
    }//至此,计算出一个点的描述子
    descriptors.push_back(desc);
  }
  cout << "bad/total: " << bad_points << "/" << keypoints.size() << endl;
}

// brute-force matching
void BfMatch(const vector<DescType> &desc1, const vector<DescType> &desc2, vector<cv::DMatch> &matches) {
  const int d_max = 40;

  for (size_t i1 = 0; i1 < desc1.size(); ++i1) {
    if (desc1[i1].empty()) continue;//如果vector是空就为真
    //这里前面俩参数都是代表的描述子的number,一个的A图的,一个是B图的,最后一个是用于记录描述子的距离
    cv::DMatch m{int(i1), 0, 256};//源码这里有问题,需要强制类型转换
    for (size_t i2 = 0; i2 < desc2.size(); ++i2) {//依次比对,寻找最接近那个,所以暴力匹配才需要匹配i1*i2次
      if (desc2[i2].empty()) continue;
      int distance = 0;
      for (int k = 0; k < 8; k++) {
        distance += _mm_popcnt_u32(desc1[i1][k] ^ desc2[i2][k]);//SSE指令集,计算变量中1的个数
      }
      if (distance < d_max && distance < m.distance) {
        m.distance = distance;
        m.trainIdx = i2;
      }
    }
    if (m.distance < d_max) {
      matches.push_back(m);
    }
  }
}

小错误调试,有的真的属实自己菜

比如,传入图片路径不对,就会有这种错误
在这里插入图片描述

运行结果

在这里插入图片描述

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

slambook2+ch7+orb_self 源码的一点小问题 的相关文章

  • SLAM--intel realsense2在ORB SLAM2 和 ORB SLAM3下建图和重定位(ubuntu 20.04, opencv 4.2.0 以上)

    用intel 的realsense相机实现orb slam2 和 orb slam3 ubuntu 20 04系统 链接地址 ORB SLAM2 可建图 xff0c github https github com zouyuelin ORB
  • boringssl android编译,boringssl_self_test.cpp

    boringssl self test cpp Copyright C 2018 The Android Open Source Project Licensed under the Apache License Version 2 0 t
  • ORB-SLAM(1) --- 让程序飞起来

    1 ORB SLAM简介 ORBSLAM是15年出的比较完备的单目slam算法 xff0c orb指的是一种旋转不变性特征 xff0c 整个算法均是基于orb特征实现的 xff0c 不同于基于稠密或半稠密地图的slam orbslam是一个
  • ORB_SLAM2+realsense运行稠密建图

    具体的环境及其细节 xff1a Ubuntu18 04 realsenseD435i ROS orbslam2 echo gou的博客 CSDN博客 下载代码 xff1a https github com gaoxiang12 ORBSLA
  • 在TX2上配置ORB-SLAM2错误总结

    Pangolin 错误描述 usr lib gcc aarch64 linux gnu 5 aarch64 linux gnu libGL so undefined reference to 96 drmFreeDevice 解决方法 cd
  • windows 生成self-sign证书

    打开powershell 管理员身份运行 New SelfSignedCertificate CertStoreLocation Cert LocalMachine My DnsName 34 mysite local 34 Friendl
  • ORB_SLAM3初试

    源码地址 xff1a orb salm3 github 论文地址 orb slam3 paper ORB SLAM3提供了单目 xff0c 双目 xff0c rgbd 以及各自结合IMU的数据分析实现 demo运行效果展示 xff1a 在不
  • slambook2+ch7+pose_estimation_2d2d+估计多张图像之间的位姿

    算法 计算第一张图和第二张图的关键点并匹配以第一张图的相机坐标为世界坐标 xff0c 计算第二张图相对第一张图的旋转矩阵 平移矩阵不断更新第一张图 xff0c 在进行第二次计算时 xff0c 以第二张图为第一张图 xff0c 以第二张图的相
  • ORB-SLAM2中关键知识点总结

    目录 1 ORB SLAM2的总体框架是怎样的 xff1f 2 ORB SLAM2是怎样完成初始化的 xff1f 3 ORB SLAM2是如何进行Tracking的 xff1f 4 ORB SLAM2是如何选取关键帧的 xff1f 5 OR
  • ubantu配置运行orb-slam2小记

    虚拟环境 参考这篇即可 sudo apt install virtualenv sudo apt install virtualenvwrapper 配置 mkdir HOME virtualenvs export WORKON HOME
  • OpenCV 特征匹配多个对象

    如何在一张图像上找到一种类型的多个对象 我使用 ORB 特征查找器和强力匹配器 opencv 3 2 0 我的源代码 import numpy as np import cv2 from matplotlib import pyplot a
  • 如何从 C 方法调用 Objective-C 方法?

    我有一个 Obj C 对象 里面有很多方法 有时一个方法需要调用同一对象内的另一个方法 我似乎不知道如何让 C 方法调用 Obj C 方法 WORKS Obj C 方法调用 Obj C 方法 self objCMethod WORKS Ob
  • 蟒蛇无私

    这以期望的方式工作 class d def init self arg self a arg def p self print a self a x d 1 y d 2 x p y p yielding a 1 a 2 我尝试消除 自我 并
  • 在 python 中调用超类的 __init__ 时显式传递 Self

    这个问题与帖子有关Python 中的 super 有什么作用 https stackoverflow com questions 222877 how to use super in python 如何初始化基 超 类 https stac
  • OpenCV无法绘制关键点

    我尝试运行所示的示例代码ORB in the openCV页 首先我必须弄清楚问题cv2 ORB 变成cv2 ORB create 出现此错误后 出现以下内容 Traceback most recent call last File orb
  • 为什么 Array#each 返回具有相同元素的数组?

    我正在学习如何做的细节each在 ruby 中工作 我尝试了以下代码行 p 1 2 3 4 5 each element el 结果是一个数组 1 2 3 4 5 为什么返回值是each相同的数组 没有each只是提供一种迭代方法 或者这只
  • 如何像instance_eval方法一样在块中更改self?

    instance eval 方法在其块中更改 self 例如 class D end d D new d instance eval do puts self print something like
  • 令人困惑的类型错误

    我有一个小型 Python 程序 它应该通过运行适当的方法来对按下向上按钮做出反应 但它没有这样做 而是给了我一个令人困惑的错误 from tkinter import class App def init self master self
  • Lua:冒号符号、“自我”和函数定义与调用

    我对定义 调用 Lua 函数时使用的冒号表示法感到非常困惑 我以为我已经明白了 直到我看到这段代码 function string PatternSafe str return str gsub pattern escape replace
  • Rails——自我与@

    我正在关注 Michael Hartl 的 RoR 教程 它涵盖了密码加密的基础知识 这是当前的用户模型 class User lt ActiveRecord Base attr accessor password attr accessi

随机推荐