OpenCV с другим графическим интерфейсом (например, Qt или WxWidgets) на Win32 VC ++ - PullRequest
17 голосов
/ 06 февраля 2010

Я хочу использовать функции обработки изображений OpenCV, но не графический интерфейс OpenCV. Я использую OpenCV 2.0. Я буду использовать Qt4 или WxWidgets для функций GUI. Я компилирую с VC ++ 2008 Express (VC ++ 9.0).

Я полагаю, это разбивается на два или три вопроса:

  1. Нужно ли что-то делать, чтобы отключить Higui OpenCV, чтобы он не мешал работе предпочитаемой библиотеки GUI, и если да, то как?

  2. Как преобразовать изображение OpenCV в нечто (растровое изображение?), Которое предпочтительный графический интерфейс может отображать (и, возможно, сохранять)?

  3. (Необязательно) Как преобразовать изображение, которое было загружено с использованием предпочтительного интерфейса, в форму, которую может использовать OpenCV?

Ответы [ 5 ]

5 голосов
/ 06 марта 2012

Я знаю, что опоздал на эту дискуссию, но я только что натолкнулся на нее.В любом случае, я уже несколько лет довольно счастливо использую OpenCV и wxWidgets вместе, так что я решил добавить:

Нужно ли что-то сделать, чтобы отключить Higui в OpenCV, чтобы он это делал?не мешать работе предпочтительной библиотеки GUI, и если да, то как?

Не обычно.Есть несколько ошибок, с которыми вы можете столкнуться для определенных версий OpenCV и Windows.По большей части, однако, интеграция очень гладкая.Я обычно использую wx для моего внешнего интерфейса и частей highgui, которые позволяют захватывать изображения.Я сделал это на нескольких версиях Windows, Ubuntu и OS X.

Как преобразовать изображение OpenCV в нечто (растровое изображение?), Которое предпочитаемый графический интерфейс может отображать (и, возможно, сохранять)?

Альтернативой копированию вперед-назад между wxImage является вставка данных IplImage непосредственно в текстуру OpenGL и рисование их на wxGLCanvas.Одним из больших преимуществ этой стратегии является то, что вы можете рисовать поверх текстуры, используя стандартные методы OpenGL.

(Необязательно) Как преобразовать изображение, которое было загружено с использованием предпочтительного интерфейса, в форму, котораяOpenCV может использовать?

Не :) Я использую wxFileDialog и т. Д., Чтобы позволить пользователю указывать пути, но весь бэкэнд является непосредственно OpenCV.

(начните самостоятельно подключать)

Код, который я написал для многих из них, является частью проекта под названием MADTraC , который представляет собой графический интерфейс / каркас приложений для приложений компьютерного зрения в реальном времени.

(концевой штекер)

5 голосов
/ 11 февраля 2010

Хорошо. У меня есть ответ на мой собственный вопрос для WxWidgets. Один из ключей - не бороться с мэрией openCV за последовательность RGB. OpenCv действительно любит "BGR". WxWidgets использует только «RGB». Структура данных opencv имеет поле для последовательности байтов, но это редко соблюдается. Даже функция highGui (в MS Windows), которая отображает изображение, будет создавать эффектно синие мандарины, если последовательность байтов установлена ​​в «RGB». Я упорно зафиксировано, что ошибка в моей локальной установки, но и другие операции, не удалось также. Итак, я просто вздыхаю и устанавливаю порядок байтов на стороне opencv в «BGR» и выполняю замену байтов по мере необходимости.

Приведенный ниже код C ++ требует, чтобы изображения openCV, которые он преобразует в wxImages, были RGB, последовательностью «BGR», 8-битной глубиной и 3 чередующимися каналами и имели width_step = width * 3. Процедуры не проверяют совместимость. Используйте на свой страх и риск. Готовая для прайм-тайма версия будет предусматривать области интереса (ROI) и другие причудливые.

#include "wx/wx.h"
#include "cv.h"
#include "highgui.h" // Optional


void copy_and_swap_rb(char *s, char *d, int size) {
    // Copy image data source s to destination d, swapping R and B channels.
    // Assumes 8 bit depth, 3 interleaved channels, and width_step = width*3
    const int step = 3;
    char *end = s + size;
    while (s<end) {
        d[0] = s[2];
        d[1] = s[1];
        d[2] = s[0];
        d += step; s += step;   
    }
}

void wx2cv(wxImage &wx, IplImage *ipl) {
    // Copy image data from wxWidgets image to Ipl (opencv) image
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and 
    // has the same size as the wxImage, and width_step = width*3.
    copy_and_swap_rb((char*)wx.GetData(), ipl->imageData, ipl->imageSize);
}

void cv2wx(IplImage *ipl, wxImage &wx ) {
    // Copy image data from Ipl (opencv) image to wxImage
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels, and 
    // has the same size as the wxImage, and width_step = width*3.
    copy_and_swap_rb( ipl->imageData, (char*)wx.GetData(),   
                      wx.GetWidth()*wx.GetHeight()*3);
}

IplImage *cv_from_wx(wxImage &wx) {
    // Return a new IplImage copied from a wxImage. 
    // Must be freed by user with cvReleaseImage().
    IplImage *ret = cvCreateImage(cvSize(wx.GetWidth(), wx.GetHeight()), 
                                  IPL_DEPTH_8U, 3);
    wx2cv(wx, ret);
    return ret;
}

wxImage wx_from_cv( IplImage *cx) {
    // Return new wxImage copied from a compatible IplImage.
    // Assumes ipl image has seq "GBR", depth 8, and 3 channels
    // Fear not. The copy on return is cheap; does not deep-copy the data.
    wxImage wx(cx->width, cx->height, (unsigned char*) malloc(cx->imageSize), false);
    cv2wx(cx, wx);
    return wx;
}
1 голос
/ 06 февраля 2010

Нужно ли что-то делать, чтобы отключить Higui OpenCV, чтобы он не мешал работе предпочитаемой библиотеки GUI, и если да, то как?

Ответ: Я не понимаю, почему это не должно быть выполнимо или это плохо спроектированная библиотека (а я не думаю, что это OpenCV).

Что касается других ваших вопросов (и «Как» вопроса 1), я сделал быстрый поиск по QtCentre и нашел интересную ветку об интеграции OpenCV с Qt . Есть несколько примеров исходного кода, которые вы можете посмотреть.

Если вы не нашли то, что искали в этой теме, вы можете начать новую.

Или Google для Интеграция OpenCV в Qt или поиск по коду Google, есть некоторые проекты, использующие и Qt, и OpenCV ( OpenCV Stereo Vision - это один ).

Удачи.

0 голосов
/ 10 февраля 2010

Я добился небольшого прогресса. GUI-часть OpenCV, кажется, осталась в стороне. Я даже использовал его в приложении WxWidgets, чтобы показать изображение, и ничего плохого, похоже, не произошло. Это было в Windows XP с использованием VC ++ 2008. Единственное взаимодействие, которое OpenCV / highGUI, по-видимому, имеет с оконной системой, - это делать прямые вызовы Windows API и отслеживать очередь событий на события клавиатуры, которые она передает.

Я работаю над тем, как конвертировать изображения OpenCV в изображения WxWidgets и обратно. Большая помощь вам, ребята. : -)

0 голосов
/ 06 февраля 2010

Ну, я мало что знаю об OpenCV, но я много работаю с wxWidgets.

Я настоятельно рекомендую wxWidgets просто из-за его интуитивно понятной структуры и структуры кода.

Кроме того, QT доступен только под LGPL для Windows, поэтому может возникнуть проблема с лицензированием. wxWidgets можно использовать в коммерческих проектах без ограничений.

Что касается преобразования изображений туда и обратно, wxWidgets имеет большое количество классов / функций для работы с изображениями.

...