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

2023-11-30

我目前正在研究 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();
    }
}

在第二个dialog.cpp中,我已将Mat图像转换为QImage以显示在名为的QLabel上label_img

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 to QImage::Format_Indexed8.

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

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

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

第二个对话框.h

public:
    void setImage(const Mat &image);

第二个对话框.c++

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();
    }

}

Edit:

就我而言,我使用以下函数来进行转换cv::Mat to 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • WIX 启用 Windows 功能

    在安装软件之前 我必须检查某些 Windows 功能是否已启用 我可以使用 dism 命令行工具检查或安装它 我创建了一个自定义操作来执行此操作 但是有没有办法以 WIX 本机方式 执行此操作
  • Python正则表达式搜索句子中的单词

    我仍在学习 Python 和正则表达式的诀窍 我需要一些帮助 我需要一个可以在句子中搜索特定单词的正则表达式 我已经成功创建了一个模式来搜索单个单词 但是如何检索我需要查找的其他单词 重新模式会是什么样子来做到这一点 gt gt gt qu
  • 带有 FlowLayout 小部件的 QScrollArea 无法正确调整大小

    我想创建一个类似于 KDE 或 Gnome 或 MacOS 系统设置的小部件 例如 像这张图片 我已经实现了 FlowLayoutQt 文档示例 如果我将一些 FlowLayout 小部件 用 QVBoxLayout 包装在容器小部件中 放
  • Javascript字符串替换不起作用[重复]

    这个问题在这里已经有答案了 所以我有一个字符串 房间描述 并且想替换部分
  • 如何尝试解析枚举值?

    我想编写一个函数 它可以根据给定值 作为字符串传递 验证可能的值enum 如果匹配 它应该返回枚举实例 否则 它应该返回默认值 该函数不能在内部使用try catch 这排除了使用Enum Parse 当给出无效参数时会引发异常 我想使用类
  • jquery click() 事件不适用于附加的 html 标签

    在我的问题有意义之前 我需要解释一些事情 在我的第一页上 我有一个主 div 我在其中使用 jquery load 方法从另一个页面加载标记 我正在加载的 html 链接到我的脚本所在的 js 页面 js 页面是我操作主 div 内容的地方
  • 通过 NSStream 在 iOS 设备之间发送后解析数据

    我有一个应用程序设置为在两个 iOS 设备之间发送数据NSStream通过 TCP 连接 发送的数据由两部分组成 一个整数 指示即将到来的消息对象的大小 消息对象 一些NSStrings and an NSData使用 NSKeyedArc
  • 如何更改 FireFox 中悬停选择选项的颜色

    我想更改 FireFox 中悬停的选择选项的颜色 它具有默认的蓝色背景和白色前景 我试过
  • Azure 数据工厂中没有管道图

    我使用复制数据向导创建了 2 个管道 但当我单击 图表 操作时 两个管道都没有显示 我收到消息 该工厂不包含管道或数据集 管道均成功运行 并且在单击 管道 边栏选项卡时确实会显示 两条管道均配置为一次性 关于为什么会发生这种情况以及如何解决
  • int(11) 与 int(任何其他)

    我是网络编程新手 正在做一些可以在网上找到的不同教程 我进行了研究 发现在 int 11 中 11 是整数的最大显示宽度 并且它是默认值 除非整数是 UNSIGNED 在本例中为 10 当我看到这样的东西时 id INT 11 not nu
  • 如何使用 asp.net 在 Chrome 中删除或过期 cookie

    这是那些愚蠢的问题之一 答案应该很简单 但似乎不起作用 有人知道我还能去哪里寻找代表吗 我在单击按钮时添加 cookie var impersonationCookie new HttpCookie UserImp ImpAuid impe
  • 从函数返回值,其中 ipython 小部件用于获取输入参数

    我正在尝试 小部件化 我的 IPython 笔记本 但在事件和函数返回值方面遇到了麻烦 这是我认为最好的工作流程 使用小部件获取任意函数的输入值 在事件触发时调用该函数 从函数返回值 我首先尝试使用 interact 方法来调用该函数 但这
  • 有没有办法在构造函数中使用锁定的标准输入和输出,使其与您正在构造的结构一样长?

    我正在建造一个PromptSet可以连续提出一系列问题 出于测试原因 它允许您传递读取器和写入器 而不是直接使用标准输入和标准输出 因为 stdin 和 stdout 是常见的用例 所以我想创建一个默认的 构造函数 允许用户生成一个Prom
  • 如何将 div 标签附加到 SVG 矩形元素中?

    我找不到这个问题的正确解决方案 所以我决定写一个新问题 我什至不确定这是否可能 但我希望如此 这是浏览器提供的 HTML 我从浏览器中的 元素 选项卡复制它
  • 如果 ModelState.IsValid 失败,收到错误消息吗?

    我的控制器中有这个功能 HttpPost public ActionResult Edit EmployeesViewModel viewModel Employee employee GetEmployee viewModel Emplo
  • JAVA .properties 文件

    有一个小问题 我创建了一个属性文件 config properties 位于 resource config properties 这是当前的文件 destinationPDF D Documents NetBeansProjects pr
  • 不同DBMS之间的数据迁移

    因为我无法得到任何满意的答案Question看来我们必须为此编写自己的程序 我们正处于设计阶段 我们正在考虑应该使用哪种格式来备份数据 该程序将用Delphi 编写 需要在 Oracle Informix Msserver 之间导出 导入数
  • 绝对 URL 无 Cookie

    ASP NET 中是否有某种方法可以通过无 Cookie 会话获取绝对 URL 更新 我需要创建其他新的 URL 这不是请求的 URL 我正在使用 Response ApplyAppPathModifier 来获取带有 cookie 会话的
  • 编译器错误消息:无法将类型“long”隐式转换为“string”

    我在转换方面遇到问题 这个转换有什么问题吗 这是错误 编译错误说明 在编译服务此请求所需的资源期间发生错误 请查看以下具体错误详细信息并适当修改您的源代码 编译器错误消息 CS0029 无法将类型 long 隐式转换为 string if
  • 如何在C++和QT中的另一个窗口中显示主窗口的结果图像?

    我目前正在研究 Qt Creator 我想通过在主窗口中从硬盘浏览来获取图像 然后将 RGB 彩色图像转换为灰度图像后 我想在另一个窗口中显示灰度图像 通过单击 浏览 按钮 可以加载彩色图像 其中将应用彩色到灰度图像转换 这里grayIma