orbbec_astra.cpp获取和处理来自深度和颜色摄像头流的视觉数据
代码编写了一个多线程的视觉应用程序,其中利用OpenCV库进行视频流处理。主要功能如下:
开启两个视频流,一个用于深度图像,一个用于彩色图像。
设置视频流参数(如分辨率和帧速率)。
并行地在两个线程中分别读取并存储深度和彩色视频流的帧。
将深度帧和彩色帧进行配对,并显示这些帧。
如果用户按下Esc键,程序会终止处理并关闭。
程序中还使用了互斥锁和条件变量来同步两个视频流的帧,确保它们被适时地处理和显示。
这段代码在两个单独的线程中处理深度和彩色视频。然后,它以同步的方式配对深度和彩色帧,并在窗口中显示它们。当用户按下 ESC 键时,程序会停止。
#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;