realsense d435i 在Ubuntu上标定的详细步骤以及内参的修正方法

时间: 2024-05-01 14:17:18 浏览: 12
Realsense D435i是一款深度相机,可以用于3D扫描、SLAM等应用。在使用前需要对相机进行标定,以获取相机的内参矩阵和畸变矩阵等参数,以便进行后续的图像处理和计算。 以下是在Ubuntu上对Realsense D435i进行标定的详细步骤: 1. 安装Realsense SDK 在Ubuntu上安装Realsense SDK,可以参考官方文档:https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md 2. 安装ROS 如果需要在ROS中使用Realsense D435i,需要先安装ROS。可以参考官方网站:http://wiki.ros.org/kinetic/Installation/Ubuntu 3. 安装相机驱动 在终端中输入以下命令安装相机驱动: ```bash sudo apt-get install ros-kinetic-realsense2-camera ``` 4. 运行标定程序 在终端中输入以下命令运行标定程序: ```bash roslaunch realsense2_camera rs_camera.launch enable_pointcloud:=false align_depth:=true ``` 此时会打开相机的RGB和深度图像窗口,并开始采集图像数据。可以使用鼠标点击RGB图像窗口中的某个点,将该点的像素坐标保存到文件中。 ```bash rosrun image_view image_view image:=/camera/color/image_raw ``` 5. 编写标定程序 在终端中输入以下命令创建一个ROS包: ```bash catkin_create_pkg calibrate_camera roscpp cv_bridge image_transport ``` 然后在src目录下创建一个calibrate_camera.cpp文件,编写标定程序。程序的主要步骤如下: 1. 读取RGB和深度图像数据。 2. 根据RGB图像中的某个点的像素坐标,计算出该点在深度图像中的像素坐标和深度值。 3. 根据相机的内参矩阵、畸变矩阵和深度值,计算出该点的真实世界坐标。 4. 将多个真实世界坐标点和其对应的像素坐标保存到文件中。 5. 使用OpenCV的calibrateCamera函数对相机进行标定,得到相机的内参矩阵和畸变矩阵等参数。 以下是一个简单的标定程序示例: ```cpp #include <ros/ros.h> #include <cv_bridge/cv_bridge.h> #include <image_transport/image_transport.h> #include <opencv2/calib3d/calib3d.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; const Size boardSize(9, 6); // 棋盘格大小 const float squareSize = 0.0245; // 棋盘格边长(单位:米) int main(int argc, char **argv) { ros::init(argc, argv, "calibrate_camera"); ros::NodeHandle nh; // 创建图像订阅者 image_transport::ImageTransport it(nh); image_transport::Subscriber subRgb = it.subscribe("/camera/color/image_raw", 1); image_transport::Subscriber subDepth = it.subscribe("/camera/aligned_depth_to_color/image_raw", 1); // 读取图像数据 Mat imgRgb, imgDepth; ros::Rate loopRate(30); while (ros::ok()) { if (subRgb.getNumPublishers() > 0 && subDepth.getNumPublishers() > 0) { imgRgb = cv_bridge::toCvCopy(subRgb, sensor_msgs::image_encodings::BGR8)->image; imgDepth = cv_bridge::toCvCopy(subDepth, sensor_msgs::image_encodings::TYPE_16UC1)->image; break; } ros::spinOnce(); loopRate.sleep(); } // 获取棋盘格角点的像素坐标和真实世界坐标 vector<Point2f> corners; vector<Point3f> objPoints; bool found = findChessboardCorners(imgRgb, boardSize, corners); if (found) { cvtColor(imgRgb, imgRgb, COLOR_BGR2GRAY); cornerSubPix(imgRgb, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1)); drawChessboardCorners(imgRgb, boardSize, corners, found); imshow("Chessboard", imgRgb); waitKey(0); for (int i = 0; i < boardSize.height; i++) { for (int j = 0; j < boardSize.width; j++) { objPoints.push_back(Point3f(j * squareSize, i * squareSize, 0)); } } } else { ROS_ERROR("Chessboard not found!"); return 0; } // 计算相机的内参矩阵和畸变矩阵 vector<vector<Point3f>> objPointsList; vector<vector<Point2f>> imgPointsList; objPointsList.push_back(objPoints); imgPointsList.push_back(corners); Mat cameraMatrix, distCoeffs; vector<Mat> rvecs, tvecs; calibrateCamera(objPointsList, imgPointsList, imgRgb.size(), cameraMatrix, distCoeffs, rvecs, tvecs); // 打印相机的内参矩阵和畸变矩阵 cout << "Camera matrix:" << endl << cameraMatrix << endl; cout << "Distortion coefficients:" << endl << distCoeffs << endl; return 0; } ``` 6. 修正相机内参 有时候在实际使用中,由于相机的硬件或者环境等因素,可能会导致相机的内参矩阵和畸变矩阵与标定时得到的数值有所偏差,这时候就需要对相机的内参矩阵进行修正。 可以使用OpenCV的undistort函数对图像进行去畸变处理,然后观察去畸变后的图像是否更加清晰,如果是,则说明相机的内参矩阵需要进行修正。 以下是一个简单的相机内参修正示例: ```cpp #include <ros/ros.h> #include <cv_bridge/cv_bridge.h> #include <image_transport/image_transport.h> #include <opencv2/calib3d/calib3d.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; int main(int argc, char **argv) { ros::init(argc, argv, "undistort_camera"); ros::NodeHandle nh; // 创建图像订阅者 image_transport::ImageTransport it(nh); image_transport::Subscriber subRgb = it.subscribe("/camera/color/image_raw", 1); // 读取相机的内参矩阵和畸变矩阵 Mat cameraMatrix = (Mat_<double>(3, 3) << 617.0982666015625, 0, 325.7581787109375, 0, 617.1774291992188, 248.06704711914062, 0, 0, 1); Mat distCoeffs = (Mat_<double>(1, 5) << -0.02965781861579418, 0.02609023815369606, -0.00583636328125, -0.0016021245323410034, -0.0077972412109375); // 读取图像数据 Mat imgRgb, imgUndistorted; ros::Rate loopRate(30); while (ros::ok()) { if (subRgb.getNumPublishers() > 0) { imgRgb = cv_bridge::toCvCopy(subRgb, sensor_msgs::image_encodings::BGR8)->image; break; } ros::spinOnce(); loopRate.sleep(); } // 对图像进行去畸变处理 undistort(imgRgb, imgUndistorted, cameraMatrix, distCoeffs); // 显示去畸变后的图像 imshow("Undistorted", imgUndistorted); waitKey(0); return 0; } ``` 以上就是在Ubuntu上对Realsense D435i进行标定的详细步骤以及内参的修正方法。通过标定,可以获取相机的内参矩阵和畸变矩阵等参数,以便进行后续的图像处理和计算。如果发现相机的内参矩阵和畸变矩阵有所偏差,可以使用undistort函数对图像进行去畸变处理,并观察去畸变后的图像是否更加清晰,以判断是否需要对相机的内参矩阵进行修正。

相关推荐

最新推荐

recommend-type

Ubuntu 机械臂(睿尔曼)与摄像头(奥比中光、RealSense)标定教程(眼在手上)

Ubuntu系统下机械臂(睿尔曼)与摄像头(奥比中光、RealSense)标定教程(眼在手上) ROS系统搭建 系统:Ubuntu 18.04 ROS:melodic OpenCV 库:OpenCV 3.2.0 Realsense D435: Marker 标记识别:Aruco 功能包 手眼...
recommend-type

Ubuntu 安装 vsftpd FTP详细步骤

主要介绍了 Ubuntu 安装 vsftpd FTP详细步骤的相关资料,需要的朋友可以参考下
recommend-type

ubuntu 20.04上搭建LNMP环境的方法步骤

主要介绍了ubuntu 20.04上搭建LNMP环境的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

ubuntu20.04 LTS安装docker的方法步骤

主要介绍了ubuntu20.04 LTS安装docker的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

在Ubuntu20.04中安装ROS Noetic的方法

主要介绍了在Ubuntu20.04中安装ROS Noetic的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

解释这行代码 c = ((double)rand() / RAND_MAX) * (a + b - fabs(a - b)) + fabs(a - b);

这行代码是用于生成 a 和 b 之间的随机数。首先,它使用 rand() 函数生成一个 [0,1) 之间的随机小数,然后将这个小数乘以 a、b 范围内的差值,再加上 a 和 b 中的较小值。这可以确保生成的随机数大于等于 a,小于等于 b,而且不会因为 a 和 b 之间的差距过大而导致难以生成足够多的随机数。最后,使用 fabs() 函数来确保计算结果是正数。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。