Введение в OpenCV МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Государственное образовательное учреждение высшего профессионального образования «Нижегородский государственный университет им. Н.И. Лобачевского» Радио физический факультет Лаборатория физических основ беспроводной связи Выполнил: Миронов И.М.
OpenCV (Open Source Computer Vision) библиотека компьютерного зрения с открытым исходным кодом Реализована на C/C++, также разрабатывается для Python, Ruby, Matlab, Lua Введение
Поддерживаемые платформы Microsoft Windows: – Microsoft Visual C++ ( ,.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 и т. д.DFTDCT opencv_imgproc обработка изображений (фильтрация, геометрические преобразования, преобразование цветовых пространств и т. д.). opencv_highgui простой UI, ввод/вывод изображений и видео. opencv_ml статистические модели машинного обучения (SVM, деревья решений, обучение со стимулированием и т. д.).
Модули opencv_features2d распознавание и описание плоских примитивов (SURF, FAST и другие, включая специализированный фреймворк).SURF opencv_video анализ движения и отслеживание объектов (оптический поток, шаблоны движения, устранение фона).оптический поток opencv_objdetect обнаружение объектов на изображении (нахождение лиц с помощью алгоритма Виолы-Джонса (англ.), распознавание людей HOG и т. д.).алгоритма Виолы-Джонсаангл. opencv_calib3d калибровка камеры, поиск стерео- соответстсвия и элементы обработки трехмерных данных.
Модули opencv_flann библиотека быстрого поиска ближайших соседей (FLANN 1.5) и обертки OpenCV. opencv_contrib сопутствующий код, еще не готовый для применения. opencv_legacy устаревший код, сохраненный ради обратной совместимости. opencv_gpu ускорение некоторых функций OpenCV за счет CUDA, создан при поддержке NVidiaCUDA 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 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 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) ); - отрисовывает контуры записанные в последовательность