• QImage,Mat ,QByteArray转换


    QImage 转为Mat

    void QImageToMat(QImage image, cv::Mat& mat)
    {
        switch (image.format())
        {
        case QImage::Format_ARGB32:
        case QImage::Format_RGB32:
        case QImage::Format_ARGB32_Premultiplied:
        {
            mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
            std::vector<cv::Mat>channels;
            split(mat, channels);
            channels.pop_back();
            cv::merge(channels, mat);
        }
    
        break;
        case QImage::Format_RGB888:
            mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
            //cv::cvtColor(mat, mat, CV_BGR2RGB);
            break;
        case QImage::Format_Indexed8:
            mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
            break;
            
        }
    }
    void QByteArrayToMat(QByteArray array, cv::Mat& mat)
    {
        QBuffer buffer(&array);
        buffer.open(QIODevice::ReadOnly);
        QImageReader reader(&buffer, "JPG");
        QImage image = reader.read();
    
        switch (image.format())
        {
        case QImage::Format_ARGB32:
        case QImage::Format_RGB32:
        case QImage::Format_ARGB32_Premultiplied:
        {
            mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
            std::vector<cv::Mat>channels;
            split(mat, channels);
            channels.pop_back();
            cv::merge(channels, mat);
        }
        break;
        case QImage::Format_RGB888:
            mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
            //cv::cvtColor(mat, mat, CV_BGR2RGB);
            break;
        case QImage::Format_Indexed8:
            mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
            break;
            
        }
    }

    QByteArray转为Mat

    void QByteArrayToMat(QByteArray array, cv::Mat& mat)
    {
        QBuffer buffer(&array);
        buffer.open(QIODevice::ReadOnly);
        QImageReader reader(&buffer, "JPG");
        QImage image = reader.read();
    
        switch (image.format())
        {
        case QImage::Format_ARGB32:
        case QImage::Format_RGB32:
        case QImage::Format_ARGB32_Premultiplied:
        {
            mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
            std::vector<cv::Mat>channels;
            split(mat, channels);
            channels.pop_back();
            cv::merge(channels, mat);
        }
        break;
        case QImage::Format_RGB888:
            mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
            //cv::cvtColor(mat, mat, CV_BGR2RGB);
            break;
        case QImage::Format_Indexed8:
            mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
            break;
            
        }
    }
  • 相关阅读:
    Windows系统下八大具有高逼格的DOS命令之一【ping】
    NOIP初赛 之 逻辑运算
    动态规划 —— 背包问题一 专项研究学习
    使用前端原生 js,贪吃蛇小游戏
    纯html+css制作3D立方体和动画效果
    css3实现3D动画轮播图
    原生js的弹力小球
    小球的问题
    早期练手:功能相对比较完善的 js 计算器
    自动布局简介
  • 原文地址:https://www.cnblogs.com/hsy1941/p/15040160.html
Copyright © 2020-2023  润新知