ZBLOG

将 QImage 的图像数据拷贝到新申请的内存中,且格式兼容 OpenCV 库的 cv::Mat

要将 QImage 的图像数据拷贝到新申请的内存中,并使其格式兼容 OpenCV 的 cv::Mat,你可以按照以下步骤操作:

  1. 确保你的 QImage 对象是有效的。
  2. 根据 QImage 的格式,将其转换为 OpenCV 支持的格式(如 CV_8UC3 或 CV_8UC1)。
  3. 创建一个 cv::Mat 对象并用 QImage 的数据填充它。

下面是一个示例代码,展示了如何实现这一过程:

#include <QImage>
#include <opencv2/opencv.hpp>

cv::Mat QImageToCvMat(const QImage &image) {
    // 检查 QImage 是否有效
    if (image.isNull()) {
        throw std::runtime_error("Invalid QImage");
    }

    // 将 QImage 转换为 RGB888 格式,如果不是,则进行转换
    QImage converted = image.convertToFormat(QImage::Format_RGB888);

    // 创建 cv::Mat, 使用 data() 方法获取指向原始数据的指针
    cv::Mat mat(converted.height(), converted.width(), CV_8UC3, (void*)converted.bits(), converted.bytesPerLine());

    // 由于 Mat 不拥有图像数据,因此需要保证在 Mat 使用之前,QImage 不被销毁
    return mat.clone(); // 克隆以确保 cv::Mat 拥有自己的副本
}

注意事项:

  • 在上面的代码中,我们首先检查 QImage 是否有效。如果无效,抛出异常。
  • 然后使用 convertToFormat() 将图像转换为适合 OpenCV 的格式(这里选择的是 RGB888 格式)。
  • 创建 cv::Mat 时,我们使用了来自 QImage 的原始数据,但为了避免潜在的数据生命周期问题,通过调用 .clone() 创建了一个独立的副本。

使用方式:

// 假设你已经有了一个 QImage 对象 image
QImage image("path_to_your_image.png");
try {
    cv::Mat mat = QImageToCvMat(image);
    // 现在你可以在 OpenCV 中使用 mat 了
} catch (const std::runtime_error &e) {
    qDebug() << e.what();
}

这样,你就成功地将 QImage 转换为了与 OpenCV 兼容的 cv::Mat


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22647

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?