当前位置: 首页 > 知识库问答 >
问题:

通过Qt websocket将opencv Mat图像发送到HTML客户端

程招
2023-03-14

我正试图用Qt5.7用c编写一个应用程序,基本上它应该是一个websocket服务器,使用qwebsocket,能够将opencv制作的图像发送到HTML客户端。我要做的是在base64中对图像进行编码,然后在客户端将编码后的字符串放入图像标记的src中。只是为了测试,我可以正确地发送/接收文本消息,因此websocket架构可以正常工作,但是我在图像方面遇到了一些问题。这是我的代码片段:

服务器

    cv::Mat imgIn;
    imgIn = cv::imread("/home/me/color.png",CV_LOAD_IMAGE_COLOR);
    QByteArray Img((char*)(imgIn.data),imgIn.total()*imgIn.elemSize());
    QByteArray Img64 = Img.toBase64();
    pClient->sendBinaryMessage(Img64);

客户

<img id="ItemPreview" src="" style="border:5px solid black" />

....

websocket.binaryType = "arraybuffer";

websocket.onmessage = function (evt) {
console.log( "Message received :", evt.data );
document.getElementById("ItemPreview").src = "data:image/png;base64," + evt.data;
};

我认为大多数问题都在服务器上,因为我从映像中获取的base64序列与我从联机转换器image/base64中获取的序列不同。在客户端上,我在控制台中收到此错误,但未显示任何内容:

data: Image/png; Bas64,[对象ArrayBuffer]: 1 GET data: Image/png; Bas64,[对象ArrayBuffer]::ERR_INVALID_URL

有什么提示吗?

解决方案

感谢建议,我可以提供工作代码:

服务器

    imgIn = cv::imread("/home/me/color.png", CV_LOAD_IMAGE_UNCHANGED);
    std::vector<uchar> buffer;
    cv::imencode(".png",imgIn,buffer);
    std::string s = base64_encode(buffer.data(),buffer.size());
    pClient->sendTextMessage(QString::fromStdString(s));

客户

删除了这一行:

    websocket.binaryType = "arraybuffer";

服务器中的Base64编码使用以下代码完成:

编码/解码base64

共有1个答案

乐正光誉
2023-03-14

服务器中的这一行:

imgIn = cv::imread("/home/me/color.png",CV_LOAD_IMAGE_COLOR);

解码PNG格式的图像,并将其作为像素数据加载放在内存中(可能还有一些行填充,您不考虑这些,请参见下文)。这就是你的base64编码。

客户端中的这一行:

document.getElementById("ItemPreview").src = "data:image/png;base64," + evt.data;

需要一个PNG图像,但这不是你要发送的;您刚刚推出了大量原始像素数据,没有任何尺寸、步幅、格式信息或其他信息。

如果您的客户机需要PNG,则必须使用类似于imencode方法将PNG数据写入内存缓冲区,然后改为base64编码。

另一个需要注意的重要事项是,解码图像可能有行填充。。。每行末尾的几个字节用于内存对齐。因此,每个图像行的实际长度可能超过图像的宽度乘以每个像素的大小(以字节为单位)。这意味着此操作:

QByteArray Img((char*)(imgIn.data),imgIn.total()*imgIn.elemSize());

实际上,可能不会将整个图像缓冲区包装在QByteArray中。检查图像的步幅/步长有多种方法,但您最好阅读cv::Mat文档,因为我不值得在这里重复所有这些文档。这只在您正在执行原始字节级图像处理时才重要,就像您在这里一样。如果使用imencode,则不必担心这一点。

 类似资料:
  • 问题内容: 我正在尝试使用HttpUrlConnection将图像发送到服务器,因为它是Google推荐的。我决定将图像转换为Base64字符串,然后将其发送到服务器,然后将其解码为.jpg文件。但是这种方法仅适用于小尺寸缩略图,而我无法发送全尺寸图像。 这是android客户端代码: Node.js服务器代码: 由于BufferedWriter的大小限制,我无法对完整尺寸的图像使用相同的方法-b

  • 问题内容: 我使用此功能将html文件发送到客户端,但是在客户端中我什么也没有得到(空白页),没有错误。我有什么问题吗?,请帮忙? 我的test.html文件 问题答案: 尝试这样的代码: 使用res.sendFile而不是手动读取文件,以便express可以为您正确设置内容类型。 您不需要这行,因为这是由express内部处理的。

  • 问题内容: 我正在制作一个应用程序,用于将图像从Android设备发送到在PC上运行的Java应用程序。客户端(android)上的图片是,我将其转换为,以便通过蓝牙发送到服务器。 请注意,位图来自已压缩的文件,因此我不需要再次对其进行压缩。 我在服务器(Java)上使用以下代码: 客户端没有错误。但是我在服务器端(Java应用程序)遇到此异常: java.lang.IllegalArgument

  • 问题内容: 我只能在用户的套接字ID直接存储在io.sockets.on(’connect’)函数中时向用户发出消息。我不知道为什么在登录后尝试存储其套接字ID时为什么不起作用。 加工: 无法运作: JavaScript客户端代码段 解决方案:感谢@alessioalex, 我不得不从登录页面中删除对socket.io的引用,并将以下内容添加到io.sockets.on(’connection’)

  • 问题内容: 我可以使用msdb.dbo.sp_send_dbmail以html格式发送电子邮件。仅在格式方面对文本非常好。例如: 但是,如果要包括从SQL服务器上的数据生成的趋势之类的图像并将其嵌入html(@emailHTML)中,应该使用哪个html标签? 如果使用[img]标记,则需要设置src属性。生成的图像保存在本地SQL Server的硬盘中。我可以将它们放在IS服务器网页区域中。但是

  • 问题内容: 您好,我一直在尝试将文件从node.js发送到客户端。 我的代码有效,但是当客户端转到指定的url()时,它将流式传输文件。 从Google Chrome浏览器访问该文件可使文件(.mp3)在播放器中播放。 我的目标是让客户的浏览器下载文件,然后问客户他想在哪里存储文件,而不是在网站上流式传输。 问题答案: 您需要设置一些标题标志。 用下载代替流媒体;