ZBLOG

QImage转cv::mat

在使用 Qt 和 OpenCV 进行图像处理时,可能需要在 QImagecv::Mat 之间进行转换。下面是一个将 QImage 转换为 cv::Mat 的示例代码:

QImage 转 cv::Mat

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

cv::Mat QImageToCvMat(const QImage &image) {
    // 确保输入的 QImage 是有效的
    if (image.isNull()) {
        return cv::Mat();
    }

    // 检查图像格式
    switch (image.format()) {
        case QImage::Format_RGB888: { // RGB格式
            cv::Mat mat(image.height(), image.width(), CV_8UC3,
                         const_cast<uchar*>(image.bits()), image.bytesPerLine());
            return mat.clone(); // 克隆数据,以确保独立于原始 QImage
        }
        case QImage::Format_RGBA8888: { // RGBA格式
            cv::Mat mat(image.height(), image.width(), CV_8UC4,
                         const_cast<uchar*>(image.bits()), image.bytesPerLine());
            return mat.clone(); // 克隆数据,以确保独立于原始 QImage
        }
        case QImage::Format_Grayscale8: { // 灰度图格式
            cv::Mat mat(image.height(), image.width(), CV_8UC1,
                         const_cast<uchar*>(image.bits()), image.bytesPerLine());
            return mat.clone(); // 克隆数据,以确保独立于原始 QImage
        }
        default:
            qWarning("Unsupported format, converting to RGB888.");
            return QPixmap(image).toImage().convertToFormat(QImage::Format_RGB888);
    }
}

cv::Mat 转 QImage

如果需要将 cv::Mat 转换回 QImage,可以使用以下函数:

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

QImage CvMatToQImage(const cv::Mat &mat) {
    switch (mat.type()) {
        case CV_8UC3: { // BGR 格式,需转换为 RGB 格式
            cv::Mat rgb;
            cvtColor(mat, rgb, cv::COLOR_BGR2RGB);
            return QImage((const uchar*)rgb.data, rgb.cols, rgb.rows, rgb.step[0], 
                           QImage::Format_RGB888).copy();
        }
        case CV_8UC1: { // 灰度图格式
            return QImage((const uchar*)mat.data, mat.cols, mat.rows, 
                           mat.step[0], QImage::Format_Grayscale8).copy();
        }
        case CV_8UC4: { // BGRA 格式,需转换为 RGBA 格式
            cv::Mat rgba;
            cvtColor(mat, rgba, cv::COLOR_BGRA2RGBA);
            return QImage((const uchar*)rgba.data, rgba.cols, rgba.rows,
                           rgba.step[0], QImage::Format_RGBA8888).copy();
        }
        default:
            qWarning("Unsupported Mat type.");
            return QImage();
    }
}

使用方法

你可以按照以下方式使用这些函数:

// 从文件加载图像到QImage中并转换为cv::Mat:
QImage qImg("path/to/your/image.png");
cv::Mat cvImg = QImageToCvMat(qImg);

// 对cvImg进行操作...

// 将处理后的cv::Mat转换回QImage:
QImage resultImg = CvMatToQImage(cvImg);

// 保存结果:
resultImg.save("path/to/save/result_image.png");

注意事项

  • 在上述代码中,我们使用了 clone() 方法以确保从 QPixmap 中创建新的数据副本,这样当源对象销毁时不会影响生成的图像。
  • 还要根据你的实际应用情况选择适当的颜色空间,并相应地转换颜色顺序(如 BGR 到 RGB)。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?