【问题标题】:Opencv Mat conversion to QByteArrayOpencv Mat 转换为 QByteArray
【发布时间】:2016-04-29 13:38:27
【问题描述】:

我需要通过 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);
}

【问题讨论】:

  • 从 Qbytearray 到 Mat 的转换现在可以工作了。这是 Mat 类型的问题。我从 CV_8UC3 更改为 CV_8UC4(alpha 通道)。但是将 Mat 转换为 QBytearray 仍然存在问题。我返回的 QBytearray 大小等于 40000 而不是 160000。所以我只有一部分图像...

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2015-12-13
    • 2017-02-19
    • 2018-11-28
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多