在表单之间传递cv :: Mat img

时间:2011-11-05 12:38:40

标签: c++ qt opencv

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

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

我得到了dud图像窗口,暗示op是空的。

有关如何正确执行此过程的任何建议都会被批准,我对opencv和c ++都是新手,所以我为任何明显的错误道歉。

干杯

2 个答案:

答案 0 :(得分:1)

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

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

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

希望有帮助!

答案 1 :(得分:0)

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