Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RGBD融合原理及实践[通俗易懂]

RGBD融合原理及实践[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-10-01 09:28:32
发布于 2022-10-01 09:28:32
96400
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

RGBD融合原理及实践

前言

好久没更新博客了,主要是因为懒,最近有些得闲,决定纪录下之前的工作。RT,RGBD数据融合其实就是将3D摄像机的RGB与Depth数据做融合显示的过程,做法也不难理解,就是将depth camera与rgb camera的像素对应起来即可。

原理部分

原理部分主要借鉴这篇 博文, 详细的公式在这就不作重复了,贴张图吧。

从上面的博客或图片可以看出,关键先找到两个camera的外参矩阵RT,一开始我是按照博客的来用GML Camera Calibration Toolbox进行内外参矩阵,然后利用公式求出RT,但实际测试下来我尝试在同一场景下同时采集双目摄像头的几组正面棋盘,获得它们的外参得出的RT都不正常,这里的RT很重要,直接影响到后面计算对应像素! 后面我还是转用大杀器matlab calibration toolbox,虽然比GML标定要麻烦,每张图都要手动选四个参考角点,但胜在它稳定、精度高啊,我基本走一次流程下来得到的RT就比较准确了。所以,标个内参的话可以用GML,比较快搞掂,但需要双目标定时还是用回matlab吧,哈哈。 哦,对了,matlab出来的旋转矩阵是om,需要做一个罗格变换成标准的3×3矩阵,toolbox里自带了接口,直接用即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Rotation vector:             om = [ 0.05129   0.00136  -0.02893 ] ? [ 0.03624   0.03419  0.00277 ]
>> rodrigues(om) 
ans =
    0.9996    0.0289    0.0006
   -0.0289    0.9983   -0.0513
   -0.0021    0.0512    0.9987

实践

来到实践部分,写了一个简单的脚本做验证,主要是验证下标定出的RT是否正确可用。(注意代码里IR即指depth camera)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numpy import *
import numpy as np
# import matplotlib.pylab as plt


#双目内参
# ir camera
# 408.72767  0           332.18622
# 0        410.38278    227.32216
# 0        0             1 
# 
# rgb camera
# 438.63884  0      337.13761
# 0          440.86391   254.91443
# 0         0             1
#  


ir_in = np.loadtxt("ir_matlab_intrinsic.txt")
rgb_in = np.loadtxt("rgb_matlab_intrinsic.txt")

# RT矩阵
R = np.array([[0.9996,    0.0289,    0.0006], [-0.0289,    0.9983,   -0.0513], [-0.0021,    0.0512,    0.9987]])
T = np.array([[-54.58182],   [2.11322],  [-0.64764]])

print (R)
print (T)
# ir 内参逆阵
ir_in_I = linalg.inv(ir_in)
print (ir_in_I)

# 建立ir像面坐标,900指某一点的深度900mm,注意是 Zc [x  y 1]
pixel_depth = 900
test = np.array([[129 * pixel_depth], [302 * pixel_depth], [pixel_depth]])

print ("---- Pir ---")
P_ir = np.dot(ir_in_I, test)
print (P_ir)
P_rgb = np.dot(R, P_ir) + T
print ("---- P rgb ---")
print (P_rgb)
p_rgb = np.dot(rgb_in, P_rgb)

print (p_rgb)
print (p_rgb / p_rgb[2])

上面代码主要验证IR camera坐标 (129, 302)与RGB对应的坐标是多少,最终输出的p_rgb x y分量即为对应的rgb坐标值,实际测试下来还是蛮准确的。OK,验证完事后,可以用C++实现下上面的脚本,对每个pixel都做这样的转换处理,即可以得到rgb depth camera对应关系,也就是说做到这两者的数据融合咯。 注意最好用eigen这样的三方库,直接用opencv的矩阵运算实在太慢了(其实主要是cv::Mat 动态变量分配空间比较耗时,反复调用的话延时完全不可接受)。 下图为实际的融合效果,初步来看效果还是不错的。(请忽视右上角的那几道条纹,那是因为rgb摄像头在日光灯下产生了条纹)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192335.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月17日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构二叉树知识点总结
术语  1. 节点的度:一个节点含有的子树的个数称为该节点的度; 2. 叶节点或终端节点:度为零的节点;  3. 非终端节点或分支节点:度不为零的节点;  4. 父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;  5. 兄弟节点:具有相同父节点的节点互称为兄弟节点;  6. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;  7. 树的高度或深度:树中节点的最大层次;  8. 堂兄弟节点:父节点在同一层的节点互为堂兄弟;  9. 节点的祖先:从根到该节点所经分支
10JQKA
2018/05/09
1.5K0
【数据结构】树与二叉树(六):二叉树的链式存储(创建、释放)
参照前文:【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度
Qomolangma
2024/07/30
1700
【数据结构】树与二叉树(六):二叉树的链式存储(创建、释放)
二叉树简介
二叉树是由n(n>=0)个节点组成的数据集合。当 n=0 时,二叉树中没有节点,称为空二叉树。当 n=1 时,二叉树只有根节点一个节点。当 n>1 时,二叉树的每个节点都最多只能有两个子树,递归地构建成一棵完整的二叉树。
Python碎片公众号
2021/02/26
4630
二叉树简介
二叉树数据结构:深入了解二叉树的概念、特性与结构
我们转向了更为复杂而有趣的数据结构——二叉树。本文将引领我们进入二叉树的世界,从最基本的概念和结构开始,逐步深入了解二叉树的顺序结构和链式结构
是Nero哦
2024/01/18
6600
二叉树数据结构:深入了解二叉树的概念、特性与结构
我的软考之路(四)——数据结构与算法(2)之树与二叉树
上篇博文主要介绍的是数据结构的线性结构,我们这篇博文介绍非线性结构—树与二叉树,我先介绍树的一些基本概念,树的遍历,再介绍二叉树相关概念和特性,以及二叉树的遍历,最后再树与二叉树的对比,总结。
程序猿小亮
2021/01/29
4310
【数据结构与算法】详解二叉树 上:理论篇——二叉树的基本概念与性质
二叉树的顺序存储结构,又称为数组表示法,是用一组地址连续的存储单元依次存储二叉树中的节点元素。在顺序存储结构中,通常按照二叉树节点自上向下、自左向右的顺序存储。以下是关于二叉树顺序存储结构的详细解释:
倔强的石头
2024/12/06
3190
【数据结构与算法】详解二叉树 上:理论篇——二叉树的基本概念与性质
二叉树:数据结构的分形之美
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把他叫做树是因为它看起来像一棵倒挂的树,也就说它的根朝上,而叶朝下的。它具有以下的特点:
用户11070251
2024/05/04
1500
二叉树:数据结构的分形之美
数据结构——二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
Eternity._
2024/06/14
1060
数据结构——二叉树
【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)
  一个森林是0棵或多棵不相交(非空)树的集合,通常是一个有序的集合。换句话说,森林由多个树组成,这些树之间没有交集,且可以按照一定的次序排列。在森林中,每棵树都是独立的,具有根节点和子树,树与树之间没有直接的连接关系。   森林是树的扩展概念,它是由多个树组成的集合。在计算机科学中,森林也被广泛应用于数据结构和算法设计中,特别是在图论和网络分析等领域。
Qomolangma
2024/07/30
3240
【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)
【数据结构】树与二叉树
https://cloud.tencent.com/developer/article/2466159?shareByChannel=link
池央
2024/11/28
1080
【数据结构】树与二叉树
二叉树的性质
节点的度:一个节点含有的子树的个数称为该节点的度 树的度:一棵树中,最大的节点的度称为树的度 叶子节点或终端节点:度为0的节点称为叶节点 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点 根结点:一棵树中,没有双亲结点的结点 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推 树的高度或深度:树中节点的最大层次
VIBE
2022/12/02
4730
[数据结构]二叉树概念
树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成一个具有有限关系的集合。把它叫做树,是因为它看起来像一颗倒挂的树,也就是它是根朝上,而叶朝下的。
IT编程爱好者
2023/04/12
2870
[数据结构]二叉树概念
数据结构之树
树(Tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的圣诞树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
我是攻城师
2018/11/08
8580
【数据结构】初识二叉树
我们在数前面已经学了许多数据结构,顺序表,链表,栈,队列。但是他们都有一个特点那就是,他们通常存储具有线性关系的数据,而在实际应用中许多逻辑结构并不是简单线性结构,常常存在着一对多,甚至多对多的情况。如:企业里的职级关系。族谱……
薄荷冰
2024/01/22
1190
【数据结构】初识二叉树
【愚公系列】软考中级-软件设计师 017-数据结构(树和二叉树概念)
数据结构中的树是一种非线性的数据结构,它由一组节点和连接这些节点的边组成。树的节点之间的关系是一种层次关系,其中一个节点称为根节点,其他节点可以是它的子节点或后代节点。树的结构使得在树中进行快速的搜索、插入、删除操作成为可能。
愚公搬代码
2024/01/29
3150
【数据结构】二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
xxxflower
2023/04/16
2690
【数据结构】二叉树
二叉树的一些性质图解
把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: (01) 每个节点有零个或多个子节点; (02) 没有父节点的节点称为根节点; (03) 每一个非根节点有且只有一个父节点; (04) 除了根节点外,每个子节点可以分为多个不相交的子树。
全栈程序员站长
2022/08/31
9240
期末复习之数据结构 第6章 树和二叉树
答:最快方法:用叶子数=[n/2]=350 5. 设一棵完全二叉树具有1000个结点,则此完全二叉树有 500 个叶子结点,有 499 个度为2的结点,有 1 个结点只有非空左子树,有 0 个结点只有非空右子树。 答:最快方法:用叶子数=[n/2]=500 ,n2=n0-1=499。 另外,最后一结点为2i属于左叶子,右叶子是空的,所以有1个非空左子树。完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0. 6. 一棵含有n个结点的k叉树,可能达到的最大深度为 n ,最小深度为 2 。 答:当k=1(单叉树)时应该最深,深度=n(层);当k=n-1(n-1叉树)时应该最浅,深度=2(层),但不包括n=0或1时的特例情况。教材答案是“完全k叉树”,未定量。) 7. 二叉树的基本组成部分是:根(N)、左子树(L)和右子树(R)。因而二叉树的遍历次序有六种。最常用的是三种:前序法(即按N L R次序),后序法(即按 L R N 次序)和中序法(也称对称序法,即按L N R次序)。这三种方法相互之间有关联。若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是 F E G H D C B 。 8.中序遍历的递归算法平均空间复杂度为 O(n) 。 答:即递归最大嵌套层数,即栈的占用单元数。精确值应为树的深度k+1,包括叶子的空域也递归了一次。 9. 用5个权值{3, 2, 4, 5, 1}构造的哈夫曼(Huffman)树的带权路径长度是 33 。 三、单项选择题 ( C )1. 不含任何结点的空树 。 (A)是一棵树; (B)是一棵二叉树; (C)是一棵树也是一棵二叉树; (D)既不是树也不是二叉树 答:以前的标答是B,因为那时树的定义是n≥1 ( C )2.二叉树是非线性数据结构,所以 。 (A)它不能用顺序存储结构存储; (B)它不能用链式存储结构存储; (C)顺序存储结构和链式存储结构都能存储; (D)顺序存储结构和链式存储结构都不能使用 ( C )3. 〖01年计算机研题〗 具有n(n>0)个结点的完全二叉树的深度为 。 (A) élog2(n)ù (B) ë log2(n)û (C) ë log2(n) û+1 (D) élog2(n)+1ù 注1:éx ù表示不小于x的最小整数;ë xû表示不大于x的最大整数,它们与[ ]含义不同! 注2:选(A)是错误的。例如当n为2的整数幂时就会少算一层。似乎ë log2(n) +1û是对的? ( A )4.把一棵树转换为二叉树后,这棵二叉树的形态是 。 (A)唯一的 (B)有多种 (C)有多种,但根结点都没有左孩子 (D)有多种,但根结点都没有右孩子 5. 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。 树是结点的有限集合,它A 根结点,记为T。其余的结点分成为m(m≥0)个 B 的集合T1,T2,…,Tm,每个集合又都是树,此时结点T称为Ti的父结点,Ti称为T的子结点(1≤i≤m)。一个结点的子结点个数为该结点的 C 。 供选择的答案 A: ①有0个或1个 ②有0个或多个 ③有且只有1个 ④有1个或1个以上 B: ①互不相交 ② 允许相交 ③ 允许叶结点相交 ④ 允许树枝结点相交 C: ①权 ② 维数 ③ 次数(或度) ④ 序 答案:ABC=1,1,3 6. 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。 二叉树 A 。在完全的二叉树中,若一个结点没有 B ,则它必定是叶结点。每棵树都能惟一地转换成与它对应的二叉树。由树转换成的二叉树里,一个结点N的左子女是N在原树里对应结点的 C ,而N的右子女是它在原树里对应结点的 D 。 供选择的答案 A: ①是特殊的树 ②不是树的特殊形式 ③是两棵树的总称 ④有是只有二个根结点的树形结构 B: ①左子结点 ② 右子结点 ③ 左子结点或者没有右子结点 ④ 兄弟 C~D: ①最左子结点 ② 最右子结点 ③ 最邻近的右兄弟 ④ 最邻近的左兄弟 ⑤ 最左的兄弟 ⑥ 最右的兄弟 答案:A= B= C= D= 答案:ABCDE=2,1,1,3 四
henu_Newxc03
2021/12/28
6790
期末复习之数据结构 第6章 树和二叉树
【数据结构】树和二叉树详解
在前面我们一起了解的数据结构有顺序表、链表、栈和队列,这次要介绍的是树 与它们相同的是,树也是常见的数据结构。而与它们又不同的是,树是非线性结构。之前我们了解的都是线性的。 这次一起来看一个非线性的结构–树。
zxctscl
2024/01/23
1710
【数据结构】树和二叉树详解
数据结构——lesson6二叉树基础
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
大耳朵土土垚
2024/03/13
980
数据结构——lesson6二叉树基础
推荐阅读
相关推荐
数据结构二叉树知识点总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验