QImage转Mat(Mat 转QImage)工具类

@[TOC](QImage转Mat(Mat 转QImage)工具类)

注意QImage转Mat 需要mat.clone()

matcvImage.h

#ifndef MATCVTIMAGE_H
#define MATCVTIMAGE_H

#include <QImage>
#include<opencv2/opencv.hpp>
#include<QDebug>
using namespace cv;

class MatCvtImage
{
    
    
public:
    MatCvtImage(Mat mat);
    MatCvtImage(QImage image);
    ~MatCvtImage();
    /**
     * @brief matCvtImage Mat转QImage
     * @return
     */
    QImage matCvtImage();
    /**
     * @brief imageCvtMat QImage转Mat
     * @return
     */
    Mat imageCvtMat();
private:
    Mat mat;
    QImage image;
};

#endif // MATCVTIMAGE_H

matcvImage.cpp

#include "matcvtimage.h"

MatCvtImage::MatCvtImage(Mat mat)
{
    
    
    this->mat = mat;
}

MatCvtImage::MatCvtImage(QImage image)
{
    
    
    this->image =image;
}

MatCvtImage::~MatCvtImage()
{
    
      

}

QImage MatCvtImage::matCvtImage()
{
    
    
    Mat temp = this->mat;
    QImage img;
    if(temp.channels() == 1){
    
    
        //Gray
        img = QImage((const unsigned char*)temp.data, temp.cols, temp.rows, temp.cols, QImage::Format_Grayscale8);
    }else{
    
    
        //BGR
        cvtColor(temp,temp,COLOR_BGR2RGB);
        img =  QImage((uchar*)temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);

    }
    return img;
}

Mat MatCvtImage::imageCvtMat()

{
    
    
    QImage inImage = this->image;
    switch ( inImage.format() )
    {
    
    
    // 8-bit, 4 channel
    case QImage::Format_ARGB32:
    case QImage::Format_ARGB32_Premultiplied:
    {
    
    
        cv::Mat  mat( inImage.height(), inImage.width(),
                      CV_8UC4,
                      const_cast<uchar*>(inImage.bits()),
                      static_cast<size_t>(inImage.bytesPerLine())
                      );

        return  mat.clone();
    }

        // 8-bit, 3 channel
    case QImage::Format_RGB32:
    {
    
    

        Mat  mat( inImage.height(), inImage.width(),
                  CV_8UC4,
                  const_cast<uchar*>(inImage.bits()),
                  static_cast<size_t>(inImage.bytesPerLine())
                  );

        Mat  matNoAlpha;

        cvtColor( mat, matNoAlpha, COLOR_BGRA2BGR );   // drop the all-white alpha channel

        return matNoAlpha;
    }

        // 8-bit, 3 channel
    case QImage::Format_RGB888:
    {
    
    
        QImage   swapped = inImage.rgbSwapped();

        return Mat( swapped.height(), swapped.width(),
                    CV_8UC3,
                    const_cast<uchar*>(swapped.bits()),
                    static_cast<size_t>(swapped.bytesPerLine())
                    ).clone();
    }

        // 8-bit, 1 channel
    case QImage::Format_Grayscale8:
    case QImage::Format_Indexed8:
    {
    
    
        Mat  mat( inImage.height(), inImage.width(),
                  CV_8UC1,
                  const_cast<uchar*>(inImage.bits()),
                  static_cast<size_t>(inImage.bytesPerLine())
                  );

        return mat.clone() ;
    }
    default:
        qDebug() << "没有专门所属类型,请完善!!!" << inImage.format()<<endl;
        break;
    }

    return Mat();

}

参考

1.Github:asmOpenCV/asmOpenCV.h
2.QImage和Mat相互转换
3.cv::Mat与QImage的互相转换

猜你喜欢

转载自blog.csdn.net/qq_44464101/article/details/128247822