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));//存入緩沖隊列
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM