1.任务
需要标定深度相机,那么我们就需要拿到深度相机所拍摄的图片,灰度图或者是彩色图。以下提供C++代码,用于提取深度相机所拍摄的图片,每隔2秒保存一次RGB图像。
编译语言: C++
编译工具: cmake
系统版本: ubuntu 18.04
主要环境: librealsense2, opencv2
2. 依赖环境安装
2.1 C++
2.2 librealsense2
1)安装依赖包
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install libudev-dev pkg-config libgtk-3-dev
sudo apt-get install libusb-1.0-0-dev pkg-config
sudo apt-get install libglfw3-dev
sudo apt-get install libssl-dev
2)拉取源码
mkdir librealsense_install
cd librealsense_install
git clone -b v2.50.0 https://github.com/IntelRealSense/librealsense.git
3)安装权限脚本
cd librealsense
sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && udevadm trigger
4)编译
mkdir build
cd build
cmake ../ -DBUILD_EXAMPLES=true
make -j
sudo make install
5) 使用realsense 注:虚拟机usp设置大于3.0
realsense-viewer
6)卸载realsense
dpkg -l | grep "realsense" | cut -d " " -f 3 | xargs sudo dpkg --purge
2.3 opencv2
3.代码
CMakeLists.txt
文件
cmake_minimum_required(VERSION 3.12)
project(video)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS "-std=c++17")
# 查找OpenCV包
find_package(OpenCV REQUIRED)
# 寻找Intel RealSense SDK包
find_package(realsense2 REQUIRED)
find_package(Threads REQUIRED)
# 添加可执行文件
add_executable(video video.cpp)
target_compile_features(video PRIVATE cxx_std_17)
# 链接OpenCV库
target_link_libraries(video ${OpenCV_LIBS})
target_link_libraries(video realsense2)
target_link_libraries(video Threads::Threads)
target_link_libraries(video -lstdc++fs)
video.cpp
代码文件
#include <librealsense2/rs.hpp>
#include <opencv2/opencv.hpp>
#include <chrono>
#include <thread>
// 定义函数将RS2帧转换为OpenCV Mat
cv::Mat frame_to_mat(const rs2::frame& frame) {
rs2::video_frame video_frame = frame.as<rs2::video_frame>();
const int width = video_frame.get_width();
const int height = video_frame.get_height();
const int bpp = video_frame.get_bytes_per_pixel();
return cv::Mat(cv::Size(width, height), CV_8UC(bpp), (void*)video_frame.get_data(), cv::Mat::AUTO_STEP);
}
int main() {
rs2::pipeline pipe;
rs2::config cfg;
cfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8, 30);
// cfg.enable_stream(RS2_STREAM_COLOR);
// cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);
// 启动管道
pipe.start(cfg);
int count = 0;
while (true) {
// 等待深度相机捕捉到帧
rs2::frameset frameset = pipe.wait_for_frames();
auto color_frame = frameset.get_color_frame();
// auto depth_frame = frameset.get_depth_frame();
// 将RS2帧转换为OpenCV Mat
cv::Mat color_mat = frame_to_mat(color_frame);
// cv::Mat depth_mat = frame_to_mat(depth_frame); // 添加深度图像处理
std::cout << "Color image channels: " << color_mat.channels() << std::endl;
// std::cout << "Depth image channels: " << depth_mat.channels() << std::endl;
// 保存RGB图像和深度图像
std::string color_filename = "color_image" + std::to_string(count) + ".png";
// std::string depth_filename = "depth_image" + std::to_string(count) + ".png"; // 深度图像文件名
cv::imwrite(color_filename, color_mat);
// cv::imwrite(depth_filename, depth_mat); // 保存深度图像
// std::cout << "Saved " << color_filename << " and " << depth_filename << std::endl;
std::cout << "Saved " << color_filename << std::endl;
// 每隔2秒保存一次图片
std::this_thread::sleep_for(std::chrono::seconds(2));
count++;
}
pipe.stop();
return 0;
}
4.成功运行
保存图片成功的截图