OpenCV视频流的C++多线程处理方式

本文介绍了为何需要在处理视频流时使用多线程,主要原因是提高目标检测的实时性。在C++中,通过c++11的thread库实现了函数封装和类封装两种多线程处理方式,详细展示了代码实现,并提及可能遇到的X11库报错和OpenCV显示问题的解决方案。最后,文章提及了在Jetson平台上可能出现的线程同步和显示问题的处理方法。

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

为什么需要多线程处理视频流

在之前有写过一篇文章Python环境下OpenCV视频流的多线程处理方式,上面简单记录了如何使用Python实现对OpenCV视频流的多线程处理。简单来说,在目标检测等任务中,如果视频流的捕获、解码以及检测都在同一个线程中,那么很可能出现目标检测器实时性不高导致的检测时延问题。使用多线程处理,将视频帧的捕获和解码放在一个线程,推理放在一个线程,可以有效缓解时延的问题,使得目标检测的实时性看似有所提升。

C++的多线程处理方式

C++的处理方式与Python大致相同,但却可能遇到一些问题,如使用OpneCV多线程时X11库报错、OpenCV显示卡死等问题,这些问题可能的解决方法会在后面简单提一下。在本文中,使用的多线程是c++11中引入的thread标准库,实现方式则包括函数封装和类封装两种。

函数封装的实现方式

函数封装的实现方式相比类封装要更为简洁,当然可复用性也会降低。简单的示例代码如下:

// video_test.cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

static std::mutex mutex;
static std::atomic_bool isOpen;

static void cameraThreadFunc(int camId, int height, int width, cv::Mat* pFrame)
{
   
    cv::VideoCapture capture(camId);
    capture.set(cv::CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
    capture.set(cv::CAP_PROP_FRAME_WIDTH, width);
    capture.set(cv::CAP_PROP_FRAME_HEIGHT, height);
    capture.set(cv::CAP_PROP_FPS, 30);

    if (!capture.isOpened()) {
   
        isOpen = false;
        std::cout << "Failed to open camera with index " << camId << std::endl;
    }

    cv::Mat frame;
    while (isOpen) {
   
        capture >> frame;
        if (mutex.try_lock()) {
   
            frame.copyTo(*pFrame);
            mutex.unlock();
        }
        cv::waitKey(5);
    }
    capture.release()
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值