如何将opencv灰度和彩色图像发送到Qt中的ftp服务器?

Posted

技术标签:

【中文标题】如何将opencv灰度和彩色图像发送到Qt中的ftp服务器?【英文标题】:how to send opencv gray scale and color images to a ftp server in Qt? 【发布时间】:2014-04-16 14:58:04 【问题描述】:

我想使用 Qt 5.2 中的 QNetworkAccessManager 对象将 OpenCV 单通道图像 (CV_8UC1) 和多通道图像 (CV_8UC3) 发送到 ftp 服务器。

我尝试了 QNetworkAccessManager 的 put 方法,它以下列格式之一发送数据:

QNetworkReply *put(const QNetworkRequest &request, QIODevice *data);
QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data);
QNetworkReply *put(const QNetworkRequest &request, QHttpMultiPart *multiPart);

它适用于我从硬盘读取的文本文件或图像。但我不知道如何使用这种方法发送我在 RAM 上的 opencv 灰度和彩色图像?

我想我必须将我的格式更改为 Qbytearray 然后发送它,但是通过搜索 Internet 我没有找到任何有用的东西。我只发现 this 不适合我的应用程序,生成该图像会浪费一些时间,而且我需要将 cv::mat 更改为 IplImage ....

谢谢

【问题讨论】:

服务器端是否支持 OpenCV/Qt 来重建图像并将它们写入文件? @KeillRandor 正如我在帖子中所说,我已经通过从硬盘读取图像(仅使用 qt 而不使用 opencv)将图像发送到服务器,因此它支持 qt 格式,但我不想做这个!我想从 RAM 发送处理后的图像 @PsP 查看答案***.com/questions/20314524/… 可能会有所帮助。 @PsP:请选择一个答案。 【参考方案1】:

在服务器端基本上可以使用以下方法:

QImage QImage::fromData(const uchar * data, int size, const char * format = 0) [static]

从给定二进制数据的第一个 size 字节构造一个 QImage。加载器尝试使用指定格式读取图像。如果未指定格式(这是默认值),加载程序会探测文件以查找文件头以猜测文件格式。二进制数据。加载器尝试使用指定的可选图像格式或通过从数据中确定图像格式来读取图像。

如果未指定格式(这是默认值),加载程序会探测文件的标题以确定文件格式。如果指定了格式,则必须是 QImageReader::supportedImageFormats() 返回的值之一。

如果图片加载失败,返回的图片为空图片。

只需确保正确发送原始数据即可。另外,请确保 Qt 实际支持您的图像格式,如下所示:

QList QImageReader::supportedImageFormats() [static]

返回 QImageReader 支持的图像格式列表。

Qt默认可以读取以下格式:

Format  MIME type   Description
BMP image/bmp   Windows Bitmap
GIF image/gif   Graphic Interchange Format (optional)
JPG image/jpeg  Joint Photographic Experts Group
PNG image/png   Portable Network Graphics
PBM image/x-portable-bitmap Portable Bitmap
PGM image/x-portable-graymap    Portable Graymap
PPM image/x-portable-pixmap Portable Pixmap
XBM image/x-xbitmap X11 Bitmap
XPM image/x-xpixmap X11 Pixmap
SVG image/svg+xml   Scalable Vector Graphics

Qt SVG 模块支持读写 SVG 文件。 Qt Image Formats 模块提供对其他图像格式的支持。

请注意,必须在调用此函数之前创建 QApplication 实例。

【讨论】:

【参考方案2】:

您可以创建一个包含图像数据的 QByteArray (unsigned char* Mat::data)。然后将原始图像的高度、宽度和通道数(格式)附加到数组中(或将该信息放在 QByteArray 的前面;或单独发送!)。

服务器会接收到QByteArray,然后使用构造函数重构图像:

QImage ( uchar * data, int width, int height, Format format )

【讨论】:

让我检查一下它是否有效,然后我会检查哪些答案最适合...谢谢

以上是关于如何将opencv灰度和彩色图像发送到Qt中的ftp服务器?的主要内容,如果未能解决你的问题,请参考以下文章

将灰度、彩色和精巧的图像(3)全部复制到一个大的 IplImage:Opencv 错误?

使用 Opencv 和 Qt 对两个灰度图像进行减法的使用条款

OpenCV 完整例程48. 图像增强—彩色直方图匹配

Qt-OpenCV:如何在 Qt 中显示灰度图像(opencv)

MATLAB图像拼接问题

OpenCV彩色图像转灰的烦恼