opencv mat转qimage

QVector<QRgb> g_clrtable;
for(int i = 0; i < 256; i++)
{
        g_clrtable.push_back(QColor(i, i, i).rgb());
}

QImage cvMat2QImage(const cv::Mat &mat)
{
    // 8-bits unsigned, NO. OF CHANNELS = 1
    if(mat.empty()){
        return QImage();
    }
    if(mat.type() == CV_8UC1)
    {
        uchar *pSrc = mat.data;
        QImage image(pSrc, mat.cols, mat.rows, mat.cols, QImage::Format_Indexed8);
        // Set the color table (used to translate colour indexes to qRgb values)
        image.setColorTable(g_clrtable);

        return image;
    }
    else if(CV_16UC1 == mat.type()){
        cv::Mat mat256 = mat / 256;
        cv::Mat mat8;
        mat256.convertTo(mat8, CV_8UC1);
        QImage image(mat8.data, mat8.cols, mat8.rows, mat8.cols, QImage::Format_Indexed8);
        // Set the color table (used to translate colour indexes to qRgb values)
        image.setColorTable(g_clrtable);
        return image;
    }
    // 8-bits unsigned, NO. OF CHANNELS = 3
    else if(mat.type() == CV_8UC3)
    {
        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)
    {
        // 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 /*image.copy()*/;
    }
    else
    {
        qWarning() << "mat type unsupport:" << mat.type();
        return QImage();
    }
}

 

posted @ 2020-12-22 15:42  larkin-cn  阅读(205)  评论(0编辑  收藏  举报