我在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++相当陌生,因此我为任何明显的错误道歉。
干杯
发布于 2011-11-05 23:12:45
看看我的涉及将OpenCV与更大的应用程序集成在一起的answer。我不推荐在Qt应用程序中使用highgui imshow函数。在过去,它为我做了一些奇怪的事情。
基本上,您可以将cv::Mat转换为QImage,然后使用QGLWidget,或者如果您不是特别需要高速,则只需将其绘制到QPixmap上。
至于在表单之间传递Mat对象,您可以将其转换为QImage,然后使用信号/槽,如我的示例所示,或者如果您需要进一步操作Mat对象,则可以创建一个QMetaType。QMetaType将允许您像传输其他原生Qt对象一样跨表单传输它。Here是一个Qt示例,可以帮助您入门。
希望能对大家有所帮助!
发布于 2011-11-05 20:44:42
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);
}https://stackoverflow.com/questions/8020210
复制相似问题