Я хочу использовать функции обработки изображений OpenCV, но не OpenCV GUI. Я использую OpenCV 2.0. Я буду использовать или Qt4 или WxWidgets для функций графического интерфейса пользователя. Я компилирую с VC ++ Экспресс 2008 года (VC ++ 9.0).
Я предполагаю, что это ломается к двум или трем вопросам:
Действительно ли необходимо сделать что-то для отключения higui OpenCV, таким образом, это не вмешивается в предпочтительную библиотеку GUI, и если так, как?
Как преобразовать изображение OpenCV во что-то (битовый массив?), который предпочтительный GUI может отобразить (и возможно сохранить)?
(Дополнительно), Как преобразовать изображение, которое было загружено с помощью предпочтительного интерфейса в форму, которую может использовать OpenCV?
Хорошо. У меня есть ответ на свой вопрос по 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;
}
Нужно ли что-то делать, чтобы отключить максимум OpenCV, чтобы он не вмешивался в предпочитаемую библиотеку GUI, и если да, то как?
Ответьте: Я не понимаю, почему это не должно быть выполнимо или это плохо спроектированная библиотека (которой, я думаю, не является OpenCV).
Для остальных ваших вопросов (и "Как" из вопроса 1) я провел быстрый поиск по QtCentre и нашел интересный поток об интеграции OpenCV с Qt. Есть несколько примеров исходного кода, на которые вы можете посмотреть.
Если вы не найдете то, что ищете в этом потоке, вы можете начать новый поток.
Или google для интеграции OpenCV в Qt или поиска в Google Code, есть несколько проектов использующих как Qt, так и OpenCV (OpenCV Stereo Vision это один).
Удачи.
Я мало что знаю об OpenCV, но я много работаю с wxWidgets.
Я настоятельно рекомендую wxWidgets просто из-за его интуитивно понятной структуры и разметки кода.
Кроме того, QT доступен только под LGPL в Windows, поэтому лицензирование может быть проблемой. wxWidgets можно использовать в коммерческих проектах без ограничений.
Что касается конвертации изображений туда и обратно, wxWidgets имеет большое количество классов / функций для работы с изображениями.
Я добился небольшого прогресса. GUI-часть OpenCV, похоже, остается в стороне. Я даже использовал его в приложении WxWidgets для показа изображения, и ничего плохого не произошло. Это было на компьютере под управлением Windows XP с использованием VC++ 2008. Единственное взаимодействие OpenCV/highGUI с оконной системой - это прямые вызовы Windows API и мониторинг очереди событий для клавиатурных событий, которые он передает дальше.
Я работаю над тем, как конвертировать изображения из OpenCV в изображения WxWidgets и обратно. Вы мне очень помогли, ребята :-)
.