Подтвердить что ты не робот

OpenCV с другим графическим интерфейсом (например, Qt или WxWidgets) на Win32 VС++

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

Я думаю, это ломается до двух или трех вопросов:

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

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

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

4b9b3361

Ответ 1

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

В приведенном ниже коде на С++ изображения 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;
}

Ответ 2

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

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

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

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

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

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

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

(начните самостоятельный запуск)

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

(end self plug)

Ответ 3

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

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

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

Если вы не найдете то, что ищете в этом потоке, вы можете начать новый.

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

Удачи.

Ответ 4

Ну, я ничего не знаю о OpenCV, но я хорошо работаю с wxWidgets.

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

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

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

Ответ 5

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

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