270 likes | 489 Views
Министерство образования и науки Российской федерации Государственное образовательное учреждение высшего профессионального образования «Нижегородский государственный университет им. Н.И. Лобачевского» Радио ф изический факультет Лаборатория физических основ беспроводной связи.
E N D
Министерство образования и науки Российской федерации Государственное образовательное учреждение высшего профессионального образования «Нижегородский государственный университет им. Н.И. Лобачевского» Радио физический факультет Лаборатория физических основ беспроводной связи Выполнил:Миронов И.М. “Введение в OpenCV”
Введение • OpenCV (OpenSourceComputerVision) — библиотека компьютерного зрения с открытым исходным кодом • Реализована на C/C++, также разрабатывается для Python, Ruby, Matlab, Lua
Поддерживаемые платформы • Microsoft Windows: • MicrosoftVisual C++ (6.0-9.0, .NET) • Intel Compiler, • Borland C++, • Mingw (GCC 3.x). • qt • Linux(В том числе и MeeGo): • GCC (2.9x, 3.x), • Intel Compiler: «./configure-make-make install» • qt • Mac OS X: • GCC (3.x, 4.x) • Android: • Android-NDK+cmake
Модули • opencv_core — основная функциональность. Включает в себя базовые структуры, вычисления(математические функции, генераторы случайных чисел) и линейную алгебру, DFT, DCT, ввод/вывод для XML и YAWL и т. д. • opencv_imgproc — обработка изображений (фильтрация, геометрические преобразования, преобразование цветовых пространств и т. д.). • opencv_highgui — простой UI, ввод/вывод изображений и видео. • opencv_ml — статистические модели машинного обучения (SVM, деревья решений, обучение со стимулированием и т. д.).
Модули • opencv_features2d — распознавание и описание плоских примитивов (SURF, FAST и другие, включая специализированный фреймворк). • opencv_video — анализ движения и отслеживание объектов (оптический поток, шаблоны движения, устранение фона). • opencv_objdetect— обнаружение объектов на изображении (нахождение лиц с помощью алгоритма Виолы-Джонса (англ.), распознавание людей HOG и т. д.). • opencv_calib3d — калибровка камеры, поиск стерео-соответстсвия и элементы обработки трехмерных данных.
Модули • opencv_flann — библиотека быстрого поиска ближайших соседей (FLANN 1.5) и обертки OpenCV. • opencv_contrib— сопутствующий код, еще не готовый для применения. • opencv_legacy — устаревший код, сохраненный ради обратной совместимости. • opencv_gpu — ускорение некоторых функций OpenCV за счет CUDA, создан при поддержке NVidia
Создание окон • intcvNamedWindow( constchar* name, intflags ); — создаёт окно, в которое мы будем выводить наше изображение. • Первый параметр — название окна • Второй — его размер, 0 — даёт возможность изменять размер окна во время выполнения программы, но обычно указывается флаг CV_WINDOW_AUTOSIZE, который указывает, что окно будет ровно тех же размеров, что и загружаемое в него изображение. • voidcvShowImage( constchar* name, constCvArr* image );— эта функия отображает изображение в окне; • первый параметр — название окна для вывода картинки, • второй параметр — изображение для вывода. • intcvWaitKey( intdelay=0 ); — эта функция останавливает программу и ожидает нажатия клавиши заданное число миллисекунд и продолжает программу, если ничего не нажато.
Освобождение ресурсов • void cvReleaseImage( IplImage** image ); — функция освобождает память, выделенную под изображение и устанавливает указатель в NULL. void cvDestroyWindow( const char* name ); — эта функция закрывает окно и освобождает выделенную память.
Структура изображения • IplImage – структур для хранения изображений • Наиболее часто используемые поля: • intnSize; • intnChannels; • int depth; • int width; • int height; • char *imageData; • intdataOrder;
Загрузка изображения • IplImage* cvLoadImage( const char* filename, intiscolor=CV_LOAD_IMAGE_COLOR ); — загружает картинку из файла. • filename — имя файла • iscolor — определяет как представить картинкуiscolor > 0 — цветная картинка с 3-мя каналамиiscolor == 0 — картинка будет загружена в формате GRAYSCALE (градации серого)iscolor < 0 — картинка будет загружена как есть
Простейшая программа на OpenCV • #include <highgui.h>int main(intargc, char** argv){IplImage *image = cvLoadImage(“testimage.jpg”, 1); // окно для отображения картинкиcvNamedWindow(“Test”,CV_WINDOW_AUTOSIZE); // показываем картинкуcvShowImage(“Test”, image); // ждём нажатия клавишиcvWaitKey(0); // освобождаем ресурсыcvReleaseImage(& image); // удаляем окноcvDestroyWindow(“Test”); return 0;}
Детектирование лиц • Детектор лица OpenCV использует метод П.Виолы и М.Джонса, который был опубликован в 2001 • Этот подход к детектированию объектов на изображении комбинирует четыре ключевые концепции: • Простые прямоугольные функции, называемые функциями Хаара. • Интегральное Изображение для быстрого обнаружения функции. • Метод машинного обучения AdaBoost. • Каскадный классификатор для эффективного совмещения множественных функций.
Функции Харра • Функции Харра представляют собой прямоугольные волны одинаковой длины
Интегральное Изображение для быстрого обнаружения функции Харра • Интегральное значение для каждого пикселя есть сумма всех пикселей над ним и слева от него. • Наличие функции Хаара определяется посредством вычитания среднего значения области темных пикселей из среднего значения области светлых пикселей. Если разница превышает порог (определяется в процессе обучения), тогда говорят, что функция является существующей.
Работа с каскадами • CvHaarClassifierCascade * cascade– хранит данные классификатора, загруженного из xml файла. • Для загрузки XML-данных из файла можно использовать функцию cvLoad() • cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0);
Буфер памяти • CvMemStorage*storage; - динамически расширяемый буфер памяти. В него пишется перечень найденных лиц. • storage = cvCreateMemStorage(0);- выделение памяти для буфера. • cvReleaseMemStorage(&storage);- освобождение памяти буфера.
Последовательности данных • Последовательности - это самостоятельно связанные списки разных структур. • Единственный вид объекта, который может храниться в хранилище памяти, является последовательность. • В OpenCVпоследовательности описываются структурой CvSeq.
Структура CvSeq typedefstructCvSeq { intflags; // разные флаги intheader_size; // размер заголовка последовательности CvSeq* h_prev; // горизонтально-предыдущая последовательность CvSeq* h_next; // горизонтально-следующая последовательность CvSeq* v_prev; // вертикально-предыдущая последовательность CvSeq* v_next // вертикально-следующая последовательность inttotal; // общее число элементов intelem_size; // размер элемента последовательности в байтах char* block_max; // максимальная граница последнего блока char* ptr; // текущий указатель на запись intdelta_elems; // сколько элементов выделено CvMemStorage* storage; // где хранится последовательность CvSeqBlock* free_blocks; // список свободных блоков CvSeqBlock* first; // указатель на первый блок последовательности }
Доступ к элементам последовательности • char* cvGetSeqElem( seq, index )– возвращает элемент последоваетельности по индексу. • Необходимо делать преобразование типа возвращаемого значения к типу данных в зависимости от хранимых типов в последовательности. • Пример получение данных из последовательности for( int i=0; i<seq->total; ++i ) { CvPoint* p = (CvPoint*)cvGetSeqElem ( seq, i ); }
Выделение контуров • Для выделения контуров в OpenCVсуществует несколько функций для оконтуривания • cvThreshold – бинаризует изображение • cvLaplace – вычисляет производную от изображения и находит локальные экстремумы • cvSobel– вычисляет оператор собеля • cvCanny – вычисляет фильтр кени
Поиск контуров на изображении • intcvFindContours(CvArr* image,CvMemStorage* storage,CvSeq** first_contour,intheader_size=sizeof(CvContour),int mode=CV_RETR_LIST,int method=CV_CHAIN_APPROX_SIMPLE,CvPoint offset=cvPoint(0,0) );-производит поиск контуров и записывает их в хранилище последовательности
Отрисовка контуров • void cvDrawContours(CvArr *img,CvSeq* contour,CvScalarexternal_color,CvScalarhole_color,intmax_level,int thickness=1,intline_type=8,CvPoint offset=cvPoint(0,0));- отрисовывает контуры записанные в последовательность