вторник, 6 декабря 2011 г.

Лекции по обработке изображений

Заканчиваю читать краткий курс лекций по цифровой обработке изображений и компьютерному зрению в целом.

Слайды частично заимствованны у Антона Конушина из МГУ.

Может - кому нибудь поможет.

четверг, 15 сентября 2011 г.

PCL под MinGW

Пришлось помучится, но получилось собрать PCL под mingw!

Теперь исследования по обработке 3Д изображений пойдут вперед.

Итак, все по шагам.

1) Загружаем исходники PCL

2) Исходники Boost >= 1.46
Собирается запуском скрипта bootstrap, затем через командную строку надо зайти в директорию с бустом и набрать .\b2 toolset=gcc. Это сработает только в том случае, если MinGW в вашем пути!

3) Eigen 3.0.0

4) CMINPACK version >= 1.1.3
Здесь потребуется фортран для Mingw. Если его по умолчанию нет то можно загрузить с помощью утилиты mingw-get, командой mingw-get install fortran
Сконфигурированным в CMake а затем заходим в директорию командной строкой набиваем mingw32-make install

5) FLANN version >= 1.6.8
Чтобы собрать, видимо придется закоментить упоминание va_list в файлах logger.h и logger.cpp
Сконфигурированным в CMake а затем заходим в директорию командной строкой набиваем mingw32-make install

6) QHULL version >= 2011.1
Сконфигурированным в CMake а затем заходим в директорию командной строкой набиваем mingw32-make install

7) Далее приходится настраивать проект прописываем пути до собранных библиотек
Самое важное записать в поле Boost_LIB_DIAGNOSTIC_DEFINITIONS
-DBOOST_LIB_DIAGNOSTIC -DBOOST_THREAD_USE_LIB

Конфигурируем и генерируем файлы сборки и начинаем собирать! Всем удачи!

суббота, 23 июля 2011 г.

VLfeat

Недавно наткнулся на интересную библиотеку технического зрения VLfeat.
Данная библиотека активно разрабатывается научным сотрудником из Оксфорда Andrea Vedaldi и Brian Fulkerson, на ход данной работы сильно повлиял их соавтор довольно известный ученый Andrew Zisserman.

Библиотека открытая, кросс платформенная собирается под VS2008,MinGW. Не имеет внешних зависимостей.

Имеются два API: MATLAB и C.

Функционал довольно банален, но хорошо написанные примеры и совместимость с MATLAB делает из данной библиотеки хороший инструмент для прототипированния алгоритмов технического зрения, которые затем можно либо перенести на C++ с использованием данной библиотеки или OpenCV.

Теперь о функциональности библиотеки:
1. Нахождение инвариантных точек на изображении (SIFT,MSER,PHOW(SIFT на пирамиде изображений))
2. Кластеризация и поиск ближайшего соседа (K-means, kd-tree)
3. Алгоритмы машинного обучение (на самом деле реализован только SVM и функция для изменения ядра), но его вполне хватает.

При этом даны довольно интересные примеры:
1. Поиск гомографии
2. И индексация изображений

среда, 22 июня 2011 г.

Вышла OpenCV 2.3.0r

Что нового:
+ Встроенная поддержка videoInput (теперь при сборке под Windows можно использовать ieee1934 камеры)
+ Раздельная документация для C, C++ и Python
+ Примеры работы под Android
+ Новый шаблон для калибровки камеры
+ Поддержка OpenNI для работы с сенсором kinect прямо из OpenCV

- Неисправный инсталлятор для VS2008 (приходится собирать вручную)

Полный список

пятница, 3 июня 2011 г.

Преобразование cv::Mat в QImage

Очень удобно при разработке приложений по техническому зрению с графическем интерфейсом использовать OpenCV и Qt.

Но у некоторых людей возникают проблемы конвертировать изображения cv::Mat в QImage.

Итак, это очень просто вот функция:

/* Параметры: image - изображение которое хотим превратить в QImage
qim - уже загруженный в память буфер под данные. Может быть равен нулю.
Возвращает новое преобразованное в QImage с копированием данных
*/
QImage* createQImage(cv::Mat image,QImage* qim)
{
    if(!image.data)
     return 0;
    cv::Mat color;
    //Если один канал у изображения
    if(1==image.channels())
    {
        //Делаем трехканальное изображение. К сожалению разработчики Qt не учли возможность
        //рисования серых изображений
        color.create(cv::Size(image.cols,image.rows),CV_8UC3);
        std::vector ls;
        ls.push_back(image);
        ls.push_back(image);
        ls.push_back(image);
        cv::merge(ls,color);
    }else{
        color = image;
    }
    QImage*  pImage=0;
    if(0==qim)
    {
        pImage = new QImage(color.cols,color.rows,QImage::Format_RGB888);
    }else{
        if((qim->width()==color.cols)&&(qim->height()==color.rows))
        {
            pImage = qim;
        }else{
            delete qim;
            pImage = new QImage(color.cols,color.rows,QImage::Format_RGB888);
        }
    }

    //
    IplImage im = (IplImage)color;
    //По неизвестным причинам pImage->bytesPerLine() и im.widthStep могут не совпадать
    if(pImage->bytesPerLine()!=im.widthStep)
    {
        //Копирование по строкам
        for(int i=0;iheight();i++)
        {
            memcpy(pImage->bits()+i*pImage->bytesPerLine(),color.data+im.widthStep*i,im.widthStep);
        }
    }else{
        //Копирование всего изображения
        memcpy(pImage->bits(),color.data,im.imageSize);
    }
    return pImage;
}

Вот и все. Надею кому-то будет полезно!

понедельник, 14 февраля 2011 г.

Настройка проекта для компиляциями под разными операционными системами

Файл .pro, создаваемый программой QtCreator содержит инструкции как собирать проект основные команды
SOURCES - исходники
HEADERS - заголовки
TEMPLATE - шаблон проекта например app или lib
INCLUDEPATH - путь к используемым заголовкам
LIBS- используемые библиотеки

Так-же имеется куча дополнительных полезныхкомманд
CONFIG - это самое общая и полезная команда для автоматической конфигурации проекта в переменную конфиг можно записать все что угодно и дальше проверять что храниться в конфиге
Например CONFIG += plugin opencv qwt
MOC_DIR - директория куда будем складывать moc файлы, созданные qmake
OBJECTS_DIR - директория куда будут сохранены объекты
DEFINES - добавляет инструкцию препроцессора
Пример  DEFINES+= USEOPENCV
далее в коде:
#ifdef USEOPENCV
 //DO SMTH
#endif

ключевые слова
win32 - сборка происходит для Windows
unix - сборка проекта для Linux
debug - сборка проекта в режиме отладки
release - сборка проекта в релиз режиме

Рассмотрим пример подключение OpenCV для Linux и Windows
OPENCVDIR = "C:/Develop/opencv-1.0.x/opencv" #Директория в которой лежит OpenCV
win32:{ #Если сборка под windows
    opencv{ #если в CONFIG мы добавили CONFIG+=opencv
    exists($$OPENCVDIR) {#Проверка существует ли директория 
            DEFINES += USEOPENCV #Добавляем define
            INCLUDEPATH += $${OPENCVDIR}/cv/include \ #Путь к заголовкам
                $${OPENCVDIR}/cxcore/include \
                $${OPENCVDIR}/otherlibs/highgui
            LIBS += -L$${OPENCVDIR}/lib \ #Путь к библиотекам
                -lcv \
                -lcxcore \
                -lhighgui      
         }
    }
}
unix:{ #В случае Linux все проще т.к. все библиотеки и заголовки обычно лежат в системных папках
opencv{
        LIBS += -lcv \
            -lcxcore \
            -lhighgui
        message("OpenCV libraries connected")  #Сообщение о том что все подключено
    }
}

Естественно такой громоздкий код не охота включать в каждый проект (особенно если проект состоит из множества частей например с плагинами)

Для этого придуманы файлы .pri
Создаете файл .pri, копируете в него настройку сборки и подключаете к pro файлу коммандой
include
Пример:
include(EthoStudioSDK/ethostudioconfig.pri )

Вроде все. Удачи!

четверг, 10 февраля 2011 г.

Kinect Player

 A Cross Platform Application for recording/viewing 3d data from kinect sencor.


Source are avalable at http://code.google.com/p/kinect-player

Binaries form Win32 http://kinect-player.googlecode.com/files/kinect-player.zip


Чтобы собрать проект потребуется Qt 4.7.1, Qt Creator, OpenCV2.2 и Libfreenect (Все должны быть собраны одной версией MinGW)  сборка под Linux не должна вызвать проблем.
Программа позволяет записывать и просматривать 3д данные с сенсора Кинект. Вращать камеру вокруг сцены и т.д.
Рабочее окно программы

Тоже окно под другой перспективой



Иконка кинекта взята у
http://www.michaelcritz.com/2011/01/28/kinect-icon/