如何将 cv::mat 标头和数据部分转换为单个 qbytearray?

Posted

技术标签:

【中文标题】如何将 cv::mat 标头和数据部分转换为单个 qbytearray?【英文标题】:How to convert a cv::mat header and data part into a single qbytearray? 【发布时间】:2014-06-26 13:53:02 【问题描述】:

我想使用 Qt 4.8.1 的 Qftp 模块将 opencv 图像发送到 FTP 服务器。我写了以下代码:

        ftp = new QFtp(this);
        //ftp initilization
          .
          .
          .
          . 
        //
        cv::Mat InputImage(100,100,CV_8UC1,cv::Scalar::all(75));
        QImage FTP_Result = QImage((const uchar *) InputImage.data, InputImage.cols, InputImage.rows, InputImage.step, QImage::Format_Indexed8);
        QByteArray byteMe((char *) FTP_Result.bits());

        qDebug()<<"Image size is: "<<FTP_Result.height()<<"*"<<FTP_Result.width(); //it returns 100*100
        ftp->put(byteMe,"Sample.jpg");

当我进入 ftp 服务器硬盘时,我发现 Sample.jpg,它充满了“K”字符,这是 Asci 对应的“75”。似乎缺少标题,因此操作系统认为它只是一个简单的文本文件。我认为这是因为我只将 InputImage.data 复制到 QByteArray 变量中,因此没有关于图像的信息可用。我应该怎么做才能将“InputImage”标头信息复制到“byteMe”变量中,这样我就可以存储一个健康的 JPEG 文件?

【问题讨论】:

当您将此图像存储到硬盘中时,您会看到什么?你使用了 QImage 的 .save 或 .fromdata 方法吗? @PsP 是的,我测试了 .save 方法,但是因为我在 save 方法的 FORMAT 参数中告诉 qt 图像格式,所以它添加了标题,我将在我的硬盘中存储一个健康的图像。但我不想将图像存储在硬盘中。我想将它存储在我的 FTP 服务器硬盘中 hmmm,你有没有尝试使用 QImage 而不是 QByteArray ? @PsP 是的,但它无法将图像写入 FTP 服务器。图像大小为 0 KB !!!所以我使用了 Qbytearray 【参考方案1】:

试试

QByteArray byteMe((char *) FTP_Result.bits(), FTP_Results.byteCount());

当您使用简单的char * 构造时,它会查找以空字符结尾的字符串。

【讨论】:

以上是关于如何将 cv::mat 标头和数据部分转换为单个 qbytearray?的主要内容,如果未能解决你的问题,请参考以下文章

如何将从 C++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?

为 const 数据创建 cv::Mat 标头

将一行 cv::Mat 转换为 std::vector

将 Magick::Image 转换为 cv::Mat

如何正确将 cv::Mat 转换为 CV_8UC1?

如何从 c++ 接口 cv::Mat 转换为 c IplImage?