【opencv】教程代码 —videoio(1)使用Orbbec Astra 3D摄像头获取和处理深度和颜色摄像头流的视觉数据...

本文介绍了一个使用OpenCV在C++中处理Astra摄像头双流数据的应用,涉及多线程、同步机制和帧配对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

24e817165c09c430b46fadd1ffc817b1.png

orbbec_astra.cpp获取和处理来自深度和颜色摄像头流的视觉数据

代码编写了一个多线程的视觉应用程序,其中利用OpenCV库进行视频流处理。主要功能如下:

  • 开启两个视频流,一个用于深度图像,一个用于彩色图像。

  • 设置视频流参数(如分辨率和帧速率)。

  • 并行地在两个线程中分别读取并存储深度和彩色视频流的帧。

  • 将深度帧和彩色帧进行配对,并显示这些帧。

  • 如果用户按下Esc键,程序会终止处理并关闭。

程序中还使用了互斥锁和条件变量来同步两个视频流的帧,确保它们被适时地处理和显示。

这段代码在两个单独的线程中处理深度和彩色视频。然后,它以同步的方式配对深度和彩色帧,并在窗口中显示它们。当用户按下 ESC 键时,程序会停止。

82520e20c16362277e5bf7f5097f60c8.png

#include <opencv2/videoio/videoio.hpp> // 包含OpenCV视频输入输出头文件
#include <opencv2/highgui.hpp>         // 包含OpenCV的GUI(图形用户界面)头文件
#include <opencv2/imgproc.hpp>         // 包含OpenCV图像处理头文件


#include <list>                        // 包含C++标准库列表容器头文件
#include <iostream>                    // 包含输入输出流头文件


// 检查是否定义了多线程支持
#if !defined(HAVE_THREADS)
int main()
{
    std::cout << "This sample is built without threading support. Sample code is disabled." << std::endl; // 如果没有开启多线程支持,则输出信息
    return 0;
}
#else




#include <thread>                      // 包含C++11标准线程头文件
#include <mutex>                       // 包含互斥锁头文件
#include <condition_variable>          // 包含条件变量头文件
#include <atomic>                      // 包含原子操作头文件


using namespace cv;                    // 使用命名空间cv,用于OpenCV相关功能
using std::cout;                       // 使用标准输出流cout
using std::cerr;                       // 使用标准错误流cerr
using std::endl;                       // 使用换行符endl




// 存储帧及其时间戳的结构体
struct Frame
{
    int64 timestamp;                   // 时间戳
    Mat frame;                         // 帧数据
};


int main()
{
    //! [Open streams]
    // 打开深度摄像头流
    VideoCapture depthStream(CAP_OPENNI2_ASTRA);
    // 打开彩色摄像头流
    VideoCapture colorStream(0, CAP_V4L2);
    //! [Open streams]


    // 检查彩色流是否已打开
    if (!colorStream.isOpened())
    {
        cerr << "ERROR: Unable to open color stream" << endl;
        return 1;
    }


    // 检查深度流是否已打开
    if (!depthStream.isOpened())
    {
        cerr << "ERROR: Unable to open depth stream" << endl;
        return 1;
    }


    //! [Setup streams]
    // 设置彩色和深度流参数
    colorStream.set(CAP_PROP_FRAME_WIDTH,  640);
    colorStream.set(CAP_PROP_FRAME_HEIGHT, 480);
    depthStream.set(CAP_PROP_FRAME_WIDTH,  640);
    depthStream.set(CAP_PROP_FRAME_HEIGHT, 480);
    depthStream.set(CAP_PROP_OPENNI2_MIRROR, 0);
    //! [Setup streams]


    // 打印彩色流参数
    cout << "Color stream: "
         << colorStream.get(CAP_PROP_FRAME_WIDTH) << "x" << colorStream.get(CAP_PROP_FRAME_HEIGHT)
         << " @" << colorStream.get(CAP_PROP_FPS) << " fps" << endl;


    //! [Get properties]
    // 打印深度流参数
    cout << "Depth stream: "
         << depthStream.get(CAP_PROP_FRAME_WIDTH) << "x" << depthStream.get(CAP_PROP_FRAME_HEIGHT)
         << " @" << depthStream.get(CAP_PROP_FPS) << " fps" << endl;
    //! [Get properties]


    //! [Read streams]
    // 创建两个列表存储帧数据
    std::list<Frame> depthFrames, colorFrames;
    const std::size_t maxFrames = 64; 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值