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

RGBD融合原理及实践[通俗易懂]RGBD融合原理及实践前言原理部分实践前言好久没更新博客了,主要是因为懒,最近有些得闲,决定纪录下之前的工作。RT,RGBD数据融合其实就是将3D摄像机的RGB与Depth数据做融合显示的过程,做法也不难理解,就是将depthcamera与rgbcamera的像素对应起来即可。原理部分原理部分主要借鉴这篇博文,详细的公式在这就不作重复了,贴张图吧。从上面的博客或图片可以看出,…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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里自带了接口,直接用即可。

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)

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.net/192335.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android 短信验证码的实现

    android 短信验证码的实现公司用的短信验证码是Mob.com网址:http://www.mob.com进入网站注册登录之后进入后在上面有应用是让选择android还是ios之类的,点击下载SDK–选择免费短信验证SDK,下载之后大家可以在快速继承那看到官方提供的方法下面对其步骤解读下1 导入SDK短信SDK使用如下方式完成集成。具体步骤如下:将SMS_

    2022年7月25日
  • Oracle 函数大全[通俗易懂]

    Oracle 函数大全[通俗易懂]OracleSQL提供了用于执行特定操作的专用函数。主要使用单行函数和聚合函数两种类型的函数:单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果:字符函数、数字函数、转换函

    2022年7月1日
  • 阿里云服务器配置ssl证书_阿里云服务器配置选择

    阿里云服务器配置ssl证书_阿里云服务器配置选择阿里云配置SSL证书证书申请概览![在这里插入图片描述](https://img-blog.csdnimg.cn/20210511153723521.png)申请配置证书申请概览申请两种方式:进入阿里云控制台页面->安全(模块/菜单)->SSL证书;在阿里云搜索框中进行搜索ssl证书点击进入;购买证书需要注意的是已过期的证书是没有到期新购操作的,只能重新购买。Symantec免费SSL证书我们选择Symantec免费型DVSSL,不花钱0元就可以购买。这个免

    2022年10月3日
  • 配置缺省路由_缺省路由下一跳

    配置缺省路由_缺省路由下一跳缺省路由(默认路由),易目的网络为0.0.0.0,子网掩码为0.0.0.0的形式出现。应用缺省路由可减少路由表的规模,减少维护压力。如下图对于交换机A而言,要去往交换机B所直连的PC1\PC2,就需要有路由的指引。如果我们配置静态路由的话,就需要在交换机A上配置两条静态路由。即增加了配置工作量,又增加了交换机A的负担。因为交换机需要维护更多的路由条目,而承载路由条目的路由表需要占用设备内存资源。为优化网络设计,在保证路由可达的情况下,可以尽量减少路由表的路由条目。在下图场景下,我们可以配置一条缺省路由

    2022年10月27日
  • java新手代码大全_java新手的一串代码「建议收藏」

    java新手代码大全_java新手的一串代码「建议收藏」importjava.util.*;importjava.io.*;abstractclassGood{Stringname;doubleprice;Good(Stringname,doubleprice){this.name=name;this.price=price;}}classBookextendsGood{Stringname;…importjava.util.*;importj…

    2022年6月21日
  • git常用命令

    git常用命令Git常用命令汇总以及其它相关操作(转载)一、常用的git命令–文件目录操作命令mkdir*创建一个空目录*指目录名pwd显示当前目录的路径。cat*查看*文件内容gitr

    2022年7月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号