C ++ , 计算机视觉
校准
RealSense
使用RealSense SDK访问摄像头

RealSense SDK提供了用于直接访问摄像头硬件的API。 通过SDK访问摄像机将其锁定,直到释放访问权限为止。 本教程将通过访问摄像机固有校准参数的简单示例,介绍如何使用RealSense SDK进行C ++开发。

回想一下,原始(失真)图像的固有相机矩阵由3×3矩阵给出:

K = [fx 0 cx;
0 fy cy;
0 0 1]

其中,(CX,CY)是主点和(FX,FY)是像素焦距。 该矩阵将摄像机坐标系中的3D点投影到2D像素。
RealSense SDK设置

Librealsense是由SDK 2.0安装的RealSense库(如将Intel Realsense D435与ROS集成中所述 )。 可以在librealsense Wiki旁边找到Doxygen生成的API的详细文档,其中包含许多有用的教程。 安装该库后,可以使用g++ -std=c++11 filename.cpp -lrealsense2使用librealsense编译新的应用程序。
将librealsense2添加到C ++应用程序需要三个简单的步骤:

    在您的C ++文件中包括librealsense2标头: #include <librealsense2/rs.hpp> 。 rs.hpp头文件实际上指向摄像机的其他头文件,例如rs_device.hpp , rs_frame.hpp , rs_processing.hpp和rs_pipeline.hpp 。
    通过将以下行添加到文件,将CMakeLists.txt文件更新为指向librealsense库: target_link_libraries(YourExcecutableName ${catkin_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBS} -lrealsense2) 。 在此示例中,目标链接到catkin,PCL,OpenCV和RealSense库,因为这是基于ROS的项目。
    更新您的编译器标志,以使用librealsense所需的C ++ 11。 可以使用-std = c ++ 11或-std = gnu ++ 11编译器选项启用此支持。 为此,请将以下行添加到CMakeLists.txt文件的顶部: add_compile_options(-std=c++11) 。 

使用C ++ SDK访问相机参数

现在,让我们考虑提取摄像机视频流固有参数的简单示例。 下面使用的代码段扩展了RealSense API How To guide中的示例。

#include <librealsense2 / rs.hpp>
#包括
使用名称空间std;

int main()
{
//获取相机参数
rs2 :: pipeline pipe;
rs2 :: pipeline_profile选择= pipe.start();
自动depth_stream = selection.get_stream(RS2_STREAM_COLOR).as();
自动分辨率= std :: make_pair(depth_stream.width(),depth_stream.height());
自动i = depth_stream.get_intrinsics();
自动principal_point = std :: make_pair(i.ppx,i.ppy);
自动focus_length = std :: make_pair(i.fx,i.fy);
rs2_distortion模型= i.model;
//打印参数
cout <<“ Resolution:” << resolution.first <<“,” << resolution.second << endl;
cout <<“原则点:” << << Principal_point.first <<“,” << << Principal_point.second << endl;
cout <<“ Focal length:” << << focus_length.first <<“,” << << focus_length.second << endl;
返回0;
}

上面程序的输出如下所示:

程序库

需要分辨率是因为应该适当缩放主点(cx,cy)和像素焦距(fx,fy)值。 如果已经在分辨率为320×240的图像上校准了相机,则应针对来自同一相机的640×480图像适当缩放cx,cy,fx,fy值。

selection.get_stream(RS2_STREAM_COLOR).as()包含一个rs2_stream枚举,该枚举指定要选择的摄像机流(RGB,红外,深度等)。 此处,RS2_STREAM_COLOR是本机RGB颜色流,类似地,RS2_STREAM_DEPTH是RealSense摄像机生成的本机深度数据。 枚举选项的完整列表可以在rs2_stream下找到。
在ROS中访问相机参数

RealSense ROS节点集(先前已在将Intel RealSense D435与ROS集成中找到 )方便地在/ camera / color / camera_info ROS主题上发布了摄像机的固有校准参数,该主题发布了sensor_msgs / CameraInfo类型的消息。

可以通过在ROS节点中订阅此主题来直接访问这些消息,或者使用rostopic echo /camera/color/camera_info对其进行简单地检查,可以直接访问这些消息,其输出如下所示。
TerminalCalib

通过ROS主题回显检查相机固有参数

参数K包含相机固有参数,分辨率由宽度,高度给定。
故障排除

一个常见的错误是尝试在仍被其他进程使用的情况下访问摄像机(例如realsense-viewer应用程序,ROS或使用SDK构建的独立应用程序)。 发生这种情况时,显示的错误信息通常是这样的:
抛出’rs2 :: backend_error’实例后调用终止
what():xioctl(VIDIOC_S_FMT)失败上一个错误:设备或资源繁忙
要解决此问题,只需在重新尝试连接相机之前先关闭其使用相机的所有过程。

Troubleshooting

A common mistake is to try to access the camera whilst it is still being used by another process (such as the realsense-viewer application, ROS, or a standalone application built with the SDK). When this happens, the error message shown is usually something like:
terminate called after throwing an instance of ‘rs2::backend_error’
what(): xioctl(VIDIOC_S_FMT) failed Last Error: Device or resource busy
To fix this, simply shutdown any process that his using the camera before attempting to connect to it again.

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐