Показ изображения с использованием OpenCV 2.2 на платформе Linux Ubuntu с Qt - PullRequest
4 голосов
/ 02 марта 2011

Привет, ребята, я использую Qt в качестве своей платформы C ++ IDE через Ubuntu 10.10 с OpenCV 2.2.Я просто напишу кусочки кода и покажу, в чем проблема:

#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main(int argc, char *argv[])
{       
    VideoCapture cap = VideoCapture(0);
    Mat frame;
    do
    {
        cap >> frame;
        imshow("frame",frame);
    } while (waitKey(10) != 27);
    return 0;
}

Я получаю 3 распечатки с предупреждением, которые выглядят примерно так:

VIDIOC_QUERYMENU: Invalid argument

И все вроде бы нормально(камера работает).

Мне пришлось добавить использование Qt и добавить 3 строки кода, и это выглядит так:

#include <QApplication>
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);       
    VideoCapture cap = VideoCapture(0);
    Mat frame;
    do
    {
        cap >> frame;
        imshow("frame",frame);
    } while (waitKey(10) != 27);

    return app.exec();
}

Я все еще получаю 3 строки предупреждения, нотеперь окно «рамка» серое, и ничего не отображается.

Я впервые использую Qt, поэтому я не знаю, как это работает.Я могу только догадываться, что QApplication получает контроль над управлением окнами, что приводит к тому, что команда imshow не может открыть новое окно.

Буду признателен за вашу помощь, THNX!

Ответы [ 4 ]

2 голосов
/ 02 марта 2011

Ваше предположение неверно.OpenCV будет иметь свое собственное соединение с X-сервером и не будет зависеть от управления окнами Qt (однако обработка ввода waitKey () и app.exec () не будут работать параллельно).

Я также тестировал подобноекод, чтобы обнаружить любые непредвиденные побочные эффекты.Все окна хорошо рисуются на моей машине Debian с OpenCV 2.2 и Qt 4.6.2.

Тривиальным тестом на вашей стороне может быть создание объекта приложения сразу после цикла while.Тем не менее, это может быть просто случайное изменение в макете вашего стека, что привело к серьезным проблемам с вашими предупреждениями?Вы также должны проверить с Valgrind.

1 голос
/ 02 марта 2011

Вы не можете смешивать контроль openCV за циклом событий и qt's app.exec

Либо используйте Qt-вариант cvNamedWindow, либо просто получите изображения из openCV и отобразите их в QLabel.Или лучше наследовать от QWidget и написать свой собственный художник QImage

void OpencvWidget::paintEvent(QPaintEvent*)
{
    //m_win is the window size
    QPainter p(this);                           
    p.drawImage(m_win,m_image,m_image.rect());

}
1 голос
/ 02 марта 2011

Ваша проблема в том, что Qt обрабатывает свой собственный цикл обработки событий, и, таким образом, цикл обработки событий OpenCV заканчивается и никогда не запускается.

Способ заставить их работать вместе довольно прост: отобразите ваш OpenCV как QPixmap (преобразовав ваше изображение в QImage, затем используйте QLabel для его отображения). Затем добавьте этот QLabel в свой QWidget. Ваш QWidget может быть либо встроенным, либо стать основным виджетом вашего QApplication.

Чтобы использовать буфер вашего изображения cv :: Mat в качестве QImage, посмотрите этот ответ Как преобразовать opencv cv :: Mat в qimage

Чтобы отобразить этот QImage, см. Отображение QImage с QtGui

1 голос
/ 02 марта 2011

Недавно я столкнулся с подобной проблемой (отображение информации с веб-камеры с использованием OpenCV и Qt в качестве окончательного графического интерфейса). Лучший способ воспроизвести видео (в основном это набор изображений) - использовать GLWidget. В этом GLWidget вы можете создать прямоугольник и прикрепить к нему текстуру, где текстура - это изображение, которое вы хотите показать. Другая проблема заключается в том, что формат изображения отличается для OpenCV и OpenGL, но вы можете легко изменить формат, изменив порядок каналов.

В своем коде вы создаете приложение QApplication, которое имеет собственный процесс ожидания, поэтому вы никогда не достигнете цикла while. Вы также не создали никакого окна отображения Qt, я рекомендую вам проверить примеры, которые поставляются с Qt, чтобы проверить базовую структуру приложения и начать с QMainWindow или QDialog.

Шаги:

  1. Создайте свое главное окно ( QDialog - это то, что я использовал).
  2. Создайте GLWidget и добавьте его в макет вашего Dialog / MainWindow.
  3. Получить изображение из OpenCV и преобразовать его в формат, который OpenGL отображает правильно.
  4. Используя OpenGL, создайте прямоугольник и прикрепите изображение в качестве текстуры .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...