【问题标题】:C/C++ OpenCV Mat(32F) sending through UDPC/C++ OpenCV Mat(32F) 通过 UDP 发送
【发布时间】:2021-10-30 01:30:46
【问题描述】:

我从“reprojectImageTo3D”(opencv 函数之一)制作了 Mat(32F),我想通过 socket(UDP) 发送它。

如何通过 UDP 发送?

是每个坐标发还是可以一次发给Mat?

【问题讨论】:

  • 这个How to send MAT via sockets 可能会有所帮助。第一个答案是一个很好的建议。
  • C 和 C++ 是不同的语言 - 选择相关的,不要发送不相关的标签。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: c++ c opencv sockets


【解决方案1】:

您可以先将cv::Mat 对象编码为一个无符号字符向量,然后通过UDP 套接字发送它。然后接收端点必须对std::vector<uchar> 进行解码以生成原始cv::Mat(使用cv::imdecode())。

  1. 编码 cv::Mat 对象 - 例如使用 cv::imencode 进行 JPEG 压缩
// Assuming you already have a cv::Mat mat object
std::vector<uchar> buf;
std::vector<int> params;
params.push_back(cv::IMWRITE_JPEG_QUALITY);
params.push_back(50); // compression quality, ranges between 0-100

if (!cv::imencode(".jpg", mat, buf, params)) {
  std::cout << "JPEG compression failed.\n";
}
  1. 通过 UDP 发送压缩图像数据
// Create UDP socket
int sockfd_;
if ((sockfd_ = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  perror("socket creation failed\n");
  return false;
}

struct sockaddr_in addr;
// Populate addr variable with endpoint's URI
/* TODO */

// Send data
if (!sendto(sockfd_, (const uchar*)buf.data(), buf.size(), MSG_DONTWAIT,
            (const struct sockaddr*)&addr, sizeof(addr))) {
  std::cout << "Failed to send frame to client.\n";
}

【讨论】:

  • 嗨!感谢回复 我有一个 32 位浮点数,我可以在 uchar 中得到它吗?我可以在 JPEG 上压缩它吗?非常感谢!
  • JPEG 不能存储浮点值,而且有损。
  • 那么如何通过 UDP 发送 Mat(32 float 格式)?
  • @wooki 文档说“32 位浮点 (CV_32F) 图像可以保存为 PFM、TIFF、OpenEXR 和 Radiance HDR 格式;3 通道 (CV_32FC3) TIFF 图像将使用LogLuv 高动态范围编码(每像素 4 字节)”——你没看吗?
猜你喜欢
  • 2015-06-03
  • 2014-08-24
  • 2017-09-27
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2012-11-14
相关资源
最近更新 更多