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 对两个灰度图像进行减法的使用条款