Qt-OpenCV:如何在 Qt 中显示灰度图像(opencv)

Posted

技术标签:

【中文标题】Qt-OpenCV:如何在 Qt 中显示灰度图像(opencv)【英文标题】:Qt-OpenCV:How to display grayscale images(opencv) in Qt 【发布时间】:2011-09-30 05:01:12 【问题描述】:

我这里有一段代码。 这是一个使用 OpenCV 和 Qt(用于 GUI)的相机捕捉应用程序。

void MainWindow::on_pushButton_clicked()


    cv::VideoCapture cap(0);

    if(!cap.isOpened()) return;

    //namedWindow("edges",1);
    QVector<QRgb> colorTable;
    for (int i = 0; i < 256; i++) colorTable.push_back(qRgb(i, i, i));

    QImage img;
    img.setColorTable(colorTable);

    for(;;)
    
        cap >> image;
        cvtColor(image, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, cv::Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        //imshow("edges", edges);
        if(cv::waitKey(30) >= 0) break;

    // change color channel ordering
    //cv::cvtColor(image,image,CV_BGR2RGB);

    img =  QImage((const unsigned char*)(edges.data),
    image.cols,image.rows,QImage::Format_Indexed8);

    // display on label
    ui->label->setPixmap(QPixmap::fromImage(img,Qt::AutoColor));
    // resize the label to fit the image
    ui->label->resize(ui->label->pixmap()->size());   

    

最初“边缘”显示为红色,背景为绿色。然后切换为蓝色背景。这种切换是随机发生的。 如何以稳定的方式在黑色背景中显示白色边缘。

【问题讨论】:

确保您的操作不限于一个或两个通道,如果您创建 3 个通道的结果图像并操作一个,请确保您对其余两个通道执行此操作。或者最后创建一个单通道图像。 【参考方案1】:

简而言之,在// display on label评论之前添加img.setColorTable(colorTable);

有关更多详细信息,请在代码开头创建图像并影响颜色表:

QImage img;
img.setColorTable(colorTable);

然后在无限循环中,您正在执行以下操作:

img =  QImage((const unsigned char*)(edges.data), image.cols, image.rows, QImage::Format_Indexed8);

发生的情况是您破坏了在代码开头创建的图像,未设置此新图像的颜色映射,因此使用默认值导致彩色输出。

【讨论】:

以上是关于Qt-OpenCV:如何在 Qt 中显示灰度图像(opencv)的主要内容,如果未能解决你的问题,请参考以下文章

Qt-OpenCV学习笔记--读取视频--VideoCapture()

使用 Opencv 和 Qt 对两个灰度图像进行减法的使用条款

如何将opencv灰度和彩色图像发送到Qt中的ftp服务器?

qt 5 对图片解析

QT+QT creator+OpenCV图像灰度化

Qt 中彩色图像转换为灰度图