首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ opencv Mat to QPixmap错误

C++ opencv Mat to QPixmap错误
EN

Stack Overflow用户
提问于 2017-08-17 07:32:09
回答 1查看 1.1K关注 0票数 3

我正在尝试编写一个函数,将灰度OpenCv垫放入Qt QPixmap中,然后放入QLabel中。

有三分之一的时间是有效的。

有三分之一的时间,它会扭曲图像...

变成了

在其余时间,程序会崩溃,特别是在fromImage()行上。

我知道传入的Mat对象在每种情况下都是灰度和非空的。下面是有问题的代码...

代码语言:javascript
复制
void MainWindow::updateCanvasLabel(Mat mat){

    imwrite("c:/pics/last-opened.jpg", mat); //to verify that Mat is
                                             // what I think it is

    QPixmap pixmap = QPixmap::fromImage(QImage((unsigned char*) mat.data,
                               mat.cols,
                               mat.rows,
                               QImage::Format_Grayscale8)); 

    ui->canvasLabel->setPixmap(pixmap);
    ui->canvasLabel->setScaledContents(true);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-17 07:57:04

下面是我通常用来将cv::Mat转换为QPixmapQImage的代码

代码语言:javascript
复制
void MainWindow::updateCanvasLabel(Mat mat){

    QPixmap pixmap;
    if(mat.type()==CV_8UC1)
    {
        // Set the color table (used to translate colour indexes to qRgb values)
        QVector<QRgb> colorTable;
        for (int i=0; i<256; i++)
            colorTable.push_back(qRgb(i,i,i));
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
        img.setColorTable(colorTable);
        pixmap = QPixmap::fromImage(img);
    }
    // 8-bits unsigned, NO. OF CHANNELS=3
    if(mat.type()==CV_8UC3)
    {
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        pixmap = QPixmap::fromImage(img.rgbSwapped());
    }
    else
    {
        qDebug() << "ERROR: Mat could not be converted to QImage or QPixmap.";
        return;
    }

    ui->canvasLabel->setPixmap(pixmap);
    ui->canvasLabel->setScaledContents(true);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45724457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档