Лекции opencv: 7. Работа с камерой, анализ фона и движения

22
с/к Анализ изображений, OpenCV 7. Работа с камерой, анализ фона и движения УрГУ / ИММ осень 2010 лекции и объявления: вопросы отправляйте на адрес www.uralvision.blogspot.com [email protected] http://people.rit.edu/andpph/photofile-misc/strobe-motion-ta-08.jpg

Upload: denis-perevalov

Post on 27-Jul-2015

9.552 views

Category:

Documents


19 download

TRANSCRIPT

Page 1: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

с/к Анализ изображений, OpenCV

7. Работа с камерой,анализ фона и движения

УрГУ / ИММ осень 2010лекции и объявления: вопросы отправляйте на адрес www.uralvision.blogspot.com [email protected]

http://people.rit.edu/andpph/photofile-misc/strobe-motion-ta-08.jpg

Page 2: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Работа с камерой

Page 3: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Получение кадров с камерыVideoCapture capture; //Класс для работы с камерами и видеофайламиcapture.open( 0 ); //открыть первую камеру (нумерация с 0)//а если задать строку VideoCapture capture.open( "myfile.avi" ); - будет читать avi-файл

if ( !capture.isOpened() ) { //если камеры нет, завершаем работуcout << "Нет камеры" << endl;return -1;} Mat image, smoothed, edges;for(;;) { capture >> image; // получение кадра cvtColor(image, smoothed, CV_BGR2GRAY);GaussianBlur(smoothed, smoothed, Size(7,7), 1.5, 1.5 ); Canny(smoothed, edges, 0, 30, 3 );imshow( "image", image );imshow("edges", edges); if(waitKey(30) >= 0) break; //ждем нажатия клавиши 30 мсек, если нажали - выход }

//Деструктор capture сам выключит камеруreturn 0;

Page 4: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Получение кадров с камеры

Page 5: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Калибровка камерыРассмотрим простейшую калибровку, когда камера смотрит сбоку на плоскость. (Есть более сложные методы калибровки, которые позволяют устранять искажения на краях изображения с камеры, связанные с неточностью оптики).

Исходное изображение Изображение с выделенными калибровочными точками

(углы красного 4-угольника)

Результат калибровки:изображение выровнено

Page 6: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Калибровка камеры1. Для проведения калибровки требуется указать координаты нескольких точек на изображения и указать, в какие точки они должны перейти.

Требуется не менее 4 точек для поиска перспективной проекции. При этом любые точки не должны лежать на одной прямой.

Примечание: координаты могут быть вещественными числами, что позволяет повысить точность результата. Для этого можно использовать субпиксельные методы, вычисляющие положение объектов с точностью выше, чем пиесел.

2. Затем с помощью функции getPerspectiveTransform вычисляется оптимальная матрица перспективное преобразование (методом типа МНК, что позволяет успешно использовать много точек, снятых с погрешностью).

3. Наконец, данная матрица подставляется в функцию warpPerspective для получения калиброванного изображения.

Page 7: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Калибровка камерыconst int K = 4; //будем использовать 4 точки. cv::Point2f src[K]; //координаты точек на изображенииcv::Point2f dst[K]; //координаты результирующих точек

src[ 0 ] = cv::Point2f( ..., ... ); //координаты углов на изображенииsrc[ 1 ] = cv::Point2f( ..., ... ); //должны идти по часовой стрелке с левого верхнего углаsrc[ 2 ] = cv::Point2f( ..., ... ); //- в соответствии с dst, см. нижеsrc[ 3 ] = cv::Point2f( ..., ... );

dst[ 0 ] = cv::Point2f( 0, 0 ); //результирующие точки; w и h - размеры результатаdst[ 1 ] = cv::Point2f( w, 0 ); dst[ 2 ] = cv::Point2f( w, h );dst[ 3 ] = cv::Point2f( 0, h );

Mat transform = getPerspectiveTransform( src, dst ); //вычисляем матрицу преобраз.

warpPerspective( image, imageResult, transform, cv::Size( w, h ), INTER_LINEAR );//получаем по входному изображению image результат - imageResult

Page 8: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Методы анализа фона

Page 9: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Методы анализа фона

Задача - вычислить пикселы, являющиеся фоном и не фоном.

Page 10: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

1. Запоминание фона

Запоминаем картинку фона, а затем смотрим отличие кадра с камеры от запомненной картинки.

Более продвинутый метод - "code book", он запоминает яркости фона в каждом пикселе некоторое время, что позволяет справляться с объектами типа открывающихся дверей.

Есть и более сложные алгоритмы.

Проблемы: - быстрое изменение освещения - надо специально учитывать,- тени от объектов часто воспринимаются какне фон, что обычно нежелательно, поэтомутакже надо специально учитывать (путем анализа цвета).

Page 11: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

2. Адаптивное обучение

Простой метод, в котором мы считаем фон путем усреднения последних N кадров

const float k = 0.01;back = (1-k) * back + k * image;это фильтр низких частот

Через несколько секунд объект, пришедший в кадр, становится фоном. Для некоторых задач это хорошо.

Плюс - не надо специально строить ситуацию когда в кадре никого нет для запоминания фона.

Есть более сложные алгоритмы автоматического вычисления фона с помощью учета нескольких кадров.

Page 12: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

3.Использование данных о глубине

1. Стерео камеры2. Камеры с вычислением времени полета (на основе лазерного дальномера, time of filght cameras)3. Kinect

Дают информацию о расстоянии до каждого пиксела, что позволяет отбросить дальние объекты, осуществив пороговую обработку глубины.

Page 13: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Анализ движения

Page 14: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Разность двух кадров - алгоритм"Детектора движения"1. Пусть image1, image2 - два последовательных кадра с камеры, одноканальных.2. Строим модуль их разностиMat diff;absdiff( image1, image2, diff);3. Осуществляем пороговую обработкуMat bin; //тут будут найдены пикселы, соответствующие областям движенияthreshold( diff, bin, 100 /* порог */, 255, CV_THRESH_BINARY );

Page 15: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Разность двух кадров - алгоритм"Детектора движения"

Данный метод позволяет находить области, к которых произошло движение.

Для анализа направления движения таких объектов - используется понятие оптического потока.

Page 16: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Что такое оптический потокОптический поток (optical flow, optic flow) - это векторное поле явного движения объектов, поверхностей и ребер в визуальной сцене, вызванное относительным движением между наблюдателем (глазом, камерой) и сценой.

http://www.ultimategraphics.co.jp/jp/images/stories/ultimate/BCC/optical.jpg

Обратите внимание: похоже, что точка обзора камеры движется вниз, но в малотекстурированной области поток не находится - так как локально пикселы в окрестностях не меняются

Page 17: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Основные применения оптического потока1. Для определения направления, в котором движутся объекты в кадре.

2. При производстве фильмов - для осуществления плавного морфинга между последовательными кадрами, либо между кадрами, снятыми соседними камерами (наиболее характерно это использовано в фильме "Матрица").

3. Принципиально можно применять в стереозрении - для определения расстояния до объекта с помощью анализа оптического потока кадров, поступающих с двух камер.

Page 18: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Методы вычисления оптического потокаВход: два кадра. Выход - векторное поле ( fx(x, y), fy(x,y) ) - вектора геометрического сдвига пикселов с первого кадра на второй. (I) Блочные ("наивные" методы) Для каждой точки ищется сдвиг, минимизирующий разность в локальном окне. (II) Дифференциальные (наиболее используемые)Оценка производных по x, y, t. 1. Lucas-Kanade - очень быстрый.2. Farneback - достаточно качественный, но работает медленней3. CLG - очень качественный, но пока не реализован в OpenCV4. Пирамидальный Lucas-Kanade, вычисляющийся только на "точках интереса"5. Horn-Schunk - не очень устойчивый к шумам

(III) На основе дискретной оптимизации (ресурсоемкие) Решение строится с помощью методов min-cut, max-flow, линейного программирования или belief propagation.

Page 19: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Методы вычисления оптического потока1. Lucas-KanadeЛокальный метод, использующий разложение Тейлора по времени t в окрестности каждого пиксела независимо.Достоинства: быстро вычисляется.Недостатки: "aperture problem" - на областях с однородной текстурой работает плохо в силу того, что он локальный.Реализован только в C-версии OpenCV, cvCalcOpticalFlowLK.

Поток, наложенный на изображение.Обратите внимание, что внутри ладони поток не найден.

Поток нарисован с шагом в 10 пикселов, функцией line. (Примечание: значения потока сглажены по окрестности для получения более устойчивого результата).

Page 20: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Методы вычисления оптического потока2. FarnebackЛокальный метод, использующий для расчета аппроксимацию изображения полиномиальной функцией.

Достоинства: заметно более устойчив к проблемы апертуры.

Недостатки: работает заметно медленней Lucas-Kanade.

Page 21: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Методы вычисления оптического потокаvoid calcOpticalFlowFarneback( const Mat& prevImg, //Первый кадр, 8-битное одноканальное изображение const Mat& nextImg, //Второй кадр, тип и размер как у prevImg Mat& flow, //Результирующий поток, будет иметь тип CV_32FC2 double pyrScale, //<1, масштаб построения пирамиды. 0.5 int levels, //Число уровней пирамиды 5 int winsize, //Окно усреднения. Чем больше - тем результат //более размытый, но и более устойчивы к шумам 5 int iterations, //Число итераций на каждом уровне пирамиды 3 int polyN, //Размер окна для вычисления аппроксимации //полиномом 7 double polySigma, //параметр гауссиана для сглаживания производных //при построении аппроксимации 1.5 int flags //флаги //OPTFLOW_USE_INITIAL_FLOW - не рекомендую использовать!! //OPTFLOW_FARNEBACK_GAUSSIAN - использовать гауссиан для усреднения //дает более точный результат в ущерб качеству. )

Page 22: Лекции OpenCV: 7. Работа с камерой, анализ фона и движения

Методы вычисления оптического потока3. CLG

"Combining Local and Global"Метод, объединяющий Lucas-Kanade и Horn-Schunk

Сейчас (2010 г.) он и его модификации считаются одними из лучших по соотношению качество / скорость.

Пока не реализован в OpenCV.

Сложная задача (на получение экзамена):найти реализацию CLG на C/C++, скомпилировать, и запустить на какой-то тестовой паре картинок.