如何在C 和QT中的另一个窗口中显示MainWindow的结果图像



我当前正在从事QT创建者。我只想从Mainwindow中的硬盘驱动器浏览,然后将RGB颜色图像转换为灰色图像后,我想在另一个窗口中显示灰色图像。

通过单击"浏览"按钮,可以加载颜色图像,其中将应用颜色到灰色图像转换。这里grayImage是公共垫子类型变量。同时,将调用一个名为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中,我将垫子图像转换为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;
}

当我运行此程序时,没有编译错误,但是现在它在第二个窗口中显示任何图像。我无法弄清楚我的代码中是否有任何错误。如果有人能解决此问题,这将非常有帮助。预先感谢。

根据您的代码,您正在创建一个新的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位索引存储到colormap中的。

您要做的就是创建一个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()

相关内容

  • 没有找到相关文章

最新更新