zoukankan      html  css  js  c++  java
  • Qt 处理相机图像实时显示引入队列,防止数据读写冲突导致卡顿、崩溃

    在调试QT的TCP服务器和客户端的实时传输时,出现图像延迟显示,改进办法
    1.去掉读写硬盘文件.bmp,改用直接读写bmp文件
    2.去掉定时器读取图像,改用信号和槽的方式,相机回调函数接收图像完成时,发送读取完成信号,告诉主界面刷新图像,
    可以初步缓解延时
    3.引入两个图像缓冲队列,一个用来写入缓冲图像,一个用来读取缓冲队列,使用queu队列,先进先出

    一、queue:队列
    队列是一种先进先出的数据结构,是一个模板类。队列和栈是一种数据逻辑概念,即数据能进行的操作。
    主要区别是:队列先进先出(First In First Out),栈后进先出。
    链表和顺序表是一种数据存放方式,主要区别是:链表有节点,通过指针找到下一个节点,因此在内存中链表数据不需要连续存放;顺序表则是连续存放,通过第一个元素就可以找到其他元素。
    二、C++中的队列

    1 #include<queue>
    2 queue<int> q;       //定义一个int型队列,其他常用基本类型都可以定义
    3 q.empty();                    //返回队列是否为空
    4 q.size();                        //返回当前队列长度
    5 q.front();                       //返回当前队列的第一个元素
    6 q.back();                       //返回当前队列的最后一个元素
    7 q.push();                    //在队列后面插入一个元素
    8 q.pop();                         //从当前队列里移出第一个元素

    三、Qt中的队列

    1 #include<QQueue>
    2 QQueue<QString> q;       //定义一个QString型队列,其他常用基本类型都可以定义
    3 q.isEmpty();                      //返回队列是否为空
    4 q.size();                            //返回队列元素个数
    5 q.clear();                           //清空队列
    6 q.enqueue();                     //在队列尾部添加一个元素,比如q.enqueue("string");
    7 q.dequeue();           //删除当前队列第一个元素,并返回这个元素
    8 q.head();                           //返回当前队列第一个元素
    9 q.last();                             //返回当前队列尾部的元素

    三.使用方法

    1.建立写入缓冲队列

    1 //定义图片缓冲队列
    2 QQueue<QPixmap>  imageQueqe;
    3 //将图像存入缓冲队列
    4 imageQueqe.enqueue(QPixmap::fromImage(qIm));//存入缓冲队列

    2.建立读取缓冲队列

    1 //定义图片缓冲队列
    2 QQueue<QPixmap>  imageQueqe;
    3 //提取缓冲队列
    4 if(!cameraio.imageQueqe.empty())//判断缓冲队列是否为空
    5     {
    6         imageQueqe.enqueue(cameraio.imageQueqe.dequeue());//先入先出,增加、删除
    7     }
    8     emit getPicFinished();//发送提取完成信号
     1 //QT读取BMP格式的内存图像
     2 void CCameraIO::ReadBmpBuffer()
     3 {
     4     //int imageLen = (m_nImageWidth*3+2)*m_nImageHeight+54;
     5     //m_pImageBuffer = (unsigned char*)malloc(imageLen);
     6     //QImage img(m_pImageBuffer+54, m_nImageWidth, m_nImageHeight, QImage::Format_RGB888);
     7     //QImage img(m_pImageBuffer,m_nImageWidth,m_nImageHeight,QImage::Format_RGB888);
     8     //image=QPixmap::fromImage(img);
     9 
    10     //读取内存图像
    11     QImage qIm = QImage(m_pImageBuffer, m_nImageWidth, m_nImageHeight, QImage::Format_Indexed8);  //封装QImage
    12     QVector<QRgb> vcolorTable; //生成灰度颜色表
    13     for (int i = 0; i < 256; i++){
    14             vcolorTable.push_back(qRgb(m_pBmpInfo->bmiColors[i].rgbRed, m_pBmpInfo->bmiColors[i].rgbGreen, m_pBmpInfo->bmiColors[i].rgbBlue));
    15         }
    16     qIm.setColorTable(vcolorTable); //设置颜色表
    17 
    18     //image=QPixmap::fromImage(qIm);
    19     imageQueqe.enqueue(QPixmap::fromImage(qIm));//存入缓冲队列
    20 }
  • 相关阅读:
    EF Core1.0 CodeFirst为Modell设置默认值!
    MvcPager分页控件使用注意事项!
    一个关于A标签和分页的怪问题!
    让Visual Studio Code对jQuery支持智能提示!
    MVC中获取所有按钮,并绑定事件!
    EF6.0 Code First使用mysql的各种错误和解决办法!!
    记住 MVC里用formcollection接收form表单传来的值,表单属性必须有name为健!
    Hibernate处理oracle lob总结
    怎样写 OpenStack Neutron 的 Extension (一)
    怎样写 OpenStack Neutron 的 Extension (二)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14576960.html
Copyright © 2011-2022 走看看