воскресенье, 20 июня 2010 г.

OpenCV + XCode

Про то, что такое OpenCV можно почитать здесь http://ru.wikipedia.org/wiki/OpenCV.
Сегодня попытался подключить OpenCV 2.1 к XCode 3.2.1. Оказалось, что есть много подводных камней, про которые мало где пишут. Существует, по крайней мере 2 способа.
Способ раз.
Проще всего скачать primery framework например отсюда http://www.ient.rwth-aachen.de/cms/opencv/. Копируем OpenCV.framework в папку /Library/Frameworks. На самом деле это не обязательно. В XCode создадим новый Command Line Tool проект, язык программирования выбираем C++ stdc++
Назовем проект FirstOpenCV. Жмем правой кнопкой мыши на проект, выбираем Add -> Existing Framework
Выбираем в списке OpenCV.framework. Если его нет в списке, щелкаем по кнопке “Add other ...” вручную находим OpenCV.framework и жмем Add. В общем-то и все))) библиотека подключена и можно ей пользоваться. Хедеры подключаем вот так
#include "OpenCV\нужный_хедер.h"
Казалось бы все просто и логично, однако есть большая такая ложка неприятностей. Возмем простенькую функцию для просмотра видео.
void ShowVideo(char* fileName)
{
        cvNamedWindow(videoWindowName, CV_WINDOW_AUTOSIZE);
        CvCapture* capture = cvCreateFileCapture(fileName);
        
        IplImage* frame;
        for (; ; )
        {
                frame = cvQueryFrame(capture);
                if (!frame) break;
                cvShowImage( videoWindowName, frame );
                char c = cvWaitKey(33);
                if (c==27) break;
                printf("%c", c);
        }
        cvReleaseCapture(&capture);
        cvDestroyWindow(videoWindowName);
}
Проблема 1: При запуске видео очень дергается и тормазит, не знаю с чем это связано, скорее всего так framework написан.
Проблема 2: Видео крутится ПО КРУГУ. То есть не срабатывает проверка
                if (c==27) break;
Более того, когда приглядимся поближе заметим, что функция
                cvWaitKey(33);
всегда возвращает -1.
Проблема 3: Нельзя собрать проект под x64 архитектуру.
Глубже я не копал, возможно есть еще глюки у этого способа (скорее всего). Так что мне пришлось отказаться от этого способа и искать более изощренный.
Способ два.
Описание этого способа можно найти здесь. Вкратце, качаем macports (очень полезный инструмент, много раз выручал). Набираем с командной строке
sudo port selfupdate
sudo port install opencv
не забываем вводить пароль администратора, если потребуется. Ждем, пока macports скомпилят OpenCV и все что для них нужно. На этом установка завершена. Чтобы прикрутить библиотеку к проекту нужно сделать много магических манипуляций.
Первое: Добавим нужные библиотеки. В меню Project->Add To Project идем в папку
/opt/local/lib/ (или /usr/local/lib/)
помечаем там следующие библиотеки
libcxcore.dylib
libcvaux.dylib
libcv.dylib
libhighgui.dylib
libml.dylib
жмем add. Следим, чтобы галочка у “Copy items to destination group`s older(if needed)” была снята. Снова жмем Add.
Второе: Идем в настройки проекта (помечаем проект, жмем info). Идем на вкладку build. Среди весьма внушительного списка параметров ищем “Header Search Paths” (используйте строку поиска). Вводим туда
/opt/local/include/opencv/ (или /usr/local/include/opencv/ зависит от того куда встал OpenCV)
Третье: из графы “Valid Architectures” оставляем только x86_64
Четвертое(самое неприятное): Проект может собираться только под ТЕКУЩУЮ архитектеру ситемы. То есть, если активен 64 разрядный режим то и собирать надо в 64 разрядном режиме!!! Если 32 битный, собираем в 32 разрядном. Если ошибемся с разрядностью, то будут вылазать левые ошибки в большом количестве, например таких
Еще один не понятный момент, окошки, которые создает OpenCV почему-то открываются через X11. Зато все отрабатывает без тормазов и правильно.