“Введение в 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.
Структура CvSeqtypedef 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) ); - отрисовывает контуры записанные в последовательность
Top Related