Opencv Mat conversion to QByteArray



我需要通过websocket将图像从我的Qt应用程序(使用OpenCv)传输到我的web应用程序。二进制数据的传输非常有效。我有一个测试web应用程序,它会向我的Qt应用程序发送一个图像,然后图像(QbyteArray)会直接重新发送到我的web应用程序。这就是工作。

我现在的问题是,接收我的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页面上什么都没有。。。

这里是测试web应用程序的代码:

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);
}

我找到了将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());

最新更新