1. 程式人生 > >QT中用socket接收影象資料(JPEG)後立即解碼顯示

QT中用socket接收影象資料(JPEG)後立即解碼顯示

最近在做一個小程式,功能很簡單,就是從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());

}