Я сечас изучаю OpenCV по книге Learning OpenCV. И начал переводить уроки из этой книги в своём ЖЖ. Пока описал установку пакета в Visual Studio и перевёл первый урок. Может будет интересно публкация уроков здесь и в нашей Wiki?
Безусловно! Будем очень даже рады! К тому же тогда желающие смогут дописывать сюда блоки про использование OpenCV в других средах разработки, например, C++ Builder, Qt Creator и т.д.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
1. Вам нужно скачать и установить OpenCV для Windows. Лучше скачайте версию 1.0 - эта версия создавалась ещё в Intel. http://opencvlibrary.sourceforge.net/ (Я проинсталлировал в дефолтную папку C:/Program Files/OpenCV/)
2. Скачайте и установите MS Visual Studio 2008, если вы ещё этого не сделали или MS Visual C++ 2008 Express Edition по ссылке http://www.microsoft.com/express/vc (о регистрации, думаю, напоминать не нужно:)).
3. Теперь у вас установлено всё необходимое, поэтому приступим к включению OpenCV в MSVS 2008: - В главном меню, выберите Tools->Options (Сервис->Параметры). - В списке справа, выберите Projects and Solutions->VC++ Directories (Проекты и решения->Каталоги VC++) - Сначала, из "Show Directories for:" ("Показать каталоги для:") листбокса выберите "Include Files" ("Включаемые файлы"). - Кликните на иконке Insert New (Вставить строку)
newicon.png (496 байт) Просмотров: 25805
и добавляйте следующие строки: "C:\Program Files\OpenCV\cv\include" "C:\Program Files\OpenCV\cxcore\include" "C:\Program Files\OpenCV\otherlibs\highgui" "C:\Program Files\OpenCV\cvaux\include" "C:\Program Files\OpenCV\otherlibs\cvcam\include" "C:\Program Files\OpenCV\ml\include" "C:\Program Files\OpenCV\otherlibs\_graphics\include" "C:\Program Files\OpenCV\otherlibs\_graphics\include\jasper" Результат можете увидеть на скриншоте.
- Далее выберите в листбоксе "Library files" ("Файлы библиотек") и добавьте следующие строки: "C:\Program Files\OpenCV\lib" "C:\Program Files\OpenCV\otherlibs\_graphics\lib"
- Затем, в том же листбоксе выберите "Source Files" ("Файлы исходного кода") и добавьте: "C:\Program Files\OpenCV\cv\src" "C:\Program Files\OpenCV\cxcore\src" "C:\Program Files\OpenCV\cvaux\src" "C:\Program Files\OpenCV\otherlibs\highgui" "C:\Program Files\OpenCV\otherlibs\cvcam\src\windows" "C:\Program Files\OpenCV\ml\src" "C:\Program Files\OpenCV\otherlibs\_graphics\src"
4. Когда будете создавать новый проект с использованием OpenCV нужно проделать следующее:
- В MSVS выберите File->Create->Project (Файл->Создать->Проект) и создайте консольное приложение в VC++
- В открытом проекте выберите: Project->Properties (Проект->Свойства). - Далее Configuration Properties->Linker->Input - И добавляйте имена библиотек в поле "Additional Dependencies" (Дополнительные зависимости): cxcore.lib cv.lib highgui.lib cvaux.lib cvcam.lib
Запомните, что при переходе из режима Debug в Release вам потребуется заново добавлять библиотеки в "Дополнительные зависимости"! Я всегда буду писать проекты в режиме Release.
Итак с настройками закончено и мы можем приступить к первой программе!
Первая программа.
В первой программе мы научимся создавать окно, выводить изображение, ожидать нажатия клавиши клавиатуры и закрывать приложение.
OpenCV предоставляет возможности по работе с широким набором типов изображений, а также видео и видео-потоками с камер. Эти возможности являются частью библиотеки HighGUI, которая включена в пакет OpenCV.
Эту программу нужно запустить из командной строки, передав ей в качестве первого параметра путь к изображению.
В качестве изображения для загрузки я выбрал скрин с первой программы.
Рассмотрим принцип работы. При запуске, программа загружает в память изображение, переданное, первым агрументом и выводит его на экран, затем ожидает нажатия любой клавиши и после нажатия закрывается.
Эта строка непосредственно загружает изображение. Функция cvLoadImage() сама выделяет нужный объём памяти для изображения и может работать с большим числом форматов, включая: BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM, SR, RAS, и TIFF. В результате она возвращает указатель на структуру данных изображения. Эта структура называется IplImage. Мы используем указатель cvLoadImage() для работы с изображение и его данными.
cvNamedWindow() создаёт окно, которое может содержать изображение. Первым параметром мы передаём название самого окна, а вторы его размер, флаг CV_WINDOW_AUTOSIZE, указывает на то, что окно будет таких же размеров, что и загружаемое изображение. Можно передать вторым параметром "0" (ноль) и тогда вы сможете сами изменять размер окна, когда программа запущена.
Данная функция останавливает программу и ожидает нажатия клавиши, если аргумент функции больше нуля, тогда программа ожидает это число миллисекунд и продолжает программу, если ничего не нажато. Если же аргумент равен нулю или меньше, тогда программа будет ожидать нажатия клавиши и потом продолжит работу.
В конце мы закрываем окно и высвобождаем выделенную память. В простых программах последние два действия не являются обязательным, так как ОС сама всё сделает, после закрытия программы. Но не стоит всегда на неё полагаться.=) И для подстраховки лучше делать всё самому.
2Lockdog: Такие мысли есть: 1. Надо отделить разбор кроссплатформенной программы OpenCV от конкретной среды разработки Visual Studio и особенностей работы под ней. Тогда к вам смогут присоединиться все кто ведут разработку в других средах. И информация ваша будет более популярна. 2. Visual Studio выбрана по каким-то причинам или таковых пока нету? Я просто пока смотрю на Qt Creator - бесплатный для "не коммерции" и кроссплатформенный реально.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Я описал только установку самих библиотек на VS, а листинги программ ничем отличаться в других средах не будут. Выбрана по причинам, что я её постоянно использую. У меня так же установлена бесплатная среда Dev-C++ - в ближайшее время опишу установку OpenCV под неё. Опять же напоминаю, что листинги в уроках отличаться нигде не будут, потому что C++ на всех платформах один и тот же. Я не смогу описать установку на всех средах программирования. VS вроде как довольно популярная, а Dev-C++ виндовая среда для линуксового gcc.))
Я к тому, что я не предлагаю описывать установку во всех средах программирования, просто концепцию в которой отделены среда разработки и примеры - если так и есть, то это просто отлично!
Добавлено спустя 50 секунд: А какой интерфейс пользовательских приложений планируется использовать? Тот, который из OpenCV?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Сегодня я вам покажу как вывести видео в нашем приложении при помощи OpenCV. Это так же легко, как и работа с изображением. Помимо прошлых действий нам потребуется сделать цикл, для чтения каждого кадра видео, так же нам потребуется команда, по который мы сможем выйти из этого цикла, если видео покажется слишком скучным.=) Приступим!
Результат работы программы (кадр из фильма "Трансформеры").
Функции которые мы рассматривли в прошлом уроке, в этом описываться не будут.
CvCapture* capture = cvCreateFileCapture( argv[1] ); Данная функция принимает в качестве аргумента параметр в котором мы передаём путь считываемого AVI файла и возвращает указатель на структуру CvCapture. Эта структура хранит всю информацию о AVI файле.
frame = cvQueryFrame( capture ); Внутри цикла while(1) мы начинаем считывание AVI файла. cvQueryFrame() принмает в качестве аргумента указатель на структуру CvCapture. И затем с каждым циклом заносит в память следующий кадр видео. Указатель возвращается на этот кадр.
char c = cvWaitKey(33); if( c == 27 ) break; Когда мы отобразили очередной кадр, то мы ждём 33 миллисекунды (на самом деле вы можете поставить какую угодно задержку, но данная считается оптимальной для отображения 30 кадров в секунду, а 3 миллисекунды примите пока на веру:)) перед выводом следующего кадра. Если пользователь нажимает клавишу на клавиатуре, то функция cvWaitKey() передаёт переменной "с" ASCII код этой клавиши и если пользователь нажал Esc (ASCII 27), то тогда мы выходим из цикла, иначе проходит 33 мс и цикл продолжается.
cvReleaseCapture( &capture ); Так или иначе - цикл преравался (видео закончилось или была нажата клавиша Esc), тогда этой функцией мы высвобождаем память связанную со структурой CvCapture. Вот и всё! Немного позже я расскажу о том, как добавить в наше приложение slidebar, чтобы можно было перематывать видео!