вторник, 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/

вторник, 8 февраля 2011 г.

Преобразование картинки из Libfreenect в cv::Mat

Решил написать маленькую заметку по поводу использования libfreenect и ее варпера для c freenect_sync

Mat frame;
frame.create(cv::Size(640,480),CV_8UC3);
Mat depth;
depth.create(cv::Size(640,480),CV_16UC1);
uint32_t ts;
char *rgb = 0;
short *depths=0;
freenect_sync_get_video((void**)&rgb,&ts,0,FREENECT_VIDEO_RGB);
freenect_sync_get_depth((void**)&depths, &ts, 0, FREENECT_DEPTH_11BIT);
memcpy(frame.data,rgb,FREENECT_VIDEO_RGB_SIZE);
memcpy(depth.data,depths,FREENECT_DEPTH_11BIT_SIZE);

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

Компрессор для Kinect данных

Задача: сохранить цветное изображение RGB (24 бита на пиксель) + глубинное изображение 16 бит на пиксель. Изображения сохраняются в файл (глубинное изображение - без потерь PNG компрессором), цветное с потерями JPEG компрессором.

Для решения использовались функции из библиотеки OpenCV 2.2.

Полный исходный код проекта доступен по ссылке.

воскресенье, 23 января 2011 г.

Текущие работы

Решил написать о том какие проекты сейчас идут в лаборатории цифровой обработки изображений ИАиЭ СО РАН.

EthoStudio - система для автоматизации этологических экспериментов. Применяется для изучения эффектов различных препаратов на животных. Интерфейс разработан на Qt, содержание использует OpenCVи другие бесплатные открытые библиотеки.
Сайт проекта временно находится в разработке www.ethostudio.com
Применяется в: ИЦиГ СО РАН, ЛИН СО РАН, институте физиологии им. Павлова РАН.
Скриншот программы EthoStudio




XScan - программное обеспечение для системы для досмотра пассажиров в аэропорта. Позволяет захватывать изображения с аппарата СибСкан (разработанном в ИЯФе), обрабатывать их, представлять оператору и сохранять в БД или жесткий диск.
Применяется в: Толмачева, Домодедово, Ханты-Мансийском аэропорту, саудовской аравии и т.д.
Скриншот программы XScan

 Есть еще несколько проектов в стадии зачатков... Но по всем проектам есть интересная работа.

вторник, 11 января 2011 г.

Сборка libfreenect с помощью MinGW под Windows Vista

1. Релиз библиотеки libfreenect с git репозитория

2. Загружаем зависимости
2.1. Библиотеку работы с USB (libusb) [прямая ссыла]
2.2. Библиотеку для работы с потоками (pthreads) [прямая ссыла]
2.3. Библиотеку для отображения 3Д glut32 (расширение OpenGL) [прямая ссылка]

Распаковываем файлы

Glut32 распаковываем и добавляем в MinGW
glut.h в директорию {MinGW}/include/GL
glut32.lib и glut32.dll в директорию {MinGW}/lib

{MinGW}  - директория где установлена MinGW (Например C:/MinGW)

Запускаем CMake
Выбираем директорию в которую распаковали libfreenect и директорию куда будем собирать проект.

Нажимаем Configure (вбираем MinGW, компиляторы gcc и g++) - он выдаст много ошибок.
Поставьте галочку Andvanced в верхней части настроек MinGW.
Устанавливаем значение переменных
GLUT_INCLUDE_DIR - {MinGW}/include/GL
GLUT_glut_LIBRARY - {MinGW}/lib/glut32.dll
LIBUSB_1_INCLUDE_DIR - {libusb-win32-bin-1.2.2.0}\include
LIBUSB_1_LIBRARY - {libusb-win32-bin-1.2.2.0}\lib\gcc\libusb.a
THREAD _PTHREAD_INCLUDE_DIR - {PThreads}/Pre-built.2/include
THREAD_PTHREAD_WIN32_LIBRARY - {PThreads}/Pre-built.2/lib/libpthreadGC2.a

отключаем опцию BUILD_FAKENECT (с ней проект почему-то не собирается)

Далее жмем Configure. Если все хорошо жмем Generate.

Перед компиляцией надо устранить одни глюк: в MinGW/include/sys/types.h есть строка
typedef _ssize_t ssize_t; - ее надо закоментить.
Заходим с командной строки в директорию которую выбрали в CMake и запускаем mingw32-make
Ждем...
Ура все получилось.
Чтобы запустить пример из bin необходимо скопировать в эту папку целый букет dll.

glut32.dll
libfreenect.dll
libusb0.dll   (примечание исходное название библиотеки libusb0_x86.dll)
pthreadGC2.dll

Наслаждайтесь!
3D изображение сцены

Глубинное изображение и цветное

воскресенье, 9 января 2011 г.

Джентельменский набор библиотек и технологий

Библиотеки для систем основанных на техническом зрении
OpenCV - библиотека алгоритмов компьютерного зрения
Qt - библиотека пользовательского интерфейса
MRPT - программный набор компонент для робототехники
ROS - надстройка над операционной системой для робототехники
Itk  - инструменты для работы с медицинскими изображениями
FreeImage - загрузка и выгрузка изображений

Полезные библиотеки
Boost - Библиотека шаблонов для C++
IrrLicht - библиотека для 3Д рисования
OpenCL - ускорение и распараллеливание вычислений на GPU