OpenCV с другим GUI (как QT или WxWidgets) на Win32 VC ++

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

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

  1. Действительно ли необходимо сделать что-то для отключения higui OpenCV, таким образом, это не вмешивается в предпочтительную библиотеку GUI, и если так, как?

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

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

17
задан Jive Dadson 11 February 2010 в 13:59
поделиться

4 ответа

Хорошо. У меня есть ответ на свой вопрос по 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;
}
5
ответ дан 30 November 2019 в 14:33
поделиться

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

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

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

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

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

Удачи.

1
ответ дан 30 November 2019 в 14:33
поделиться

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

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

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

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

0
ответ дан 30 November 2019 в 14:33
поделиться

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

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

.
0
ответ дан 30 November 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: