понедельник, 27 декабря 2010 г.

Подключение Opencv2.2 в Qt Creator

В файле *.pro вашего проекта добавьте строчки:

OPENCVDIR = C:/Develop/opencv22
exists($$OPENCVDIR) {
    DEFINES += USEOPENCV
    INCLUDEPATH += $${OPENCVDIR}/include
    LIBS += -L$${OPENCVDIR}/lib \
        -lopencv_core220.dll \
        -lopencv_imgproc220.dll \
        -lopencv_highgui220.dll
    DEPENDPATH += $${OPENCVDIR}/bin
    message("OpenCV libraries found in $${OPENCVDIR}")
}
else:message("OpenCV libraries not found.")


Для подключения других модулей - надо только дописать их названия в LIBS.

Тогда в любом файле просто подключаем требуемые модули:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

И все работает.

Сборка OpenCV2.2 MinGW/Windows XP

1. Скачать новую версию MinGW
2. При сборке конфигурационных файлов с помощью утилиты cmake2.8 нужно в момент Configure выбрать пункт Specify Native Compilers указать компиляторы для C - gcc/ для C++ - g++
3. Запускаем в папке куда собрались конфигурационные файлы утилиту mingw32-make (она должна быть в пути) если нет смотрите мое предыдущее сообщение.
4. После того как собрали (примерно час времени) выполните команду mingw32-make install для создания прекомпилированных заголовков (хэдеров).

Все готово можно приступать к работе

воскресенье, 19 декабря 2010 г.

Новые технологии

Заинтересовался технологиями

  1. ROS - операционная система для роботов.
  2. OpenNI - библиотека для изучения кинематики людей.
Итак подробнее ROS
http://www.willowgarage.com/pages/software/ros-platform
Операционная система специально для роботов. Чем она отличается от обычных Linux дистрибутивов? Все несколькими вещами: абстрактными интерфейсами устройств, сообщениями между процессами, доступ к низкоуровневым функциям. Интересно что у  Androidа есть аналогичные функции и он тоже в исходных кодах. Может ROS более производительна т.к. не требуется рисования красивых картинок? Я думаю разобраться. Этим проектом заведует компания разработчиков, которой я лично фанат т.к. они разработали OpenCV.

Про OpenNI
http://www.openni.org/
Израильская компания PrimeSence разработала игрушку, которая легла в основу Microsoft Kinect.
Этот проект - это открытые коды для драйверов для Kinect. Штука сочетает в себе камеру и измеритель расстояния. Интересно было бы ее вставить например в машину, но проблемы будут при 2х машинах с такими устройствами))).

понедельник, 22 ноября 2010 г.

Сборка opencv из репозитория под Windows

Данная статья о том, как собрать opencv из исходных кодов из репозитория. Почему это важно, ведь всегда есть версия для установки под Windows? Потому, что в репозитории больше интересных примеров и более надежный код, чем в релизе.

Шаг 1) Установка утилит
1.1. SVN клиент http://tortoisesvn.tigris.org/
1.2. Cmake http://www.cmake.org/cmake/resources/software.html
1.3. MinGW http://www.mingw.org/wiki/InstallationHOWTOforMinGW

Шаг 2) Конфигурация системы
Мой компьютер> Свойства> Дополнительные параметры системы> Закладка дополнительно> Переменные среды
Добавим переменную PATH со значением ПУТЬ ДО ПАПКИ MinGW
Перезагружаем систему

Шаг 3) Проверяем работу mingw запускаем консоль и выполняем mingw32-make
Шаг 4) Загружаем репозиторий в ВАШ ПУТЬ через SVN с тестовыми данными https://code.ros.org/svn/opencv/trunk ~ 600 Мб, либо без тестовых данных https://code.ros.org/svn/opencv/trunk/opencv ~ 175Мб.
Ждем...

Шаг 5) Запускаем cmake
В строке Where is the source code набираем ВАШ ПУТЬ в случае если вы загрузили с тестовыми данными ВАШ ПУТЬ/opencv
В строке Where to build binaries указываем куда класть данные проектов (далее buildPath).
Конфигурируем под Ваш компилятор либо VS (Visual Studio) либо MinGW кнопкой Configure.

Для компиляции примеров поставьте галочку BUILD_EXAMPLES
 
Примечание: возможна придется нажать Configure несколько раз.

Шаг 6) Нажимаем Generate в buildPath будут сконфигурированные проекты.
Шаг 7 mingw) Заходим в buildPath через командную строку cmd и исполняем mingw32-make
Собирается на компьютере Intel Dual Core 2.9 Hz ~ 30 минут

Шаг 7 VS)  Заходим в buildPath через проводник находим файл Solution (sl) запускаем его и собираем в VS.
 Вот и все opencv собран можно указывать на него путь. Удачной работы!

суббота, 13 ноября 2010 г.

Работа с изображениями (начало начал)

В данном сообщении даются  базовые навыки работы с bmp.

План статьи:
  1. BMP и представление изображения  в памяти.
  2. Как явно открыть BMP
Подробно расписывать BMP я не стану, подробная спецификация формата дана http://ru.wikipedia.org/wiki/BMP
Это самый простой формат, с него надо начинать работать
Файл состоит из следующих частей:

BITMAPFILEHEADER - важное поле
BITMAPINFOHEADER - информация о изображение важные поля:
biBitCount, biWidth, biHeight - ЭТИХ ПАРАМЕТРОВ ДОСТАТОЧНО ЧТОБЫ ОТКРЫТЬ СТАНДАРТНЫЙ ФАЙЛ 24BIT
Палитра - для 8 битных раскрашиваемых изображений (в принципе сейчас не используется)
Само изображение
ВАЖНО!!! Изображение больше чем biWidth*biHeight, по историческим причинам biWidth реальный должен делиться на 4, по это realWidth = biWidth+biWidth%4 



Код позаимствовал с http://www.vbforums.com/showthread.php?t=261522 структуры BITMAPFILEHEADER и BITMAPFILEHEADER если надо можно позаимствовать по же этому адресу. Примечание для GNU программистов WORD - 16 бита (int)  DWORD и LONG - 32 бита (long)  

//Данная функция открывает bmp файл (на выходе имеем указатель на данные + заполненную структуру bitmapInfoHeader)

unsigned char * openBMP(char* filename, BITMAPINFOHEADER *bitmapInfoHeader)
{
 FILE *filePtr; //указатель на файл
 BITMAPFILEHEADER bitmapFileHeader; //информация о файле
 unsigned char *bitmapImage; //указатель на данные в которые будем писать изображение
 //открываем файл
 filePtr = fopen(filename,"rb");
 if (NULL == filePtr)
 {
   return NULL;
 }
 //считываем структуру BITMAPFILEHEADER
 fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER,1,filePtr);

 //читаем заголовок изображения
 fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);

 //перемещаем указать в файле на начало данных изображения
 fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);




 //Далее нам нужно запросить память под изображение
 // (в стандарте для не сжатого BMP bitmapInfoHeader->biSizeImage может равняться 0)
 long imsize = 0;
 long w =  bitmapInfoHeader->biWidth;
 long wstep = w+w%4;
 long h = bitmapInfoHeader->biHeight;
 if(0!=bitmapInfoHeader->biSizeImage)
 {
   imsize =  bitmapInfoHeader->biSizeImage;
 }else{
   imsize = wstep * h;
 } 
 bitmapImage = (unsigned char*)malloc(imsize);
     
 //читаем изображение
 fread(bitmapImage,imsize,filePtr);
         
 //Закрываем изображение 
 fclose(filePtr); 
 return bitmapImage;
}

В данном примере мы предпологаем что открываем BMP стандартое 3 канала 8 бит каждый канал.

так как "чистые" bmp - файлы в наше время экзотике в основном приходится работать с JPEG, PNG (интернет) или TIFF (медицина, наука), то данный пример просто для общего развития. Перечисленные форматы имеют намного более сложную структуру и данные сжаты алгоритмами, по этому они не открываются простым "способом".

В следующем сообщение я распишу как упростить данную процедуру с помощью готовых библиотек и открывать другие типы файлов.







    пятница, 5 ноября 2010 г.

    Компиляция opencv под андроид

    На днях наткнулся на интересную статью в которой разработчики перенесли возможности библиотеки opencv в телефон на основе операционной системы Android http://code.google.com/p/android-opencv/wiki/CVCamera. Особенность этого проекта в том, что у авторов получилось создать готовое приложение, на которое можно посмотреть.

    Я решил повторить данный эксперимент и собственно что получилось.

    Далее я опишу детально как надо собрать opencv под android.
    Логическое отступление. Android - это Java подобная оболочка на ядре Linux. Для того чтобы использовать все функции opencv (которая написана на C++), нам во первых собрать ее под Linuxом или эмулятором Linuxа с использованием инструментов, которые нам предоставил Гугл.
    Собирать мы будем ее в динамические библиотеки (*.so) и будем использовать через враперы JNI. (Java Native Interface).

    Шаг 0. Необходимый инструментарий.
    Если Вы работаете под Linux то вам не нужно будет устанавливать Cygwin.

    0.1. Загружаем эмулятор линукса Cygwin (http://www.cygwin.com/)
    0.2. Выбираем путь установки у меня он будет C:/Develop/cygwin
    Во время установки он спросит какие компоненты нам будут нужны:
           make - сборщик
           cmake - сборщик
           g++  - компилятор для c++
           gcc - компилятор для c
           swig - инструмент для создания интерфейсов
    Если сразу компоненты не установились запустите установщик еще раз он будет дополнять программы.

    0.3. Нам надо загрузить android-ndk. Обычный нам не будет подходить т.к. обычный с сайта Гугл не умеет компилировать с++. По этому нам необходимо загрузить http://crystax.net/android/ndk-r4.php. Загружаем на компьютер и распаковываем в каталог: C:/Develop/cygwin/home/username, где username  - имя вашего пользователя у меня SibAS.

    Нам необходимо добавить данный каталог к системному пути:
    для этого 

    Мой компьютер> Свойства> Дополнительные параметры системы> Закладка дополнительно> Переменные среды
    Добавим переменную PATH со значением C:\Develop\cygwin\home\SibAS\android-ndk-r4-crystax;C:\Develop\cygwin\bin;

    Шаг 1. Запускаем Cygwin и проверяем как все ли работает.
    cd  android-ndk-r4-crystax
    cd samples
    cd hello-jni
    ndk-build

     Экран того что мы должны увидеть.
    Если возникли ошибки они могут быть из-за путей (проверьте PATH) наберите в echo $PATH если все пути совпадают то ошибке в конфигурации cygwin - он напишет каких приложений не хватает и вы сможете их загрузить.

    Отлично! Мы смогли собрать тестовое приложение!

    Теперь очередь за opencv.

    Шаг 2. Нам надо загрузить исходный код проекта. С репозитория http://android-opencv.googlecode.com/svn/trunk/. Воспользуемся svn клиентом http://tortoisesvn.tigris.org/ для загрузки репозитория (с помощью удобного интерфейса) в папку C:/Develop/cygwin/home.

    Отлично теперь в папке C:/Develop/cygwin/home лежат следующие папки: android-ndk-r4-crystax opencv samples (последнее две из проекта)

    В Cygwin переходим в папку opencv
    cd opencv
    и запускаем сборку...
    sh build.sh

    Собираться все это добро будет порядка часа так что можно посмотреть фильм или почитать книжку. Когда все готово мы увидим следующий экран:



    OpenCV собрано!

    Шаг 3. Собираем пример
    cd samples (которые мы загрузили с проектом а не с android-ndk)
    cd CVCamera
    sh build.sh



    Проект собран в следующем сообщении будет описано как запустить его из eclipse