Ð`ведение в - wl.unn.ru

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Государственное образовательное учреждение высшего профессионального
образования
«Нижегородский государственный университет им. Н.И. Лобачевского»
Радио физический факультет
Лаборатория физических основ беспроводной связи
“Введение в 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) ); отрисовывает контуры записанные в
последовательность
Download