将cv :: mat转换为QImage

时间:2018-10-01 00:54:33

标签: c++ qt opencv qt5

就像标题一样,我正在尝试将cv :: mat转换为QImage。我正在做的是在垫子上使用equalizeHist()函数,然后将其转换为QImage以显示在Qt的小部件窗口中。我知道该垫子可以正常工作并正确加载图像,因为均衡后的图像将使用imshow()在新窗口中显示,但是当将该垫子转换为QImage时,我无法使其显示在窗口中。我相信问题出在从垫子到QImage的转换上,但找不到问题。以下是我的代码段的一部分。

Mat image2= imread(directoryImage1.toStdString(),0);
//cv::cvtColor(image2,image2,COLOR_BGR2GRAY);
Mat histEquImg;
equalizeHist(image2,histEquImg);
imshow("Histogram Equalized Image 2", histEquImg);
//QImage img=QImage((uchar*) histEquImg.data, histEquImg.cols, histEquImg.rows, histEquImg.step, QImage::Format_ARGB32);
imageObject= new QImage((uchar*) histEquImg.data, histEquImg.cols, histEquImg.rows, histEquImg.step, QImage::Format_RGB888);
image = QPixmap::fromImage(*imageObject);
scene=new QGraphicsScene(this); //create a frame for image 2
scene->addPixmap(image); //put image 1 inside of the frame
ui->graphicsView_4->setScene(scene); //put the frame, which contains image 3, to the GUI
ui->graphicsView_4->fitInView(scene->sceneRect(),Qt::KeepAspectRatio); //keep the dimension ratio of image 3

没有错误发生,程序不会崩溃。 预先感谢。

1 个答案:

答案 0 :(得分:1)

您的问题是QImage转换为cv::Mat,当在cv::imread中使用标记0表示读数为灰度时,并且您正在使用QImage::Format_RGB88 8格式的转换。我使用以下函数将cv::Mat转换为QImage

static QImage MatToQImage(const cv::Mat& mat)
{
    // 8-bits unsigned, NO. OF CHANNELS=1
    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);
        return 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);
        return img.rgbSwapped();
    }
    return QImage();
}

在那之后,我发现您对QGraphicsViewQGraphicsScene的工作方式有误解:将包含图片3的框架放入GUI ,并用{ {1}}您不是在设置框架而是在设置场景,该场景只能设置一次,最好在构造函数中设置。

ui->graphicsView_4->setScene(scene);

因此,当您要加载图像时,只需使用场景即可:

// constructor
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);

完整的示例可以在下面的link中找到。