Mat与QImage互转

1、MatConvertQImage.hpp

#ifndef MATQIMAGE_HPP
#define MATQIMAGE_HPP
#include <QImage>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


class MatConvertQImage
{
public:
    MatConvertQImage();
    ~MatConvertQImage();

    cv::Mat QImage2cvMat(QImage image);
    QImage Mat2QImage(const cv::Mat& InputMat);

};

#endif // MATQIMAGE_HPP

2、 MatConvertQImage.cpp

#include "MatConvertQImage.h"
#include <qDebug>
#include <opencv2/opencv.hpp>

MatConvertQImage::MatConvertQImage()
{

}
MatConvertQImage::~MatConvertQImage()
{

}

cv::Mat MatConvertQImage::QImage2cvMat(QImage image)
{
    cv::Mat mat;
    //qDebug() << image.format();
    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());
        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;
    }
    return mat;
}

QImage MatConvertQImage::Mat2QImage(const cv::Mat& InputMat)

{

    cv::Mat TmpMat;

    // convert the color space to RGB
    if (InputMat.channels() == 1)

    {
        cv::cvtColor(InputMat, TmpMat, CV_GRAY2RGB);
    }

    else

    {
        cv::cvtColor(InputMat, TmpMat, CV_BGR2RGB);
    }


    // construct the QImage using the data of the mat, while do not copy the data

    QImage Result = QImage((const uchar*)(TmpMat.data), TmpMat.cols, TmpMat.rows,

                           QImage::Format_RGB888);

    // deep copy the data from mat to QImage

    Result.bits();

    return Result;


}

猜你喜欢

转载自blog.csdn.net/weixin_38621214/article/details/84675305