QImage cvMat2QImage(const cv::Mat& mat){
// 8-bits unsigned, NO. OF CHANNELS = 1if(mat.type()== CV_8UC1){
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);// Set the color table (used to translate colour indexes to qRgb values)
image.setNumColors(256);for(int i =0; i <256; i++){
image.setColor(i,qRgb(i, i, i));}// Copy input Mat
uchar *pSrc = mat.data;for(int row =0; row < mat.rows; row ++){
uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;}return image;}// 8-bits unsigned, NO. OF CHANNELS = 3elseif(mat.type()== CV_8UC3){
// Copy input Matconst uchar *pSrc =(const uchar*)mat.data;// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);return image.rgbSwapped();}elseif(mat.type()== CV_8UC4){
// Copy input Matconst uchar *pSrc =(const uchar*)mat.data;// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);return image.copy();}else{
returnQImage();}}
4. QImage转Mat
Mat QImage2cvMat(QImage image){
Mat mat;switch(image.format()){
case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:
mat =Mat(image.height(), image.width(), CV_8UC4,(void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:
mat =Mat(image.height(), image.width(), CV_8UC3,(void*)image.constBits(), image.bytesPerLine());
cv::cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:
mat =Mat(image.height(), image.width(), CV_8UC1,(void*)image.constBits(), image.bytesPerLine());break;}return mat;}