我在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 ++都是新手,所以我为任何明显的错误道歉。
干杯
答案 0 :(得分:1)
看看我的answer涉及将OpenCV与更大的应用程序集成。我不建议在Qt GUI应用程序中使用highgui imshow
函数。它在过去为我做了一些奇怪的事情。
基本上,您可以将cv::Mat
转换为QImage
然后使用QGLWidget
,或者只是简单地将其绘制到QPixmap
上,如果您不这样做的话特别需要高速。
至于在表单之间传递Mat
对象,您可以将其转换为QImage
然后使用信号/插槽,例如我的示例节目,或者如果您需要操纵Mat
进一步,你可以创建一个QMetaType。 QMetaType
允许您在表单中传输它,就像您使用任何其他本机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);
}