QT中常见QImage、Pixmap、cv::Mat三种图像格式的转换

1. QImage转换成cv::Mat

复制代码
cv::Mat QImage2cvMat(const QImage &image)
{
    cv::Mat mat;
    int temp = image.format(); //防止警告
    switch(temp)
    {
    case QImage::Format_Grayscale8: // 灰度图,每个像素点1个字节(8位)
        // Mat构造:行数,列数,存储结构,数据,step每行多少字节
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_ARGB32: // uint32存储0xAARRGGBB,pc一般小端存储低位在前,所以字节顺序就成了BGRA
    case QImage::Format_RGB32: // Alpha为FF
    case QImage::Format_ARGB32_Premultiplied:
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_RGB888: // RR,GG,BB字节顺序存储
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        // opencv需要转为BGR的字节顺序
        cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR);
        break;
    case QImage::Format_RGBA64: // uint64存储,顺序和Format_ARGB32相反,RGBA
        mat = cv::Mat(image.height(), image.width(), CV_16UC4, (void*)image.constBits(), image.bytesPerLine());
        // opencv需要转为BGRA的字节顺序
        cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGRA);
        break;
    }
    return mat;
}

2. cv::Mat转换成QImage

复制代码
QImage cvMat2QImage(const cv::Mat &mat)
{
    QImage image;
    int temp = mat.type(); //防止警告
    switch(temp )
    {
    case CV_8UC1:
        // QImage构造:数据,宽度,高度,每行多少字节,存储结构
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
        break;
    case CV_8UC3:
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        image = image.rgbSwapped(); // BRG转为RGB
        // Qt5.14增加了Format_BGR888
        // image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.cols * 3, QImage::Format_BGR888);
        break;
    case CV_8UC4:
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
        break;
    case CV_16UC4:
        image = QImage((const unsigned char*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGBA64);
        image = image.rgbSwapped(); // BRG转为RGB
        break;
    }
    return image;
}

3. Pixmap转换成QImage

复制代码
QImage Util::pix2img(QPixmap& p)
{
    QImage qImage = p.toImage();
    return qImage;
}

4. QImage转换成Pixmap

复制代码
QPixmap Util::img2pix(QImage& p)
{
    QPixmap qPixmap = QPixmap::fromImage(p);
    return qPixmap;
}

5. Pixmap转换成cv:Mat

复制代码
Mat Util::pix2mat(QPixmap& p)
{
    QImage image = p.toImage();
    cv::Mat mat = img2mat(image);
    return mat;
}

6. cv:Mat转换成Pixmap

复制代码
QPixmap Util::mat2pix(Mat& mat)
{
    QImage image = mat2img(mat);
    QPixmap pixmap = QPixmap::fromImage(image);
    return pixmap;
}

参考: QT中常见QImage、Pixmap、Mat三种图像格式的转换_mat转qpixmap-CSDN博客

cv::Mat与QImage的互相转换_cvmat转qimage-CSDN博客

相关推荐
慧都产品智能化34 分钟前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu1 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu2 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.2 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
瑞雪兆丰年兮3 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客3 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
三雷科技4 小时前
第6章第4节:自定义分词器
开发语言·c#
Adellle4 小时前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
Delightrs5 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
云上工程笔记5 小时前
SRT字幕一键转手绘动画:srt-whiteboard-animation的复刻实录
大数据·开发语言·javascript·人工智能·机器学习