@[TOC](QImage to Mat (Mat to QImage) tool class)
Note that mat.clone() is required to convert QImage to Mat
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();
}
reference
1. Github: asmOpenCV/asmOpenCV.h
2. Mutual conversion between QImage and Mat
3. Mutual conversion between cv::Mat and QImage