当前位置: 首页 > article >正文

OpenCV多线程编程:从单线程到双线程的视频处理

前言多年前刚刚接触Opencv还没有AI那个时候第一次处理视频的时候仅仅通过usb摄像头显示都还可以但是通过rtsp等网络方式的方法接入在显示图像的过程再处理点什么那简直是卡通过网上搜索建议使用多线程处理然后一堆代码终于从里面理清了最近也有同事遇到同样的问题我说让看代码他说里面掺杂了太多业务不太好看明白所以才有了这篇文章从最简单的方法实现多线程处理视频流不参与任何业务。一个负责获取视频帧一个负责处理使用最简单的实践达到目的。同理的思想用于在一个系统之上我开发了一个QT快速开发系统也是使用最简单不掺杂任何业务的实现避免其他人为了吃顿饭还要买个锅碗瓢盆QT快速开发框架一、最简单的摄像头显示程序让我们从最基础的版本开始一个单线程程序直接从摄像头读取并显示画面。基础版本代码#includeiostream#includeopencv2/opencv.hppusingnamespacestd;intmain(){// 打开摄像头默认摄像头编号0cv::VideoCapturecap(0);if(!cap.isOpened()){cerrError: Could not open camera!endl;return-1;}cv::Mat frame;while(true){capframe;// 读取一帧if(frame.empty()){cerrError: Empty frame!endl;break;}cv::imshow(Camera,frame);// 显示画面charkeycv::waitKey(1);if(keyq||keyQ){break;// 按q键退出}}cap.release();cv::destroyAllWindows();return0;}基础版本的特点优点简单直接易于理解缺点所有操作都在一个线程中执行如果添加复杂的图像处理会导致画面卡顿二、尝试使用线程初学者可能会尝试将摄像头读取放入单独的线程#includeiostream#includeopencv2/opencv.hpp#includethreadusingnamespacestd;voidcaptureThread(){cv::VideoCapturecap(0);if(!cap.isOpened()){std::cerrError: Could not open camera!std::endl;return;}cv::Mat frame;while(true){capframe;if(frame.empty())break;cv::imshow(Camera,frame);// 错误在子线程中显示charkeycv::waitKey(1);if(keyq||keyQ)break;}cap.release();cv::destroyAllWindows();}intmain(){threadcaptureVideo(captureThread);captureVideo.join();return0;}三、再进一步使用双线程实现#includeiostream#includeopencv2/opencv.hpp#includethread#includemutex#includeatomicusingnamespacestd;// 共享数据cv::Mat sharedFrame;mutex mtx;atomicboolrunning(true);// 线程1负责捕获视频帧voidcaptureThread(){cv::VideoCapturecap(0);if(!cap.isOpened()){cerrError: Could not open camera!endl;runningfalse;return;}cv::Mat frame;while(running){capframe;if(frame.empty()){cerrError: Empty frame!endl;break;}// 使用互斥锁保护共享数据lock_guardmutexlock(mtx);frame.copyTo(sharedFrame);}cap.release();}// 线程2负责处理和显示voiddisplayAndProcessThread(){cv::namedWindow(Camera,cv::WINDOW_AUTOSIZE);while(running){cv::Mat frame;// 获取最新的帧{lock_guardmutexlock(mtx);if(!sharedFrame.empty()){sharedFrame.copyTo(frame);}}if(!frame.empty()){// 在这里添加你的图像处理代码 // 示例1添加文字string textHello OpenCV!;cv::putText(frame,text,cv::Point(50,50),cv::FONT_HERSHEY_SIMPLEX,1.0,cv::Scalar(0,255,0),2);// 示例2添加时间戳信息cv::putText(frame,Press q to quit,cv::Point(10,frame.rows-10),cv::FONT_HERSHEY_SIMPLEX,0.5,cv::Scalar(0,0,255),1);// 显示处理后的画面cv::imshow(Camera,frame);}// 检查退出条件charkeycv::waitKey(30);if(keyq||keyQ){runningfalse;break;}}cv::destroyAllWindows();}intmain(){coutProgram started. Press q to quit.endl;// 创建两个线程threadcapture(captureThread);threaddisplay(displayAndProcessThread);// 等待线程结束display.join();capture.join();coutProgram terminated.endl;return0;}四、代码解析1. 线程同步机制mutex mtx;// 互斥锁防止数据竞争atomicboolrunning;// 原子变量控制线程结束互斥锁确保同一时刻只有一个线程访问共享数据原子变量安全地在多线程间传递状态信息2. 线程分工线程职责说明captureThread捕获视频帧持续从摄像头读取存入共享变量displayAndProcessThread处理和显示获取帧添加特效显示画面3. 关键代码说明// 保护共享数据的访问{lock_guardmutexlock(mtx);// 自动加锁解锁frame.copyTo(sharedFrame);// 安全的拷贝}五、进阶添加更多图像处理效果你可以在显示线程中添加各种OpenCV特效// 在显示线程的处理部分添加// 1. 转为灰度图cv::Mat gray;cv::cvtColor(frame,gray,cv::COLOR_BGR2GRAY);// 2. 边缘检测cv::Mat edges;cv::Canny(gray,edges,50,150);// 3. 人脸检测需要haar cascade文件// cv::CascadeClassifier faceCascade;// faceCascade.load(haarcascade_frontalface_default.xml);// vectorcv::Rect faces;// faceCascade.detectMultiScale(gray, faces);// 4. 添加帧率显示staticintframeCount0;staticautostartTimechrono::steady_clock::now();frameCount;autocurrentTimechrono::steady_clock::now();autoelapsedchrono::duration_castchrono::seconds(currentTime-startTime).count();if(elapsed1){doublefpsframeCount/elapsed;coutFPS: fpsendl;frameCount0;startTimecurrentTime;}六、总结单线程 vs 双线程对比特性单线程双线程实现复杂度简单中等响应性好极好处理复杂任务会卡顿流畅CPU利用率一般更好代码可维护性简单良好多线程编程要点正确使用互斥锁保护共享数据避免死锁注意加锁顺序使用原子变量控制线程状态确保主线程等待子线程结束OpenCV的显示操作必须在主线程需要一份无污染的代码不包含任何业务QT快速开发框架

相关文章:

OpenCV多线程编程:从单线程到双线程的视频处理

前言 多年前刚刚接触Opencv,还没有AI,那个时候第一次处理视频的时候,仅仅通过usb摄像头显示都还可以,但是通过rtsp等网络方式的方法接入,在显示图像的过程再处理点什么,那简直是卡, 通过网上搜…...

Janus-Pro-7B开源大模型价值:学术研究可复现+企业定制可扩展架构

Janus-Pro-7B开源大模型价值:学术研究可复现企业定制可扩展架构 1. 模型概述与核心价值 Janus-Pro-7B是DeepSeek推出的开源统一多模态大模型,它在技术架构和应用价值上都具有显著突破。这个7B参数的模型不仅解决了传统多模态模型中理解与生成任务冲突的…...

AI小程序定制开发:河南企业如何选择靠谱的技术服务商?

在数字化转型浪潮席卷各行各业的今天,AI小程序以其轻量化、智能化、场景化的特点,成为众多河南企业连接用户、提升效率、创新业务模式的重要载体。无论是零售、教育、政务,还是制造、文旅、医疗,一个深度贴合业务逻辑、稳定可靠且…...

AI4S重塑药物研发:药物研发中的AI应用,外包还是自主掌握?

近年来,人工智能(AI)在药物研发领域的应用日益凸显,通过预测药物的功效和毒性、自动设计药物分子、加速临床试验等方式,大大提升了药物研发的效率。面临AI技术的冲击和机遇,药物研发公司通常会采取自主开发…...

金仓数据库在文档型数据迁移中的技术观察:基于MongoDB协议兼容与安全治理的政务金融实践

金仓数据库在文档型数据迁移中的技术观察:基于MongoDB协议兼容与安全治理的政务金融实践 当电子证照系统每秒需响应千次亮证请求,当银行风控平台须实时校验百万级JSON格式交易凭证——传统文档数据库在扩展性、安全机制与生态适配方面的局限&#xff0c…...

ms-swift保姆级教程:从安装到微调,小白也能轻松上手

ms-swift保姆级教程:从安装到微调,小白也能轻松上手 1. 前言:为什么选择ms-swift? 如果你正在寻找一个简单易用的大模型微调框架,ms-swift可能是目前最好的选择之一。这个由魔搭社区推出的开源工具,让大模…...

Sentinel学习

微服务保护的方案有很多,比如:请求限流线程隔离服务熔断这些方案或多或少都会导致服务的体验上略有下降,比如请求限流,降低了并发上限;线程隔离,降低了可用资源数量;服务熔断,降低了…...

Step3-VL-10B-Base模型量化部署:TVBox边缘设备集成

Step3-VL-10B-Base模型量化部署:TVBox边缘设备集成 让大模型在电视盒子上跑起来,为智能家居带来真正的视觉理解能力 1. 为什么要在TVBox上部署视觉大模型 家里有个闲置的电视盒子?别让它吃灰了。现在我们可以把最新的多模态大模型部署上去&a…...

Qwen3-32B-Chat效果展示:RTX4090D上中英双语交替对话与术语一致性保持能力

Qwen3-32B-Chat效果展示:RTX4090D上中英双语交替对话与术语一致性保持能力 1. 开箱即用的高性能部署方案 Qwen3-32B-Chat私有部署镜像专为RTX 4090D 24GB显存环境深度优化,基于CUDA 12.4和驱动550.90.07构建。这个镜像最吸引人的特点是开箱即用——内置…...

C裸机代码可信性革命(NASA/ISO 26262 ASIL-D级验证实录):从手动测试到数学证明的范式跃迁

第一章:C裸机代码可信性革命的范式跃迁传统嵌入式系统开发长期依赖“调试即验证”的经验主义路径:寄存器直写、中断裸调、无内存保护的无限信任模型。当安全关键场景(如航天飞控、医疗设备固件)要求代码行为在任意输入、任意时序下…...

springboot基于vue的野生动物生物保护网站f2584z30

目录技术栈选择功能模块划分开发流程部署方案扩展性设计项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 后端采用Spring Boot框架,提供RESTful API接口,集成MyBatis…...

SQL注入零基础学习02

一、union注入实操 缺点:UNION 可能会被系统限制使用和数据报警,可以回溯。不太安全 操作流程: 1、判断注入点 2、使用 order by查询回显列数,进行填补自己需要信息 3、判断回显位置 4、获取数据库名字 5、获取数据库所有表…...

Mathtype公式也能变艺术:Realistic Vision V5.1生成科技美学海报

Mathtype公式也能变艺术:Realistic Vision V5.1生成科技美学海报 你有没有想过,那些看起来冷冰冰、充满符号的数学公式和物理方程,也能成为一幅幅令人惊叹的艺术作品的核心?过去,学术海报的设计往往在专业性和视觉吸引…...

c++20之jthread使用

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow),...

lvgl_v8之消息提示框空间使用

static void msg_event_cb(lv_event_t* e) {lv_obj_t* obj = lv_event_get_current_target(e);...

Qwen3-VL-8B-Instruct-GGUF与VSCode的智能编程助手集成

Qwen3-VL-8B-Instruct-GGUF与VSCode的智能编程助手集成 1. 为什么要在VSCode中集成Qwen3-VL-8B-Instruct-GGUF 你是否经常在写代码时卡在某个函数的用法上,反复翻文档却找不到关键示例?或者调试时面对一堆报错信息,花半小时才定位到那个少写…...

Phi-3-Mini-128K实战:算法学习助手——动态规划与贪心算法解析

Phi-3-Mini-128K实战:算法学习助手——动态规划与贪心算法解析 最近在琢磨算法,尤其是动态规划和贪心算法,总觉得它们像一对性格迥异的兄弟,一个深思熟虑,一个当机立断。自己看书、看视频,有时候还是卡在“…...

电子工程师必看:从零开始设计你的第一个低通滤波电路(附Multisim仿真文件)

电子工程师必看:从零开始设计你的第一个低通滤波电路(附Multisim仿真文件) 在电子工程领域,滤波电路就像一位精密的"信号守门人",它能决定哪些频率的信号可以通过,哪些需要被阻挡。对于初学者来说…...

Datawhale openclaw 课程 task1:clawX本地openclaw使用指南

Datawhale openclaw 课程 task1:clawX本地openclaw使用指南openrouter 获取大模型服务clawX 安装配置模型测试参考此博客为Datawhale 组队学习打卡笔记openrouter 获取大模型服务 openrouter 官网 创建apikey 把密钥存好 点击models然后输入free,可…...

如何快速释放C盘空间:Windows Cleaner终极清理指南

如何快速释放C盘空间:Windows Cleaner终极清理指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是不是也经常遇到C盘爆红的烦恼?Wind…...

用XGO Rider教孩子学编程:一个AI教育机器人的实战教学指南

用XGO Rider教孩子学编程:一个AI教育机器人的实战教学指南 当孩子们第一次看到XGO Rider在桌面上灵活旋转、用机械臂递来一块积木时,教室里爆发的惊叹声总是让我想起自己初学编程时点亮第一个LED灯的瞬间。这款双轮足机器人正在重新定义STEAM教育——它不…...

智能家居语音控制避坑指南:小米/天猫精灵实际体验对比(含声纹测试)

智能家居语音控制实战评测:小米与天猫精灵的声纹识别与场景适配深度解析 当清晨的第一缕阳光透过窗帘,你躺在床上轻声说"打开卧室灯",智能家居系统却毫无反应——这种尴尬体验暴露了语音交互在真实场景中的技术瓶颈。作为智能家居的…...

研究生必看!千笔AI,多场景适配降重神器

在AI技术迅猛发展的今天,越来越多的学生和研究人员开始借助AI工具提升写作效率,但随之而来的“AI率超标”问题也日益凸显。随着各大查重系统对AI生成内容的识别能力不断提升,论文中若存在明显的AI痕迹,不仅可能导致重复率过高&…...

马斯克预言AI将超人类智力!2026年转行AI,大模型训练师成高薪新风口!

当下,人工智能的发展速度已超出许多人的预期,而马斯克关于AI智力发展的预测,更让人们清晰感受到这场技术革命的逼近。 在2025年9月9日举行的All-In峰会上重申了他的AI智力预测:2026年人工智能的智力将超越单个人类,到2…...

突破提取码壁垒:baidupankey的资源获取效率革命

突破提取码壁垒:baidupankey的资源获取效率革命 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字资源共享的时代,百度网盘的提取码机制如同一把双刃剑——既保护了资源安全,又成为阻碍…...

ArcGIS Pro模型构建器实战:从零开始搭建选址分析模型

1. 认识ArcGIS Pro模型构建器 第一次打开ArcGIS Pro的模型构建器时,我承认被它的界面惊艳到了。相比老版本的ArcMap,现在的模型构建器采用了半透明效果和现代化的UI设计,操作起来就像在玩一个高级版的"积木游戏"。不过别被它的颜值…...

Git误操作急救手册:30秒拯救你的代码

Git误操作急救手册大纲常见误操作场景误删本地未提交的更改误提交到错误分支误强制推送覆盖远程分支误执行git reset --hard导致代码丢失误合并或变基冲突处理不当数据恢复方法通过git reflog查找丢失的提交记录使用git fsck找回悬空对象(dangling commits&#xff…...

探索OpenCvSharp:用C#和Winform构建图像处理世界

OpencvSharp资料,采用C#加Winform编写,包含接近50个Demo,直接运行即可。 例程包含:模板匹配、边缘识别、人脸识别,灰度变化、标定等。 最近在图像处理领域折腾,发现了一个超棒的资源——基于OpenCvSharp,用…...

C# OPC UA客户端实例源码 - EF6+SQLite集成版,全注解及结构思维图学习资料

C# opc ua客户端实例源码,带ef6sqlite。 代码有完整的注解,及包括所有的链接库和程序结构思维图。 纯学习资料OPC UA 客户端节点管理系统功能全览一、产品定位OPC UA 客户端节点管理系统是一款基于 .NET Framework 4.6 的 Windows 桌面应用,旨…...

如何突破量化投资数据瓶颈?MOOTDX工具的底层技术与实战应用

如何突破量化投资数据瓶颈?MOOTDX工具的底层技术与实战应用 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 量化投资领域正面临着数据获取与处理的双重挑战:市场数据接口复…...