roboforum.ru

Технический форум по робототехнике.

Уроки по OpenCV

Уроки по OpenCV

Сообщение Lockdog » 12 авг 2009, 14:24

Я сечас изучаю OpenCV по книге Learning OpenCV. И начал переводить уроки из этой книги в своём ЖЖ. Пока описал установку пакета в Visual Studio и перевёл первый урок. Может будет интересно публкация уроков здесь и в нашей Wiki? :)
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: Уроки по OpenCV

Сообщение Digit » 12 авг 2009, 14:31

Думаю, будет :)
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Уроки по OpenCV

Сообщение =DeaD= » 12 авг 2009, 14:31

Безусловно! Будем очень даже рады! К тому же тогда желающие смогут дописывать сюда блоки про использование OpenCV в других средах разработки, например, C++ Builder, Qt Creator и т.д.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Уроки по OpenCV

Сообщение Lockdog » 12 авг 2009, 14:40

Вот тогда предлагаю к прочтению.:)
Установка.

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
newicon.png (496 байт) Просмотров: 25533
и добавляйте следующие строки:
"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"
Результат можете увидеть на скриншоте.
1.png


- Далее выберите в листбоксе "Library files" ("Файлы библиотек") и добавьте
следующие строки:
"C:\Program Files\OpenCV\lib"
"C:\Program Files\OpenCV\otherlibs\_graphics\lib"
2.png


- Затем, в том же листбоксе выберите "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"
3.png


4. Когда будете создавать новый проект с использованием OpenCV нужно проделать следующее:

- В MSVS выберите File->Create->Project (Файл->Создать->Проект) и создайте консольное приложение в VC++
4.png


- В открытом проекте выберите: Project->Properties (Проект->Свойства).
- Далее Configuration Properties->Linker->Input
- И добавляйте имена библиотек в поле "Additional Dependencies" (Дополнительные зависимости): cxcore.lib cv.lib highgui.lib cvaux.lib cvcam.lib
5.png


Запомните, что при переходе из режима Debug в Release вам потребуется заново добавлять библиотеки в "Дополнительные зависимости"! Я всегда буду писать проекты в режиме Release.

Итак с настройками закончено и мы можем приступить к первой программе!

Первая программа.


В первой программе мы научимся создавать окно, выводить изображение, ожидать нажатия клавиши клавиатуры и закрывать приложение.

OpenCV предоставляет возможности по работе с широким набором типов изображений, а также видео и видео-потоками с камер. Эти возможности являются частью библиотеки HighGUI, которая включена в пакет OpenCV.

Вот листинг нашей первой программы:
Код: Выделить всёРазвернуть
#include "stdafx.h"
#include "highgui.h"

int main (int argc, char** argv)
{
IplImage* img = cvLoadImage( argv[1] );
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);
cvShowImage( "Example1", img );
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( "Example1" );
}


Эту программу нужно запустить из командной строки, передав ей в качестве первого параметра путь к изображению.
6.png


В качестве изображения для загрузки я выбрал скрин с первой программы.

Рассмотрим принцип работы. При запуске, программа загружает в память изображение, переданное, первым агрументом и выводит его на экран, затем ожидает нажатия любой клавиши и после нажатия закрывается.

Теперь рассмотрим каждую команду в отдельности.

Код: Выделить всёРазвернуть
IplImage* img = cvLoadImage( argv[1] );

Эта строка непосредственно загружает изображение. Функция cvLoadImage() сама выделяет нужный объём памяти для изображения и может работать с большим числом форматов, включая:
BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM, SR, RAS, и TIFF. В результате она возвращает указатель на структуру данных изображения. Эта структура называется IplImage. Мы используем указатель cvLoadImage() для работы с изображение и его данными.

Код: Выделить всёРазвернуть
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);

cvNamedWindow() создаёт окно, которое может содержать изображение. Первым параметром мы передаём название самого окна, а вторы его размер, флаг CV_WINDOW_AUTOSIZE, указывает на то, что окно будет таких же размеров, что и загружаемое изображение. Можно передать вторым параметром "0" (ноль) и тогда вы сможете сами изменять размер окна, когда программа запущена.

Код: Выделить всёРазвернуть
cvShowImage( "Example1", img );

Непосредственно отображает изображение в окне, название которого мы передаём первым параметром, второй параметр передаёт само изображение.

Код: Выделить всёРазвернуть
cvWaitKey(0);

Данная функция останавливает программу и ожидает нажатия клавиши, если аргумент функции больше нуля, тогда программа ожидает это число миллисекунд и продолжает программу, если ничего не нажато. Если же аргумент равен нулю или меньше, тогда программа будет ожидать нажатия клавиши и потом продолжит работу.

Код: Выделить всёРазвернуть
cvReleaseImage( &img );

Функция освобождает память, связанную с изображением и затем устанавливает указатель img в NULL.

Код: Выделить всёРазвернуть
cvDestroyWindow( "Example1" );

В конце мы закрываем окно и высвобождаем выделенную память. В простых программах последние два действия не являются обязательным, так как ОС сама всё сделает, после закрытия программы. Но не стоит всегда на неё полагаться.=) И для подстраховки лучше делать всё самому.:)
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: Уроки по OpenCV

Сообщение =DeaD= » 12 авг 2009, 16:33

2Lockdog: Такие мысли есть:
1. Надо отделить разбор кроссплатформенной программы OpenCV от конкретной среды разработки Visual Studio и особенностей работы под ней. Тогда к вам смогут присоединиться все кто ведут разработку в других средах. И информация ваша будет более популярна.
2. Visual Studio выбрана по каким-то причинам или таковых пока нету? Я просто пока смотрю на Qt Creator - бесплатный для "не коммерции" и кроссплатформенный реально.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Уроки по OpenCV

Сообщение Lockdog » 12 авг 2009, 16:54

Я описал только установку самих библиотек на VS, а листинги программ ничем отличаться в других средах не будут. Выбрана по причинам, что я её постоянно использую.:) У меня так же установлена бесплатная среда Dev-C++ - в ближайшее время опишу установку OpenCV под неё. Опять же напоминаю, что листинги в уроках отличаться нигде не будут, потому что C++ на всех платформах один и тот же. Я не смогу описать установку на всех средах программирования. :) VS вроде как довольно популярная, а Dev-C++ виндовая среда для линуксового gcc.))
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: Уроки по OpenCV

Сообщение =DeaD= » 12 авг 2009, 18:40

Я к тому, что я не предлагаю описывать установку во всех средах программирования, просто концепцию в которой отделены среда разработки и примеры - если так и есть, то это просто отлично! ;)

Добавлено спустя 50 секунд:
А какой интерфейс пользовательских приложений планируется использовать? Тот, который из OpenCV?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Уроки по OpenCV

Сообщение Lockdog » 12 авг 2009, 18:58

отделены среда разработки и примеры - если так и есть, то это просто отлично!

Так и есть)))

А какой интерфейс пользовательских приложений планируется использовать? Тот, который из OpenCV?

Имеется ввиду кнопки, трекбары и прочее? Если про это, то из OpenCV
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: Уроки по OpenCV

Сообщение =DeaD= » 12 авг 2009, 18:59

Ок, понял, тогда всячески поддерживаем затею! Думаю даже поучаствую, как только тут разгребусь с уже начатыми делами :)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Уроки по OpenCV

Сообщение Vooon » 12 авг 2009, 19:49

Очень интересно было бы почитать как уже непосредственно писать...
А установка это имхо тривиально. sudo apt-get install opencv
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Уроки по OpenCV

Сообщение MiBBiM » 12 авг 2009, 19:55

а давайте распознаем яркую точку на изображении :wink:
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Уроки по OpenCV

Сообщение =DeaD= » 12 авг 2009, 20:01

2MiBBiM: Дык я же писал: viewtopic.php?p=83752#p83752
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Уроки по OpenCV

Сообщение MiBBiM » 12 авг 2009, 20:31

=DeaD=, три комментария новичку о многом скажут :) не, я хочу чтоб на блюдечке все было :wink: с обзором базовых типов, классов, и проч.
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Уроки по OpenCV

Сообщение Lockdog » 12 авг 2009, 20:46

Будет, но всё по порядку)
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: Уроки по OpenCV

Сообщение Lockdog » 13 авг 2009, 19:43

Ещё один урок:

Сегодня я вам покажу как вывести видео в нашем приложении при помощи OpenCV. Это так же легко, как и работа с изображением. Помимо прошлых действий нам потребуется сделать цикл, для чтения каждого кадра видео, так же нам потребуется команда, по который мы сможем выйти из этого цикла, если видео покажется слишком скучным.=)
Приступим!

Код: Выделить всёРазвернуть
#include “highgui.h”

int main( int argc, char** argv )
{
cvNamedWindow( “AVI Video”, CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateFileCapture( argv[1] );
IplImage* frame;
while(1)
{
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( “AVI Video”, frame );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( “AVI Video” );
}


Результат работы программы (кадр из фильма "Трансформеры").
1.png


Функции которые мы рассматривли в прошлом уроке, в этом описываться не будут.

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, чтобы можно было перематывать видео!
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

След.

Вернуться в Компьютерное зрение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3