C++ 在表单之间传递cv::Mat img
我在QtGUI应用程序的表单之间传递cv::mat数据时遇到问题,目前我只想在主窗口上传递用户选择的图像,并将其显示在结果页面上C++ 在表单之间传递cv::Mat img,c++,qt,opencv,C++,Qt,Opencv,我在QtGUI应用程序的表单之间传递cv::mat数据时遇到问题,目前我只想在主窗口上传递用户选择的图像,并将其显示在结果页面上 void MainWindow::on_pushButton_clicked() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.bmp)")); Lateral= cv::imread(fi
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文件中,我定义了以下内容(我尝试了该方法的一些变体):-
最后,在新表单上,我有如下内容:-
MainWindow Mw ;
cv::Mat op;
Mw.get_Lateral(op);
//(Mw.get_Posteroanterior()).copyTo(op);
cv::namedWindow("Lateral Image");
cv::imshow("Lateral Image",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);
}
当我运行此命令时,会出现运行时错误,因此我添加了一个if语句来检查cv::mat op的内容,如下所示:-
MainWindow Mw ;
cv::Mat op;
Mw.get_Lateral(op);
//(Mw.get_Posteroanterior()).copyTo(op);
cv::namedWindow("Lateral Image");
cv::imshow("Lateral Image",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++是相当新的,所以我为任何公开的错误道歉。<
Cheers正在丢弃get_横向的返回值-您需要通过引用对其进行适当修改:
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与更大的应用程序集成在一起的经历。我不建议在Qt-GUI应用程序中使用highguiimshow
函数。过去它为我做了一些奇怪的事情
基本上,您可以将cv::Mat
转换为QImage
,然后使用QGLWidget
,或者如果不特别需要高速,只需将其绘制到QPixmap
至于在表单之间传递Mat
对象,您可以将其转换为QImage
,然后像我的示例所示使用信号/插槽,或者如果需要进一步操作Mat
对象,您可以创建一个。QMetaType
将允许您像传输任何其他本机Qt对象一样跨表单传输它。这是一个让您开始学习的Qt示例
希望这是有帮助的谢谢你的回答,我试过了你的每一个建议,但他们都返回了DudieIdkOK——我不熟悉OpenCV,所以我只能找出纯C++错误。但是假设Lateral.copyTo按照tin上的说明执行,而op.data中的值仍然为空,我会检查Lateral.data是否也为空。不用担心,干杯。当新表单打开时,我可以打开侧面图像。我会尝试一下,并让您知道结果