МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Государственное образовательное учреждение высшего профессионального образования «Нижегородский государственный университет им. Н.И. Лобачевского» Радио физический факультет Лаборатория физических основ беспроводной связи “Введение в OpenCV” Выполнил: Миронов И.М. Введение • OpenCV (Open Source Computer Vision) — библиотека компьютерного зрения с открытым исходным кодом • Реализована на C/C++, также разрабатывается для Python, Ruby, Matlab, Lua Поддерживаемые платформы • Microsoft Windows: – – – – – Microsoft Visual 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 Создание окон • int cvNamedWindow( const char* name, int flags ); — создаёт окно, в которое мы будем выводить наше изображение. – Первый параметр — название окна – Второй — его размер, 0 — даёт возможность изменять размер окна во время выполнения программы, но обычно указывается флаг CV_WINDOW_AUTOSIZE, который указывает, что окно будет ровно тех же размеров, что и загружаемое в него изображение. • void cvShowImage( const char* name, const CvArr* image );— эта функия отображает изображение в окне; – первый параметр — название окна для вывода картинки, – второй параметр — изображение для вывода. • int cvWaitKey( int delay=0 ); — эта функция останавливает программу и ожидает нажатия клавиши заданное число миллисекунд и продолжает программу, если ничего не нажато. Освобождение ресурсов • void cvReleaseImage( IplImage** image ); — функция освобождает память, выделенную под изображение и устанавливает указатель в NULL. void cvDestroyWindow( const char* name ); — эта функция закрывает окно и освобождает выделенную память. Структура изображения • IplImage – структур для хранения изображений • Наиболее часто используемые поля: – – – – – – – int nSize; int nChannels; int depth; int width; int height; char *imageData; int dataOrder; Загрузка изображения • IplImage* cvLoadImage( const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR ); — загружает картинку из файла. – filename — имя файла – iscolor — определяет как представить картинку iscolor > 0 — цветная картинка с 3-мя каналами iscolor == 0 — картинка будет загружена в формате GRAYSCALE (градации серого) iscolor < 0 — картинка будет загружена как есть Простейшая программа на OpenCV • #include <highgui.h> int main(int argc, 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. – Каскадный классификатор для эффективного совмещения множественных функций. Функции Харра • Функции Харра представляют собой прямоугольные волны одинаковой длины Интегральное Изображение для быстрого обнаружения функции Харра • Интегральное значение для каждого пикселя есть сумма всех пикселей над ним и слева от него. • Наличие функции Хаара определяется посредством вычитания среднего значения области темных пикселей из среднего значения области светлых пикселей. Если разница превышает порог (определяется в процессе обучения), тогда говорят, что функция является существующей. Метод машинного обучения AdaBoost Каскадный классификатор Работа с каскадами • CvHaarClassifierCascade * cascade – хранит данные классификатора, загруженного из xml файла. • Для загрузки XML-данных из файла можно использовать функцию cvLoad() – cascade=(CvHaarClassifierCascade*)cvLoad(cascad e_name, 0, 0, 0); Буфер памяти • CvMemStorage *storage; - динамически расширяемый буфер памяти. В него пишется перечень найденных лиц. • storage = cvCreateMemStorage(0); выделение памяти для буфера. • cvReleaseMemStorage(&storage); освобождение памяти буфера. Последовательности данных • Последовательности - это самостоятельно связанные списки разных структур. • Единственный вид объекта, который может храниться в хранилище памяти, является последовательность. • В OpenCV последовательности описываются структурой CvSeq. Структура CvSeq typedef struct CvSeq { int flags; // разные флаги int header_size; // размер заголовка последовательности CvSeq* h_prev; // горизонтально-предыдущая последовательность CvSeq* h_next; // горизонтально-следующая последовательность CvSeq* v_prev; // вертикально-предыдущая последовательность CvSeq* v_next // вертикально-следующая последовательность int total; // общее число элементов int elem_size; // размер элемента последовательности в байтах char* block_max; // максимальная граница последнего блока char* ptr; // текущий указатель на запись int delta_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 – вычисляет фильтр кени Поиск контуров на изображении • int cvFindContours(CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_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, CvScalar external_color, CvScalar hole_color, int max_level, int thickness=1, int line_type=8, CvPoint offset=cvPoint(0,0) ); отрисовывает контуры записанные в последовательность