QT中用socket接收影象資料(JPEG)後立即解碼顯示
阿新 • • 發佈:2019-01-24
最近在做一個小程式,功能很簡單,就是從socket傳回jpeg格式的資料,然後在本機上顯示出來,當然這個過程並沒有儲存收到的資料後再顯示,而是收到資料後馬上顯示。
這裡採用了OPENCV中的解碼函式:
imdecode();
這個函式的用法比較煩,但也不復雜,如下:
這是一個接收socket訊號的函式(中間還有一個自定義的訊號,這個不是重點)
<pre name="code" class="cpp">void MainWindow::readDate(QByteArray datagram)//這個datagram中從訊號傳過來的引數,這就是一個包的資料,用的是UDP通訊 { QString str; std::string image; static int udp_cnt = 0;//包記數 static int udp_all = 0; image.assign(datagram.data()+10, datagram.data()+datagram.size()); if (0 == datagram.at(1)) { udp_all = datagram.at(0); udp_cnt = 0; imageBuf.clear(); } if (udp_all == datagram.at(0) && udp_cnt == datagram.at(1))//同一包 { str.sprintf("%d %d",udp_all, udp_cnt); imageBuf = imageBuf + image; ++udp_cnt; if (udp_cnt >= udp_all)//組裝完成 { std::vector<char> vecImage(imageBuf.begin(), imageBuf.end()); srcImg = imdecode(Mat(vecImage), CV_LOAD_IMAGE_COLOR);//這個函式要一個vector的引數,所以上面把整個影象資料組合後放到vector中,由函式解碼 cvtColor(srcImg, srcImg, CV_BGR2RGB); //,解碼完後,直接顯示!!OPENCV是BGR格式的,QT是RGB,所以轉換一下 imshow("adf",srcImg); waitKey(33); this->update(); } //組包 } // printf("\ndata0:%d\n",datagram.at(0)); // printf("data1:%d\n",datagram.at(1)); // printf("data.size:%d",datagram.size()); }