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