如何在C++和QT中将主窗口的结果图像显示在另一个窗口中?

3
我目前正在使用Qt Creator工具。我想在主窗口中通过浏览硬盘来获取一张图片,并将RGB彩色图像转换为灰度图像,然后在另一个窗口中显示灰度图像。
点击“浏览”按钮可以加载彩色图像,接着将应用颜色到灰度图像的转换。这里,`grayImage`是一个公共的`Mat`类型变量。同时,将调用名为`SecondDialog`的另一个窗口实例进行执行。
void MainWindow::on_Browse_clicked()
{
    QFileDialog dialog(this);
    dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg)"));
    dialog.setViewMode(QFileDialog::Detail);
    fileName = QFileDialog::getOpenFileName(this, tr("Open Images"), "/home/rpi/Desktop/Picture/Sample Pictures", tr("Image Files (*.png *.jpg *.bmp)"));
    if (!fileName.isEmpty())
    {
        String image_path=fileName.toLocal8Bit().constData();
        Mat image= imread(image_path);
        cvtColor(image, grayImage, CV_BGR2GRAY);
        SecondDialog obj;
        obj.setModal(true);
        obj.exec();
    }
}

在 seconddialog.cpp 中,我已经将 Mat 图像转换为 QImage 并显示在名为 label_img 的 QLabel 上。
SecondDialog::SecondDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SecondDialog)
{
    ui->setupUi(this);    
    MainWindow object;
    Mat src= object.grayImage;
    Mat temp(src.cols,src.rows,src.type());
    QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
    dest.bits();
    ui->label_img->setPixmap(QPixmap::fromImage(dest));
}
SecondDialog::~SecondDialog()
{
    delete ui;
}

当我运行这个程序时,没有编译错误,但第二个窗口中没有显示任何图像。 我无法确定我的代码是否有错误。如果有人能解决这个问题,那将非常有帮助。 提前致谢。

我刚刚按照你的解决方案尝试了一下,但仍然没有显示。 - Gansroy
我刚刚将此添加到我的 Github 账户中。您可以在以下链接 github.com/ashraful100/DisplayImage 找到这些程序。再次感谢您。 - Gansroy
1个回答

1
根据你的代码,你正在创建一个类型为MainWindow的新对象:
[...]
ui(new Ui::SecondDialog)
{
ui->setupUi(this);    
MainWindow object;
[...]

这里的 grayImage 属性为空,因此您会得到这种行为。

另一个问题是您使用的格式,必须从 QImage::Format_RGB888 更改为 QImage::Format_Indexed8

Format_RGB888:图像使用 24 位 RGB 格式(8-8-8)存储。

Format_Indexed8:图像使用 8 位索引存储到颜色映射中。

您需要创建一个 setter 方法并将图像传递给新窗口,为此,您必须执行以下操作:

SecondDialog.h

public:
    void setImage(const Mat &image);

SecondDialog.cpp

SecondDialog::SecondDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SecondDialog)
{
    ui->setupUi(this);    
}

void SecondDialog::setImage(const Mat &image){
    QImage dest((const uchar *) image.data, image.cols, image.rows, image.step, QImage::Format_Indexed8);
    ui->label_img->setPixmap(QPixmap::fromImage(dest));
}

最终,在MainWindow.cpp中应运行以下内容:
void MainWindow::on_Browse_clicked()
{

    QFileDialog dialog(this);
    dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg)"));
    dialog.setViewMode(QFileDialog::Detail);
    fileName = QFileDialog::getOpenFileName(this,
        tr("Open Images"), "/home/rpi/Desktop/Picture/Sample Pictures", tr("Image Files (*.png *.jpg *.bmp)"));
    if (!fileName.isEmpty())
    {
        String image_path=fileName.toLocal8Bit().constData();
        Mat image= imread(image_path);
        cvtColor(image, grayImage, CV_BGR2GRAY);
        SecondDialog obj;
        obj.setImage(grayImage);
        obj.setModal(true);
        obj.exec();
    }

}

编辑:

在我的情况下,我使用以下函数将cv::Mat转换为QImage

# https://github.com/eyllanesc/Mirosot-Peru/blob/master/Mirosot-PC/MatToQImage.cpp
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();
    }
    else
    {
        qDebug() << "ERROR: Mat could not be converted to QImage.";
        return QImage();
    }
} // MatToQImage()

谢谢您的回答。我也尝试了这些修改。但不幸的是,它仍然没有显示灰度图像。您能解释一下为什么MainWindow有一个空的grayImage吗? - Gansroy
你可以分享你的项目,以便通过Google Drive、Dropbox、Github或类似的方式帮助你,并给你一个完全测试过的响应。 - eyllanesc
我刚刚将这个程序添加到我的Github账户中。程序可以在以下链接中找到:https://github.com/ashraful100/DisplayImage 再次感谢。 - Gansroy
哦,真的,现在它运行良好。非常感谢您的即时帮助。 - Gansroy
@Gansroy 如果我的回答对您有帮助,请不要忘记将其标记为正确的答案。 - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接