【发布时间】: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