【问题标题】:Passing cv::Mat img between forms在表单之间传递 cv::Mat img
【发布时间】:2011-11-05 12:38:40
【问题描述】:

我在 qt gui 应用程序的表单之间传递 cv::mat 数据时遇到问题,目前我只想在主窗口上传递用户选择的图像并将其显示在结果页面上

void MainWindow::on_pushButton_clicked() 
{
QString fileName = QFileDialog::getOpenFileName(this,
 tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.bmp)")); 
Lateral= cv::imread(fileName.toAscii().data());
}

在我定义的主窗口的头文件中:-

public:
   cv::Mat get_Lateral(cv::Mat img);
   cv::Mat get_Posteroanterior();

在 MainWindow.cpp 文件中,我定义了以下内容(我尝试了该方法的一些变体):-

cv::Mat MainWindow::get_Lateral(cv::Mat img ){
Lateral.copyTo(img);
return img;
}

cv::Mat MainWindow::get_Posteroanterior(){
return Posteroanterior;
} 

最后在新表格上我有这样的东西:-

 MainWindow Mw ;
cv::Mat op;
Mw.get_Lateral(op);
//(Mw.get_Posteroanterior()).copyTo(op);
cv::namedWindow("Lateral Image");
cv::imshow("Lateral Image",op);

当我运行它时,我得到一个运行时错误,所以我添加了一个 if 语句来检查 cv::mat op 的内容,如下所示:-

 MainWindow Mw ;
cv::Mat op;
Mw.get_Lateral(op);
//(Mw.get_Posteroanterior()).copyTo(op);
if (!op.data)
   cv::namedWindow("dud Image");
else{
cv::namedWindow("Lateral Image");
cv::imshow("Lateral Image",op);
}

我得到了暗示 op 为空的无效图像窗口。

任何关于如何正确执行此过程的建议都将受到赞赏,我对 opencv 和 c++ 还很陌生,因此对于任何明显的错误,我深表歉意。

干杯

【问题讨论】:

    标签: c++ qt opencv


    【解决方案1】:

    看看我的answer 涉及将 OpenCV 与更大的应用程序集成。我不建议在 Qt GUI 应用程序中使用 highgui imshow 函数。它过去曾为我做过一些奇怪的事情。

    基本上,您可以将cv::Mat 转换为QImage,然后使用QGLWidget,或者如果您不特别需要高速,只需将其绘制到QPixmap 上。

    至于在表单之间传递Mat 对象,您可以将其转换为QImage,然后像我的示例所示使用信号/插槽,或者如果您需要进一步操作Mat 对象,您可以创建一个QMetaTypeQMetaType 将允许您像传输任何其他本机 Qt 对象一样跨表单传输它。 Here 是一个 Qt 示例,可帮助您入门。

    希望对您有所帮助!

    【讨论】:

    • Chhers,我试试看结果告诉你
    【解决方案2】:

    get_Lateral 的返回值被丢弃 - 您需要通过引用对其进行修改:

    void MainWindow::get_Lateral(cv::Mat& img ){
    Lateral.copyTo(img);
    //return img;
    }
    

    或在 main: 中分配回您的本地 cv::Mat 对象:

    MainWindow Mw ;
    cv::Mat op;
    op = Mw.get_Lateral(op);
    //(Mw.get_Posteroanterior()).copyTo(op);
    if (!op.data)
       cv::namedWindow("dud Image");
    else{
    cv::namedWindow("Lateral Image");
    cv::imshow("Lateral Image",op);
    }
    

    【讨论】:

    • 感谢您的回复,我尝试了您的每一个建议,但他们都返回了无效图像
    • 好的 - 我不熟悉 opencv,所以我只能发现纯 C++ 错误。但是假设 Lateral.copyTo 做到了它在锡上所说的,并且你仍然在 op.data 中得到 null,我会检查lateral.data 是否也是 null
    • 别担心,干杯。打开新表单时,我可以打开横向图像
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多