QT 12 QTimage转换Mat

QImage cvMat2QImage(const cv::Mat& mat)
{
    // 8-bits unsigned, NO. OF CHANNELS = 1
    if(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.setColorCount(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 = 3
    else if(mat.type() == CV_8UC3)
    {
        // Copy input Mat
        const 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();
    }
    else if(mat.type() == CV_8UC4)
    {
        qDebug() << "CV_8UC4";
        // Copy input Mat
        const 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
    {
        qDebug() << "ERROR: Mat could not be converted to QImage.";
        return QImage();
    }
}
cv::Mat 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;
}

  唯一需要注意的是cvMat 和QImage 对于RGBA 这四个分量的排列顺序是不相同的。转换的时候需要调换一下。但是Qt 的文档中说的很明确,QImage内部数据存储的方式不能保证以后永远不变。所以这个代码也不能保证一直是可用的。

时间: 2024-08-26 21:01:11

QT 12 QTimage转换Mat的相关文章

Qt中将float转换成unsigned short类型

在用Qt开发应用程序时有时候需要将float类型转换为unsigned short类型的.如果进行强制类型转换,那么会出现精度损失的问题,使数据变得不正确.那么可以通过先将float类型的转换为QString类型的,QString sNum = QString::number(fNum);然后调用sNum.toUShort()函数就可以将float转换为unsigned short类型. 来自为知笔记(Wiz) Qt中将float转换成unsigned short类型,布布扣,bubuko.co

Qt编程之转换成8,16bit的灰度图

其实我目前还没有实现. references: http://qt-project.org/faq/answer/how_can_i_convert_a_colored_qpixmap_into_a_grayscaled_qpixmap http://www.qtcentre.org/threads/46596-How-to-convert-a-32-bit-RGB-image-to-8-bit-gray-scale-image http://www.qtcentre.org/threads/1

Qt Creater error 转换到 COFF 期间失败

版本信息 Qt版本: Qt 5.2.1 MSVC2010 VS版本: visual studio 2010 错误信息 :-1: error: LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 解决方案 我的解决方案: 查找是否有两个cvtres.exe 一个是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtr

QT的时区转换以及使用注意事项

QDateTime localDate = QDateTime::fromString("2018-12-11 10:40:00", "yyyy-MM-dd hh:mm:ss");//输入的时间 QDateTime utcDate = localDate.toTimeZone(zone);//拿到的是0时区的当前时间 QDateTime currentTime = QDateTime::currentDateTime();//当前时区的当前时间 QDateTime

covertTo 和 setTo无法转换mat像素类型

1.原始问题: src = imread("**.jpg"); GpuMat srcImg(src); GpuMat hist; gpu::calcHist(srcImg,hist) 使用imread载入图像后, 再导入到GpuMat中: 用calcHist处理srcImg时候出现了内存异常. 后来发现是calcHist只能处理CV_8UC1像素类型的图像,但是src的像素不是CV_8UC1. 再尝试使用covertTo和setTo来转换src的像素类型,但是没用成功. 经过调试发现,

2015.12.1CSS3转换、过渡、动画效果及css盒子模型

css3转换 1.元素偏移 tranlate 通过translate()的方法元素从当前位置移动到给定的left (x坐标)和top(y坐标)位置参数 代码如下: div{ transform:translate(50px,100px): -ms-transform:translate(50px,100px): /*IE9*/ -webkit-transform:translate(50px,100px): /*谷歌苹果*/ -o-transform:translate(50px,100px):

vector类转换Mat类

前言 一个个数据push back到vector之后,可以使用Mat()函数将vector类型转换为Mat类型. 在opencv中Mat类的构造函数中有一个构造函数可以直接把vector类转换为Mat类. 代码: std::vector<int> responses; cv::Mat tres; tres = Mat(responses, true);//vector2mat 该构造函数的定义如下(在mat.hpp文件中): template<typename _Tp> inlin

QT把widget转换成图片后打印

from PyQt5.QtWidgets import (QApplication, QWidget, QTableWidget,QPushButton, QVBoxLayout, QTableWidgetItem) from PyQt5.QtGui import QPixmap, QPainter, QImage, QTextDocument from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QPrintPreviewDialog

Qt中int转换成QString

(1) QString QString::number ( long n, int base = 10 ) [static] examle: long a = 48; QString s = QString::number(a, 10); // s == "48" QString t = QString::number(a, 16).toUpper(); // t == "30" (2) long a = 48; QString s = QString("