RealSense二次开发

2023-05-16

转载:librealsense2查看相机设备信息 - JavaShuo

文章目录

    • 1. librealsense2设备信息读取
    • 2.realsense 投影函数和反投影函数
    • 3.深度相机与彩色相机的坐标变换

1. librealsense2设备信息读取

librealsense2提供的接口可以检测连接到系统的所有realsense设备,如sr300,并可以读取每个设备的编号、彩色相机和深度相机的内参(相机内参矩阵参数和畸变系数及其畸变模型)、彩色相机和深度相机坐标系间的变换矩阵。
接口调用如下:

#include <librealsense2/rs.hpp> // Include RealSense Cross Platform API
#include<iostream>
#include<opencv2/opencv.hpp>

int main(int argc, char * argv[]) try
{
  rs2::log_to_console(RS2_LOG_SEVERITY_ERROR);

  /// Create librealsense context for managing devices
  rs2::context ctx;   
  auto devs = ctx.query_devices();                  ///获取设备列表
  int device_num = devs.size();
  std::cout<<"device num: "<<device_num<<std::endl;///设备数量

  ///我只连了一个设备,因此我查看第0个设备的信息
  /// 当无设备连接时此处抛出rs2::error异常
  rs2::device dev = devs[0];
  ///设备编号,每个设备都有一个不同的编号, 如果连接了多个设备,便可根据此编号找到你希望启动的设备
  char serial_number[100] = {0};
  strcpy(serial_number, dev.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER));
  printf("serial_number: %s\n",serial_number); 

  ///设置从设备管道获取的深度图和彩色图的配置对象
  rs2::config cfg;
  ///配置彩色图像流:分辨率640*480,图像格式:BGR, 帧率:30帧/秒
  ///默认配置任意一个设备,若要配置指定的设备可以根据设备在设备列表里的序列号进行制定:
  ///int indx = 0; ///表示第0个设备
  ///cfg.enable_stream(RS2_STREAM_COLOR,indx, 640, 480, RS2_FORMAT_BGR8, 30);
  cfg.enable_stream(RS2_STREAM_COLOR,640, 480, RS2_FORMAT_BGR8, 30);
  ///配置深度图像流:分辨率640*480,图像格式:Z16, 帧率:30帧/秒
  cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);

  ///生成Realsense管道,用来封装实际的相机设备
  rs2::pipeline pipe;
  pipe.start(cfg); ///根据给定的配置启动相机管道

  rs2::frameset data;
  data = pipe.wait_for_frames();///等待一帧数据,默认等待5s

  rs2::depth_frame depth       = data.get_depth_frame(); ///获取深度图像数据
  rs2::video_frame color       = data.get_color_frame();  ///获取彩色图像数据
  rs2::stream_profile dprofile =  depth.get_profile();
  rs2::stream_profile cprofile =  color.get_profile();

  ///获取彩色相机内参
  rs2::video_stream_profile cvsprofile(cprofile);
  rs2_intrinsics color_intrin =  cvsprofile.get_intrinsics();
  std::cout<<"\ncolor intrinsics: ";
  std::cout<<color_intrin.width<<" "<<color_intrin.height<<" ";
  std::cout<<color_intrin.ppx<<" "<<color_intrin.ppy<<" ";
  std::cout<<color_intrin.fx<<" "<<color_intrin.fy<<std::endl;
  std::cout<<"coeffs: ";
  for(auto value : color_intrin.coeffs)
    std::cout<<value<<" ";
  std::cout<<std::endl;
  std::cout<<"distortion model: "<<color_intrin.model<<std::endl;///畸变模型

  ///获取深度相机内参
  rs2::video_stream_profile dvsprofile(dprofile);
  rs2_intrinsics depth_intrin =  dvsprofile.get_intrinsics();
  std::cout<<"\ndepth intrinsics: ";
  std::cout<<depth_intrin.width<<" "<<depth_intrin.height<<" ";
  std::cout<<depth_intrin.ppx<<" "<<depth_intrin.ppy<<" ";
  std::cout<<depth_intrin.fx<<" "<<depth_intrin.fy<<std::endl;
  std::cout<<"coeffs: ";
  for(auto value : depth_intrin.coeffs)
    std::cout<<value<<" ";
  std::cout<<std::endl;
  std::cout<<"distortion model: "<<depth_intrin.model<<std::endl;///畸变模型

  ///获取深度相机相对于彩色相机的外参,即变换矩阵: P_color = R * P_depth + T
  rs2_extrinsics extrin = dprofile.get_extrinsics_to(cprofile);
  std::cout<<"\nextrinsics of depth camera to color camera: \nrotaion: "<<std::endl;
  for(int i = 0; i < 3; ++i){
    for(int j = 0; j < 3; ++j){
      float value = extrin.rotation[3*i + j];
      std::cout<<value<<" ";
    }
    std::cout<<std::endl;
  }
  std::cout<<std::endl;

  std::cout<<"translation: ";
  for(auto value : extrin.translation)
    std::cout<<value<<" ";
  std::cout<<std::endl;

  while(1)
  {
	///等待一帧数据,默认等待5s
    data = pipe.wait_for_frames();

    rs2::depth_frame depth  = data.get_depth_frame(); ///获取深度图像数据
    rs2::video_frame color  = data.get_color_frame();  ///获取彩色图像数据
    int color_width  = color.get_width();
    int color_height = color.get_height();

    int depth_width  = depth.get_width();
    int depth_height = depth.get_height();

    if (!color || !depth) break;                ///如果获取不到数据则退出

	///将彩色图像和深度图像转换为Opencv格式
    cv::Mat image(cv::Size(color_width, color_height), CV_8UC3, (void*)color.get_data(), cv::Mat::AUTO_STEP);
    cv::Mat depthmat(cv::Size(depth_width, depth_height), CV_16U, (void*)depth.get_data(), cv::Mat::AUTO_STEP);
		
	///显示
    cv::imshow("image",image);
    cv::imshow("depth",depthmat);
    cv::waitKey(1);
  }
  return EXIT_SUCCESS;
}
catch (const rs2::error & e)
{	
    ///捕获相机设备的异常
    std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n " << e.what() << std::endl;
    return EXIT_FAILURE;
}
catch (const std::exception& e)
{
    std::cerr<<"Other error : " << e.what() << std::endl;
    return EXIT_FAILURE;
}

在这里插入图片描述

 

可以看到我连接了一个设备,设备编号为541142001592,同时也可以看到彩色相机和深度相机的内参和畸变系数及其畸变模型,彩色相机畸变模型为:None, 并且畸变系数都为0,表示彩色相机无畸变;而深度相机畸变模型为:Inverse Brown Conrady,并且畸变系数不为0,表示深度相机存在畸变。畸变系数从左到右分别是:k1, k2, p1, p2, k3。在librealsense2安装路径下的rsutil.h文件可以看到将3d坐标点投影到2d图像平面的函数 rs2_project_point_to_pixel 写着“ //assert(intrin->model != RS2_DISTORTION_INVERSE_BROWN_CONRADY); // Cannot project to an inverse-distorted image”,也就是说我使用的设备的深度相机无法将3d坐标图像直接投影到2d图像平面,有关相机内参和畸变模型参考另一篇博客相机内参与畸变模型

2.realsense 投影函数和反投影函数

在librealsense2安装路径下的rsutil.h文件里可以找到相机的投影函数和反投影函数,投影函数即将相机坐标系下的一个3d点投影到2d图像平面上的像素坐标,反投影函数即已知相机2d图像平面上像素点对应的深度值可以计算出该点在相机坐标系下的3d坐标值,下面粘贴这两个函数出来:
投影函数:

/* Given a point in 3D space, compute the corresponding pixel coordinates in an image with no distortion or forward distortion coefficients produced by the same camera */
static void rs2_project_point_to_pixel(float pixel[2], const struct rs2_intrinsics * intrin, const float point[3])
{
    //assert(intrin->model != RS2_DISTORTION_INVERSE_BROWN_CONRADY); // Cannot project to an inverse-distorted image

    float x = point[0] / point[2], y = point[1] / point[2];

    if(intrin->model == RS2_DISTORTION_MODIFIED_BROWN_CONRADY)
    {

        float r2  = x*x + y*y;
        float f = 1 + intrin->coeffs[0]*r2 + intrin->coeffs[1]*r2*r2 + intrin->coeffs[4]*r2*r2*r2;
        x *= f;
        y *= f;
        float dx = x + 2*intrin->coeffs[2]*x*y + intrin->coeffs[3]*(r2 + 2*x*x);
        float dy = y + 2*intrin->coeffs[3]*x*y + intrin->coeffs[2]*(r2 + 2*y*y);
        x = dx;
        y = dy;
    }
    if (intrin->model == RS2_DISTORTION_FTHETA)
    {
        float r = sqrt(x*x + y*y);
            auto rd = (1.0f / intrin->coeffs[0] * atan(2 * r* tan(intrin->coeffs[0] / 2.0f)));
            x *= rd / r;
            y *= rd / r;
    }

    pixel[0] = x * intrin->fx + intrin->ppx;
    pixel[1] = y * intrin->fy + intrin->ppy;
}

反投影函数:

/* Given pixel coordinates and depth in an image with no distortion or inverse distortion coefficients, compute the corresponding point in 3D space relative to the same camera */
static void rs2_deproject_pixel_to_point(float point[3], const struct rs2_intrinsics * intrin, const float pixel[2], float depth)
{
    assert(intrin->model != RS2_DISTORTION_MODIFIED_BROWN_CONRADY); // Cannot deproject from a forward-distorted image
    assert(intrin->model != RS2_DISTORTION_FTHETA); // Cannot deproject to an ftheta image
    //assert(intrin->model != RS2_DISTORTION_BROWN_CONRADY); // Cannot deproject to an brown conrady model

    float x = (pixel[0] - intrin->ppx) / intrin->fx;
    float y = (pixel[1] - intrin->ppy) / intrin->fy;
    if(intrin->model == RS2_DISTORTION_INVERSE_BROWN_CONRADY)
    {
        float r2  = x*x + y*y;
        float f = 1 + intrin->coeffs[0]*r2 + intrin->coeffs[1]*r2*r2 + intrin->coeffs[4]*r2*r2*r2;
        float ux = x*f + 2*intrin->coeffs[2]*x*y + intrin->coeffs[3]*(r2 + 2*x*x);
        float uy = y*f + 2*intrin->coeffs[3]*x*y + intrin->coeffs[2]*(r2 + 2*y*y);
        x = ux;
        y = uy;
    }
    point[0] = depth * x;
    point[1] = depth * y;
    point[2] = depth;
}

3.深度相机与彩色相机的坐标变换

第一节中我们获取了深度相机到彩色相机的坐标变换矩阵,下列realsense函数将深度相机坐标系下的一个坐标点转换到彩色相机坐标系下的坐标值,同理也可以计算彩色相机坐标系下的坐标值在深度相机坐标系下的坐标值:

/* Transform 3D coordinates relative to one sensor to 3D coordinates relative to another viewpoint */
static void rs2_transform_point_to_point(float to_point[3], const struct rs2_extrinsics * extrin, const float from_point[3])
{
    to_point[0] = extrin->rotation[0] * from_point[0] + extrin->rotation[3] * from_point[1] + extrin->rotation[6] * from_point[2] + extrin->translation[0];
    to_point[1] = extrin->rotation[1] * from_point[0] + extrin->rotation[4] * from_point[1] + extrin->rotation[7] * from_point[2] + extrin->translation[1];
    to_point[2] = extrin->rotation[2] * from_point[0] + extrin->rotation[5] * from_point[1] + extrin->rotation[8] * from_point[2] + extrin->translation[2];
}

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

RealSense二次开发 的相关文章

  • Realsense SR300 获取深度和彩色图像

    include lt windows h gt include lt wchar h gt include 34 pxcsensemanager h 34 include 34 util render h 34 SDK provided u
  • Linux/Ubuntu16.04 安装RealSense SDK 2.0

    RealSense实感 Intel 安装环境 xff1a Ubuntu 16 04 需要有USB3 0 不是16 04的系统 xff0c 安装过程不同 更多的安装细节 xff0c 见参考资料 1 更新Ubuntu以及BOOT sudo ap
  • 手把手教你实现ROS Melodic+Realsense D435i

    硬件配置 xff1a HP ProDesk 480 G6 MT 系统内存 xff1a 8G 处理器 xff1a Intel i7 8700 CPU 操作系统 xff1a Ubuntu 18 04 相机配置 xff1a Intel Reals
  • Realsense D435i 运行 Vins-fusion

    无人机控制和规划都需要定位信息 xff0c 飞控输出的位置信息一是精度低 xff0c 二是室内环境无法使用 xff0c 三是本身有漂移 港科大高飞博士在其最近的路径规划文章中均使用d435i跑vins来提供位置和姿态信息 xff0c 本文记
  • VIN-Fusion config with Realsense D435i

    First shot Copy the launch file in package VINS Fusion to the directory of realsense2 cameara launch cp home william cat
  • QGC二次开发---自定义MAVLink消息

    MAVLink库下载 下载网站https github com mavlink mavlink 可以通过git工具 xff0c 在存放文件夹下打开git工具 xff0c 输入命令 xff1a git clone https github c
  • ros realsense D435i摄像头配置

    ros realsense D435i摄像头配置 之前在ubunut18中配置了ROS环境 xff0c 现在需要在此基础上 xff0c 配置D435i相机的SDK和ROS包 一 参考 https github com IntelRealSe
  • vue-element-admin 二次开发 报错修改

    安装 GitHub git clone https github com PanJiaChen vue element admin git Gitee https gitee com panjiachen vue element admin
  • Ubuntu18.04 Realsense D435i驱动安装与配置

    InterRealSenseD435i SDK安装 一 命令行的安装方式安装 1 注册服务器的公钥 xff1a 打开终端输入 sudo apt key adv keyserver keys gnupg net recv key C8B3A5
  • Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包

    文章目录 目标一 D435i简介二 环境配置三 RealSense的SDK2 0安装四 ROS包安装五 摄像机CV的ROS包节点 六 问题排查 目标 在Ubuntu20 04LTS系统下安装D435i的驱动SDK2和ROS包 xff0c 实
  • realsense d435i 自制Euroc数据集

    参考 提取bag Python程序地址 span class token operator span home span class token operator span yang span class token operator sp
  • A1&AlienGo--通过realsense-viewer调用相机

    使用机器狗时 xff0c 有时需要通过NX 树莓派上的系统来查看调用相机 xff0c 可以通过realsense提供的realsense viewer来查看 但是机器狗自带的视觉程序会开机自启占用相机 xff0c 所以首先需要杀掉这个进程
  • ubuntu18.04安装Realsense D435i 摄像头的驱动SDK和ROS Wrapper

    ubuntu18 04安装Realsense D435i 摄像头的驱动SDK和ROS Wrapper 2022年更新 xff1a 安装教程同 xff1b 进更新安装包下载方式和下载链接 见文末 1 安装Realsense SDK 1 下载s
  • Intel Realsense D435i SDK Install

    Intel Realsense D435i 0 引言1 参考2 Install3 Other 0 引言 自己买的还没到 xff0c 借的同学 xff0c 生怕给他搞坏了 1 参考 ref0 官方giahubref1 官方Installref
  • 使用Realsense测试aruco_ros包

    01 准备工作 安装realsense ros安装aruco ros span class token builtin class name cd span ur ws src span class token function git s
  • 使用Xavier读取RealSense D435i的踩坑经历

    由于项目需要 xff0c 最近开始研究通过Xavier运行VINS的方法 xff0c 使用的传感器是Intel的RealSense xff0c 但是Xavier对RealSense的支持却不怎么好 xff0c 下面介绍一下躲坑方法 xff0
  • ubuntu16.04安装realsense D435i驱动及固件

    安装Realsense SDK xff1a 1 下载source并且确定git版本 xff1a 1 git clone https github com IntelRealSense librealsense xff08 下载源 xff09
  • 关于OpenAI的Gym中的step方法

    文章目录 导读 Gym的step方法 最后的话 导读 本文就只是关于step方法的参数与返回值的一个小小的学习笔记 这也是没有第一时间查官方文档而造成的时间消耗 所以 这篇博客就是逼自己查一下 Gym的step方法 既然都已经用pip下载了
  • DIY个人智能家庭网关—— 路由器篇之安装python

    Python是一种解释型 面向对象 动态数据类型的高级程序设计语言 在openwrt上进行二次开发编写自己的程序 python肯定是最方便最快捷的编程语言 因为它是解释型语言 无需openwrt的编译环境 只要安装好了python就可以直接
  • 基于vspd DLL二次开发的虚拟串口工具

    最近项目需要 早期使用com0com做虚拟串口工具的二次开发 但是发现在系统兼容性上存在很多的问题 后来改用vspd 的免费dll做开发 在稳定性和兼容性上确实提升了很多 功能调用非常简单 可以参照如下的demo 库文件的话自行下载和链接

随机推荐

  • APM学习--Skywalking安装(5.0.0版本)

    Requirements JDK 6 43 xff08 instruments application can run in jdk6 xff09 JDK8 SkyWalking collector and SkyWalking WebUI
  • FreeRTOS消息队列

    FreeRTOS消息队列 队列又称消息队列 xff0c 是一种常用于任务间通信的数据结构 xff0c 队列可以在任务与任务间 中断和任务间传递信息 xff0c 实现了任务接收来自其他任务或中断的不固定长度的消息 xff0c 任务能够从队列里
  • 嵌入式前景怎么样

    现在物联网的发展也把之前大家没有注意过的嵌入式给带动起来了 xff0c 其实想去学习嵌入式的人还真不少 xff0c 不过这其中也会有人担心自己的发展前景 xff0c 下面可以一起先来了解下嵌入式前景怎么样 目前 xff0c 嵌入式开发人才需
  • datax同步数据:数据源:mongo,目标源:hdfs

    一 配置文件mongo hdfs json 34 job 34 34 setting 34 34 speed 34 34 channel 34 2 34 content 34 34 reader 34 34 name 34 34 mongo
  • 做程序媛这几年,感受?体验?

    首先 感受 和男程序员一个样 真不是废话 BUG是修不完的 但是不能放过它 因为你的内心会遭受煎熬 直接进入体验 就不用重复的文字去啰嗦了 直接上图哈 以下的这几种情况 在我的生活中 是真的不断出现 连样式都没变过 first 修电脑AND
  • 天猫精灵与oauth的认证接入流程(AliGenie智能家居接入流程)

    写在前面的叨叨 xff1a 对于天猫精灵的对接网上的教程也是颇少的 xff0c 所以希望我的记录过程也能对他人学习有所帮助 xff0c 要想学一样新的技术必须得找到相关技术文章好好专研了 xff0c 在学习的路上孜孜不倦 xff0c 偶遇难
  • 致敬2016年我的每一次选择。

    2016年 对我来说 是不平凡的 不是因为经历了什么永生难忘的经历也不是因为我做了什么伟大的事情 只是因为毕业了 我毕业了 多么开心却又悲伤的故事 我开心在我终于可以做自己想做的事情 悲伤的是当同学们的父母都陆续为他们铺好以后的路的时候 我
  • 打开计算机的管理需要在控制面板中创建关联

    今天在工作中发现当我选择计算机 管理时提示我需要在控制面板中创建关联 xff0c 如下图所示 xff1a 于是 xff0c 我便上百度搜索了一下 xff0c 答案是这样的 xff1a 修改 span style font family no
  • ftp身份认证时登录框反复弹出以及ftp常用配置

    1 若我们想访问一个人的ftp站点 xff0c 直接通过浏览器直接访问就可以了 xff08 ftp 要访问主机A的IP地址 xff09 如果对方开启了基本身份认证的话 xff0c 我们就需要输入正确的用户名及密码才可正常访问 xff0c 即
  • Linux下挂载U盘、ISO、光盘、rpm

    1 挂载U盘 1 xff09 将U盘连接到虚拟机后 xff0c 使用fdisk l xff08 注意 xff0c 这是list单词的首字母l xff09 命令查看当前U盘的设备符号 2 xff09 创建目录 mnt usb xff0c 以备
  • unity 3D学习日记:创建一个小场景并编写简单C#移动脚本

    学习Unity 3D第一周 xff0c 完成的目标一是创建一个小场景 xff0c 用角色控制器在场景里行走 xff1b 二是编写一个简单的移动脚本 一 创建一个小场景 xff0c 用角色控制器在场景里行走 1 先安装Unity 3D 5 3
  • 基于Unity3D平台的三维虚拟城市研究与应用

    0 引 言 随着现代城市的不断拓展延伸 城市空间多层次 立体模式管理逐渐成为城市规划管理的发展趋势 1 实现城市空间信息管理模式从二维到三维的转变 三维虚拟城市技术 已经成为人们关注和研究的热点 2 三维虚拟系统具有多维信息处理 表达和分析
  • unity:C#控制人在真实环境中行走

    自己在学习unity的课程中遇到了 xff0c 有的地方还没怎么太理解上去 xff0c 先做个笔记 xff0c 顺便看看有没有需要的人 1 搭建一个小场景 xff0c 一个需要控制的 人 xff08 添加CharacterControlle
  • unity 3D:自动寻路

    首先 xff0c 搭建一下场景 xff0c 场景要求 xff1a 有遮挡 xff0c 设置好不可走区域为navigation static 以及 not walkable 在人身上添加Nav Mesh Agent 设置好后勾选显示导航网格
  • 数据结构 ——c++实现(知识点集合)

    数据结构 c 43 43 实现 xff08 知识点集合 xff09 某不知名学狗的复习记录 xff0c 包含数据结构基本概念 xff0c 线性表 xff0c 栈 队列 递归 xff0c 串 数组 广义表和树和森林内容整理 主要整理了知识点
  • Unity3D 使用SceneManager跳转/加载场景

    很久没有更新博客了 xff0c 最近也是还在学习U3D 下面写一下使用SceneManager跳转 加载场景 我们假设要点击一个按钮跳转 xff0c 那么我们只要把跳转的代码写进按钮点击事件里就好了 其实加载场景很简单 xff0c 只需要写
  • [OpenCV] aruco Markers识别 小车巡线

    小车巡线代码 include lt ros ros h gt include lt sensor msgs Image h gt include lt geometry msgs Twist h gt include lt cv bridg
  • 备份ubuntu

    在使用Ubuntu之前 xff0c 相信很多人都有过使用Windows系统的经历 如果你备份过Windows系统 xff0c 那么你一定记忆犹新 xff1a 首先需要找到一个备份工 具 通常都是私有软件 xff0c 然后重启电脑进入备份工具
  • Docker - docker build 命令详解

    docker build 命令原理 docker build 命令从 Dockerfile 和上下文构建镜像构建的上下文 xff1a 位于指定 PATH 或 URL 中的一组文件构建过程可以引用上下文中的任何文件 xff0c 例如 xff0
  • RealSense二次开发

    转载 xff1a librealsense2查看相机设备信息 JavaShuo 文章目录 1 librealsense2设备信息读取 xff12 xff0e realsense 投影函数和反投影函数3 深度相机与彩色相机的坐标变换 1 li