Передача cv :: Mat img между формами - PullRequest
2 голосов
/ 05 ноября 2011

У меня проблемы с передачей данных cv :: mat между формами в приложении qt gui, на данный момент я просто хочу передать выбранное пользователем изображение в главное окно и отобразить его на странице результатов

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 ++, поэтому прошу прощения за любые вопиющие ошибки.

Приветствия

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Посмотрите на мой ответ , включающий интеграцию OpenCV с более крупными приложениями. Я бы не рекомендовал использовать функцию highgui imshow внутри приложения Qt GUI. Это сделало некоторые странные вещи для меня в прошлом.

Как правило, вы можете преобразовать cv::Mat в QImage, а затем либо использовать QGLWidget, либо просто нарисовать его на QPixmap, если вам не нужна высокая скорость.

Что касается передачи объекта Mat между формами, вы можете либо преобразовать его в QImage, а затем использовать сигналы / слоты, как показано в моем примере, либо, если вам нужно больше манипулировать объектом Mat, вы можете создайте QMetaType . QMetaType позволит вам передавать его через формы так же, как и любой другой нативный объект Qt. Здесь - это пример Qt, с которого можно начать.

Надеюсь, что это полезно!

0 голосов
/ 05 ноября 2011

Возвращаемое значение get_Lateral отбрасывается - вам нужно либо изменить его на месте по ссылке:

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

или присвойте свой локальный объект cv :: Mat в main:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...