Qt 处理相机图像实时显示引入队列,防止数据读写冲突导致卡顿、崩溃
在调试QT的TCP服务器和客户端的实时传输时,出现图像延迟显示,改进办法
1.去掉读写硬盘文件.bmp,改用直接读写bmp文件
2.去掉定时器读取图像,改用信号和槽的方式,相机回调函数接收图像完成时,发送读取完成信号,告诉主界面刷新图像,可以初步缓解延时
3.引入两个图像缓冲队列,一个用来写入缓冲图像,一个用来读取缓冲队列,使用queu队列,先进先出
一、queue:队列
队列是一种先进先出的数据结构,是一个模板类。队列和栈是一种数据逻辑概念,即数据能进行的操作。
主要区别是:队列先进先出(First In First Out),栈后进先出。
链表和顺序表是一种数据存放方式,主要区别是:链表有节点,通过指针找到下一个节点,因此在内存中链表数据不需要连续存放;顺序表则是连续存放,通过第一个元素就可以找到其他元素。
二、C++中的队列
#include<queue> queue<int> q; //定义一个int型队列,其他常用基本类型都可以定义 q.empty(); //返回队列是否为空 q.size(); //返回当前队列长度 q.front(); //返回当前队列的第一个元素 q.back(); //返回当前队列的最后一个元素 q.push(); //在队列后面插入一个元素 q.pop(); //从当前队列里移出第一个元素
三、Qt中的队列
#include<QQueue> QQueue<QString> q; //定义一个QString型队列,其他常用基本类型都可以定义 q.isEmpty(); //返回队列是否为空 q.size(); //返回队列元素个数 q.clear(); //清空队列 q.enqueue(); //在队列尾部添加一个元素,比如q.enqueue("string"); q.dequeue(); //删除当前队列第一个元素,并返回这个元素 q.head(); //返回当前队列第一个元素 q.last(); //返回当前队列尾部的元素
三.使用方法
1.建立写入缓冲队列
1 //定义图片缓冲队列 2 QQueue<QPixmap> imageQueqe; 3 //将图像存入缓冲队列 4 imageQueqe.enqueue(QPixmap::fromImage(qIm));//存入缓冲队列
2.建立读取缓冲队列
//定义图片缓冲队列 QQueue<QPixmap> imageQueqe; //提取缓冲队列 if(!cameraio.imageQueqe.empty())//判断缓冲队列是否为空 { imageQueqe.enqueue(cameraio.imageQueqe.dequeue());//先入先出,增加、删除 } emit getPicFinished();//发送提取完成信号
//QT读取BMP格式的内存图像 void CCameraIO::ReadBmpBuffer() { //int imageLen = (m_nImageWidth*3+2)*m_nImageHeight+54; //m_pImageBuffer = (unsigned char*)malloc(imageLen); //QImage img(m_pImageBuffer+54, m_nImageWidth, m_nImageHeight, QImage::Format_RGB888); //QImage img(m_pImageBuffer,m_nImageWidth,m_nImageHeight,QImage::Format_RGB888); //image=QPixmap::fromImage(img); //读取内存图像 QImage qIm = QImage(m_pImageBuffer, m_nImageWidth, m_nImageHeight, QImage::Format_Indexed8); //封装QImage QVector<QRgb> vcolorTable; //生成灰度颜色表 for (int i = 0; i < 256; i++){ vcolorTable.push_back(qRgb(m_pBmpInfo->bmiColors[i].rgbRed, m_pBmpInfo->bmiColors[i].rgbGreen, m_pBmpInfo->bmiColors[i].rgbBlue)); } qIm.setColorTable(vcolorTable); //设置颜色表 //image=QPixmap::fromImage(qIm); imageQueqe.enqueue(QPixmap::fromImage(qIm));//存入缓冲队列 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!