【问题标题】:Transfer images on websocket by using boost library使用 boost 库在 websocket 上传输图像
【发布时间】:2021-05-01 23:13:14
【问题描述】:

我想使用 boost 库在 websocket 上传输图像数据。

我应该如何解决以下错误?

首先,通过参考以下网址,我确认可以传输和接收文本数据。 https://www.boost.org/doc/libs/1_68_0/libs/beast/doc/html/beast/quick_start.html

接下来,虽然我尝试传输图像,但收到以下错误消息。

 websocket_client.cpp:563:38: error: no matching function for call to 'buffer(cv::Mat&)'

 ws.write(boost::asio::buffer(img));

我所做的如下。

  1. 使用 opencv 将图像文件读取为“img”。

  2. 更改传输数据的代码

    // Send the message
    
    // ws.write(boost::asio::buffer(std::string(text)));
    
    ws.write(boost::asio::buffer(img));
    

【问题讨论】:

标签: c++ boost websocket boost-beast


【解决方案1】:

cv::Mat 不是缓冲区类型,也不是可适应的。如果您有 POD 数据,那么您可以像评论者所说的那样“投射”它:

 // don't do this:
 buffer(&img, sizeof(img));

但是,这并不安全:

static_assert(std::is_standard_layout_v<cv::Mat>);
static_assert(std::is_trivial_v<cv::Mat>);

该类型实际上不可按位复制。但由于存在矩阵,因此可能有一个连续的数据区域

ws.write(net::buffer(img.data, img.total() * img.elemSize()));

这使用了total()elemSize(),链接到文档。

现在,如果接收端已经知道尺寸,这就足够了。如果没有,请先发送,例如:

uint32_t dimensions[] { htonl(image_witdh), htonl(image_height) };

std::vector<net::const_buffer> buffers {
    net::buffer(dimensions),
    net::buffer(img.data, img.total() * img.elemSize())
};
ws.write(buffers);

【讨论】:

  • 我成功地将图像作为二进制文件传输到服务器。但我无法显示图像。我怎么能这样做?错误信息 img = np.frombuffer(message, dtype=np.uint8) #NG TypeError: a bytes-like object is required, not 'str'
  • 恐怕你在X/Y problem。如果你问过“我如何显示通过 websockets 接收到的图像”,你会得到完全不同的答案。 stackoverflow.com/questions/9292133/…
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2012-07-22
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
相关资源
最近更新 更多