【问题标题】:Convert IplImage to QByteArray将 IplImage 转换为 QByteArray
【发布时间】:2012-05-06 03:40:42
【问题描述】:

我需要使用 UDP 套接字发送从相机获取的 IplImages。我正在使用 Qt。该应用程序有两个部分。服务器应从数码相机获取图像并通过 upd(广播)将它们发送到特定端口。客户端是 GUI 应用程序。他们将接收图像并将其显示在 QLabel 上。

我使用 OpenCV 处理图像,所以我的相机输入是 IplImage。我知道如何将其转换为QImage/QPixmap 并将其显示在标签上。但是找不到通过 udp 套接字发送IplImage 的方法...QUdpSocet::writeDatagram 只接受QByteArray 所以我需要将IplImage 转换为QByteArray,这应该非常快(不适合在服务器上转换图像)。

【问题讨论】:

  • 在 Java 中,有一个 IplImage.getByteBuffer() 函数。我不知道它是否存在于 Qt 中。如果是这样,它将是您正在寻找的东西,如果不是,您可以随时为 IplImage 编写自己的序列化函数
  • IplImage 类中有IplImage::imageData 字段。我不确定这是否是实际数据……我会试试的。

标签: qt opencv qt4 udp


【解决方案1】:

我看到你可以用 :

创建一个 QByteArray
QByteArray ( const char * data, int size )

在 IplImage 部分你有:

 int imageSize

    Image data size in bytes. For interleaved data, this equals image->height * image->widthStep

char* imageData

    A pointer to the aligned image data. Do not assign imageData directly. Use SetData().

所以它应该很简单 QByteArray(image->imageData, image->imageSize);

【讨论】:

  • 图像尺寸大于可以通过 udp 发送的大小.... 看不到结果,但似乎工作正常...
  • @SorushRabiee QUdpSocket::writeDatagrams 的文档明确指出:“一般不建议发送大于 512 字节的数据报,因为即使发送成功,也可能会被 IP 层分片在到达最终目的地之前。”从经验来看,它因操作系统而异。所以最好切掉你的数据或使用 QTcpSocket(这显然是更好的建议,因为 UDP 数据包可能会丢失,而且你可能不希望你的图片丢失任意数据。
  • 当然,分割包意味着添加一个协议以将图像按正确的顺序放置,重新请求丢失的数据包等。所以真的,除非你有一个非常非常非常好的理由,否则使用 QTcpSocket。
猜你喜欢
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2020-09-18
  • 2012-02-03
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多