QTではsocketで画像データ(JPEG)を受信すると直ちに復号表示
最近、小さなプログラムを作っていますが、機能は簡単です.socketからjpeg形式のデータを返して、本機に表示します.もちろん、このプロセスは受信したデータを保存してから表示するのではなく、データを受け取ってすぐに表示します.
ここでは、OPENCVの復号関数を使用します.
imdecode();
この関数の使い方は煩わしいが、複雑ではない.以下のように.
これはsocket信号を受信する関数です(真ん中にカスタム信号がありますが、これはポイントではありません)
ここでは、OPENCVの復号関数を使用します.
imdecode();
この関数の使い方は煩わしいが、複雑ではない.以下のように.
これはsocket信号を受信する関数です(真ん中にカスタム信号がありますが、これはポイントではありません)
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 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("
data0:%d
",datagram.at(0));
// printf("data1:%d
",datagram.at(1));
// printf("data.size:%d",datagram.size());
}