ZBLOG

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

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

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

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

  1. #include <QImage>
  2. #include <opencv2/opencv.hpp>
  3. cv::Mat QImageToCvMat(const QImage &image) {
  4. // 检查 QImage 是否有效
  5. if (image.isNull()) {
  6. throw std::runtime_error("Invalid QImage");
  7. }
  8. // 将 QImage 转换为 RGB888 格式,如果不是,则进行转换
  9. QImage converted = image.convertToFormat(QImage::Format_RGB888);
  10. // 创建 cv::Mat, 使用 data() 方法获取指向原始数据的指针
  11. cv::Mat mat(converted.height(), converted.width(), CV_8UC3, (void*)converted.bits(), converted.bytesPerLine());
  12. // 由于 Mat 不拥有图像数据,因此需要保证在 Mat 使用之前,QImage 不被销毁
  13. return mat.clone(); // 克隆以确保 cv::Mat 拥有自己的副本
  14. }

注意事项:

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

使用方式:

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?