C++ opencv Mat 到 QPixmap 错误

标签 c++ qt opencv mat qpixmap

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

三分之一的时间它有效。

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

enter image description here

成为

enter image description here

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

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

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);
}

最佳答案

以下是我通常用来将cv::Mat转换为QPixmapQImage:

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);
}

关于C++ opencv Mat 到 QPixmap 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724457/

相关文章:

java - Java OpenCV无法从MatOfInt4复制到MatOfInt4

类中的c++动态结构

c++ - 从函数返回一个 tm* 结构数组

c++ - 如何在 Qt 5 的 paintEvent 上使用 mouseMoveEvent?

c++ - 如何在 Linux (Ubuntu) 中调整 Qt Creator for VTune Amplifier

python - 将代码中的输出图像保存到系统中而无需在 python 中截屏

c++ - 在终端中正确输出 c++ windows wstring 日志

c++ - #为不同的上下文定义 “static”的宏

c++ - 在 Qt 中使用正则表达式查找两个标签之间的字符串

opencv - OpenCV:基本矩阵精度