Opencv Mat转换为QByteArray

时间:2016-04-29 13:38:27

标签: c++ qt opencv websocket type-conversion

我需要通过websocket将图像从我的Qt应用程序(使用OpenCv)传输到我的Web应用程序。 使用二进制数据的传输效果很好。我有一个测试网络应用程序,它将图像发送到我的Qt应用程序,图像(QbyteArray)直接重新发送到我的网络应用程序。这是他的工作。

我现在的问题是接收我的QByteArray,将其转换为Mat图像。或者将我的Mat数组转换为QbyteArray以便发送它。

所以我尝试将QByteArray转换为Mat:

Mat imgbuf = Mat(200, 200, CV_8UC3, message.data);
Mat matImg = imdecode(imgbuf, CV_LOAD_IMAGE_ANYCOLOR);

Imgbuf不为空,但imdecode方法返回一个空的Mat。

我还尝试将Mat转换为QbyteArray(对我来说最重要):

cv::resize(img, img, Size(200, 200));
std::vector<float> array;
if (img.isContinuous()) {
    array.assign((float*)img.datastart, (float*)img.dataend);
}
else {
    for (int i = 0; i < img.rows; ++i) {
        array.insert(array.end(), (float*)img.ptr<uchar>(i),(float*)img.ptr<uchar>(i) + img.cols);
    }
}

QByteArray ImgByte((char*)array.data(), array.size());

server->sendBinary(ImgByte);

这里ImgByte不是空的,但我的Html页面上什么也没有...

这里是测试网络应用的代码:

function handleReceive(message) {
     // canvas    
     var c = resultCanvas = document.getElementById('result');  
     var ctx = c.getContext('2d');
     var imageData = ctx.createImageData(200, 200);
     var pixels = imageData.data;

     var buffer = new Uint8Array(message.data);
     for (var i=0; i < pixels.length; i++) {
          pixels[i] = buffer[i];
     }
     console.log(imageData);
     ctx.putImageData(imageData, 0, 0);
}

1 个答案:

答案 0 :(得分:0)

我找到了将Mat转换为QBytesarray的解决方案,反之亦然。

所以,通过Websocket发送Mat图像:

Mat imgC4In;
resize(imgBufIn, imgBufIn, Size(200, 200));
cvtColor(imgBufIn, imgC4In, CV_BGR2BGRA); // Need to be BGRA to display in canvas (js client)

// Conversion from Mat to QByteArray
QByteArray ImgByteI((char*)(imgC4In.data), 160000);

server->sendBinary(ImgByteI);

非常简单,效果很好!

从QByteArray获取Mat:

Mat img = Mat(200, 200, CV_8UC4, messageQByte.data());