• 使用C++代码保存深度相机D435i的RGB图片,包含C++代码以及CMakeLists.txt


    1.任务

        需要标定深度相机,那么我们就需要拿到深度相机所拍摄的图片,灰度图或者是彩色图。以下提供C++代码,用于提取深度相机所拍摄的图片,每隔2秒保存一次RGB图像。

    编译语言: C++
    编译工具: cmake
    系统版本: ubuntu 18.04
    主要环境: librealsense2, opencv2
    
    • 1
    • 2
    • 3
    • 4

    2. 依赖环境安装

    2.1 C++

        点我安装g++11.2与gdb
        点我安装cmake

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

        2)拉取源码

    mkdir librealsense_install
    cd librealsense_install
    git clone -b v2.50.0 https://github.com/IntelRealSense/librealsense.git
    
    • 1
    • 2
    • 3

        3)安装权限脚本

    cd librealsense
    sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
    sudo udevadm control --reload-rules && udevadm trigger 
    
    • 1
    • 2
    • 3

        4)编译

    mkdir build
    cd build
    cmake ../ -DBUILD_EXAMPLES=true
    make -j
    sudo make install
    
    • 1
    • 2
    • 3
    • 4
    • 5

        5) 使用realsense 注:虚拟机usp设置大于3.0

    realsense-viewer
    
    • 1

        6)卸载realsense

    dpkg -l | grep "realsense" | cut -d " " -f 3 | xargs sudo dpkg --purge
    
    • 1

    2.3 opencv2

        点我进入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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    video.cpp 代码文件

    #include 
    #include 
    #include 
    #include 
    
    // 定义函数将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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    4.成功运行

        保存图片成功的截图
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    【STM32】LED闪烁&LED流水灯&蜂鸣器(江科大)
    gici-open示例数据运行(1.1开阔环境数据运行)
    Sentinel的快速入门,三分钟带你体验流量控制
    阶段七-Day01-Spring01
    Java并发编程学习十一:CAS
    类 ChatGPT 模型存在的局限性
    关联规则之 Apriori 算法实现
    解决Mac上执行pip install -e turtle 报错
    【自然语言处理(NLP)】基于ERNIE-GEN的中文自动文摘
    44 mysql batch insert 的实现
  • 原文地址:https://blog.csdn.net/qq_37700257/article/details/132907616