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 }

 


免責聲明!

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



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