Intrinsic

一起做RGB-D SLAM (4)

核能气质少年 提交于 2020-04-29 12:40:54
第四讲 点云拼接   广告:“一起做”系列的代码网址:https://github.com/gaoxiang12/rgbd-slam-tutorial-gx 当博客更新时代码也会随着更新。 SLAM技术交流群:374238181   读者朋友们大家好!尽管还没到一周,我们的教程又继续更新了,因为暑假实在太闲了嘛! 上讲回顾   上一讲中,我们理解了如何利用图像中的特征点,估计相机的运动。最后,我们得到了一个旋转向量与平移向量。那么读者可能会问:这两个向量有什么用呢?在这一讲里,我们就要使用这两个向量,把两张图像的点云给拼接起来,形成更大的点云。   首先,我们把上一讲的内容封装进slamBase库中,代码如下:   include/slamBase.h 1 // 帧结构 2 struct FRAME 3 { 4 cv::Mat rgb, depth; // 该帧对应的彩色图与深度图 5 cv::Mat desp; // 特征描述子 6 vector<cv::KeyPoint> kp; // 关键点 7 }; 8 9 // PnP 结果 10 struct RESULT_OF_PNP 11 { 12 cv::Mat rvec, tvec; 13 int inliers; 14 }; 15 16 // computeKeyPointsAndDesp 同时提取关键点与特征描述子 17

SLAM之特征匹配(一)————RANSAC-------OpenCV中findFundamentalMat函数使用的模型

风格不统一 提交于 2020-04-27 17:24:26
随机抽样一致性(RANSAC)算法,可以在一组包含“外点”的数据集中,采用不断迭代的方法,寻找最优参数模型,不符合最优模型的点,被定义为“外点”。在图像配准以及拼接上得到广泛的应用,本文将对RANSAC算法在OpenCV中角点误匹配对的检测中进行解析。 1.RANSAC原理 OpenCV中滤除误匹配对采用RANSAC算法寻找一个最佳单应性矩阵H,矩阵大小为3×3。RANSAC目的是找到最优的参数矩阵使得满足该矩阵的数据点个数最多,通常令h33=1来归一化矩阵。由于单应性矩阵有8个未知参数,至少需要8个线性方程求解,对应到点位置信息上,一组点对可以列出两个方程,则至少包含4组匹配点对。 其中(x,y)表示目标图像角点位置,(x',y')为场景图像角点位置,s为尺度参数 。 RANSAC算法从匹配数据集中随机抽出4个样本并保证这4个样本之间不共线,计算出单应性矩阵,然后利用这个模型测试所有数据,并计算满足这个模型数据点的个数与投影误差(即代价函数),若此模型为最优模型,则对应的代价函数最小。 ----------------------------------------------------------------------------------------------------------------- RANSAC算法步骤: 1. 随机从数据集中随机抽出4个样本数据

《JAVA设计模式》之享元模式(Flyweight)

流过昼夜 提交于 2020-04-25 16:39:34
在阎宏博士的《JAVA与模式》一书中开头是这样描述享元(Flyweight)模式的:   Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。 Java中的String类型   在JAVA语言中,String类型就是使用了享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝。String a="abc",其中"abc"就是一个字符串常量。 public class Test { public static void main(String[] args) { String a = "abc" ; String b = "abc" ; System.out.println(a== b); } }   上面的例子中结果为: true ,这就说明a和b两个引用都指向了常量池中的同一个字符串常量"abc"。这样的设计避免了在创建N多相同对象时所产生的不必要的大量的资源消耗。 享元模式的结构   享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。享元对象能做到共享的关键是区分 内蕴状态

极客时间 深入拆解 Java 虚拟机 百度云

冷暖自知 提交于 2020-04-25 01:53:18
开篇词 (1讲) 开篇词 | 为什么我们要学习Java虚拟机? 模块一:Java虚拟机基本原理 (12讲) 01 | Java代码是怎么运行的? 02 | Java的基本类型 03 | Java虚拟机是如何加载Java类的? 04 | JVM是如何执行方法调用的?(上) 05 | JVM是如何执行方法调用的?(下) 06 | JVM是如何处理异常的? 07 | JVM是如何实现反射的? 08 | JVM是怎么实现invokedynamic的?(上) 09 | JVM是怎么实现invokedynamic的?(下) 10 | Java对象的内存布局 11 | 垃圾回收(上) 12 | 垃圾回收(下) 模块二:高效编译 (12讲) 【工具篇】 常用工具介绍 13 | Java内存模型 14 | Java虚拟机是怎么实现synchronized的? 15 | Java语法糖与Java编译器 16 | 即时编译(上) 17 | 即时编译(下) 18 | 即时编译器的中间表达形式 19 | Java字节码(基础篇) 20 | 方法内联(上) 21 | 方法内联(下) 22 | HotSpot虚拟机的intrinsic 23 | 逃逸分析 模块三:代码优化 (10讲) 24 | 字段访问相关优化 25 | 循环优化 26 | 向量化 27 | 注解处理器 28 | 基准测试框架JMH(上) 29

相机内参外参

蹲街弑〆低调 提交于 2020-04-23 09:31:19
相机内参外参 参考资料: https://www.cnblogs.com/wangguchangqing/p/8126333.html 1.像素坐标 具体参见百度百科: https://baike.baidu.com/item/像素坐标/5372225 2.相机内参矩阵(Intrinsic matrix) 说内参矩阵之前,还得再引入像素坐标系的概念。 上述图像点的表示是长度单位,不是像素,由于我们拿到的图像是以像素来衡量的,因此还需要将图像坐标系转化为像素坐标系。 在此直接给出结论: 于是之前的相机矩阵又得添加一项: (1) 上述推导中有一个假设前提,就是相机的感光元件是正方形的,感光元件的安装也是通过光轴中心的,但这不可能,于是会出现以下两个问题: 感光元件的基本单元不是方的,一个方形物体可能最后成像为一个矩形(甚至会有斜切效果,一般可以不考虑斜切因素);这导致表达式(1)中,dx与dy不相等, 感光元件的中心与光轴通过的主点不重合,会使得正常投影的图像发生了一点小小的位移。这导致表达式(1)中,u0与v0可能并不等于成像传感器长宽尺寸的一半。(理想状态下就是一半) 表达式(1)中,等式右边的前三个矩阵合并,得到下式: 其中被称为内参矩阵(Wikipedia) 或者只合并等式右边前两个矩阵,得到下式: 一般习惯将矩阵: 称为 内参矩阵 (少了一列0)。 内参矩阵的参数含义: f

synchronized 和 ReentrantLock的区别

為{幸葍}努か 提交于 2019-12-01 21:41:48
synchronized 是 Java 内建的同步机制,所以也有人称其为 Intrinsic Locking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里。 在 Java 5 以前,synchronized 是仅有的同步手段,在代码中, synchronized 可以用来修饰方法,也可以使用在特定的代码块儿上,本质上 synchronized 方法等同于把方法全部语句用 synchronized 块包起来。 ReentrantLock,通常翻译为再入锁,是 Java 5 提供的锁实现,它的语义和 synchronized 基本相同。再入锁通过代码直接调用 lock() 方法获取,代码书写也更加灵活。与此同时,ReentrantLock 提供了很多实用的方法,能够实现很多 synchronized 无法做到的细节控制,比如可以控制 fairness,也就是公平性,或者利用定义条件等。但是,编码中也需要注意,必须要明确调用 unlock() 方法释放,不然就会一直持有该锁。 synchronized 和 ReentrantLock 的性能不能一概而论,早期版本 synchronized 在很多场景下性能相差较大,在后续版本进行了较多改进,在低竞争场景中表现可能优于 ReentrantLock。 来源: oschina 链接: