Разработка программно-аппаратного комплекса для анализа видеоизображения и управления видеокамерой средствами языка C/C++ и библиотеки Open CV в среде разработки QT Creator

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 06.06.2017
Размер файла 2,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Характеристики камеры.

Объектом управления является роботизированная PTZ камера модели SONYBRCH900P (рис. 3), способная поворачиваться вокруг своей оси от 0 до 360 градусов.

Рис. 3. Камера SonyBRCH900P

Рассмотрим ее характеристики, которые описаны в руководстве по эксплуатации, представленные в таблице 2.

Таблица 2. Технические характеристики камеры Sony BRCH900P

Датчик изображения

1/2-дюймовая CMOS матрица Exmor х3

Датчик изображения (число эффективных пикселей)

2,07 мегапикселя Ч3

Датчик изображения (общее число пикселей)

Прибл. 3,01 мегапикселя

Система сигналов

60 Гц: 1080/59.94i, 720/59.94P, NTSC 50 Гц: 1080/50i, 720/50P, PAL

Чувствительность

F10

Минимальная освещенность (50 IRE)

4 лк (50 IRE, F1,9, +24 дБ)

Горизонтальная четкость

> 1000 твл

(на выходе HD-SDI)

Отношение С/Ш

50 дБ

Усиление

Автоматический/Ручной режим (от -3 до +24 дБ)

Скорость затвора

1/8000 - 1/60 с или 1/8000 - 1/50 с

Регулировка экспозиции

Режимы Auto (Автоматический), Manual (Ручной), Priority (Приоритет) (приоритет затвора и приоритет диафрагмы), Back light (Компенсация встречного освещения), Spot light (Местное освещение)

Функция Color AE (Цветовая коррекция экспозиции)

Нет

Баланс белого

Auto (Автоматический)/Indoor (Внутри помещения)/Outdoor (Вне помещения)/One-push (Одним нажатием на кнопку)/Manual (Ручной)

Оптическое масштабирование

14x

Цифровое масштабирование

-

Система фокусировки

Автоматический/Ручной режим

Горизонтальный угол обзора

59,6° (широкий угол)

Фокусное расстояние

f = 5,8 - 81,2 мм F1,9 (Wide), F2,8 (Tele)

Минимальное расстояние до объекта

800 мм (31 Ѕ дюйма)

Угол панорамирования/наклона

Панорамирование: ±170° Наклон: +90°/-30°

Скорость панорамирования/наклона

Панорамирование: от 0,22° до 60°/с Наклон: от 0,22° до 60°/с

Предустановки положения

16

Выход HD видеосигнала

HD/SD-SDI (переключение) Компонентный (Y/Pb/Pr) или RGB, HD, VD или SYNC

Выход SD видеосигнала

Композитный, Y/C

Интерфейс управления камерой

RS-232C/RS-422(протокол VISCA)

Внешняя синхронизация Вход

Да

Auto ICR (Автоматически сдвигаемый режекторный ИК фильтр)

Нет

Wide-D

Нет

Стабилизация изображения

Да

Image Flip (Переворот изображения)

Вкл./ Выкл.

ND (нейтральный) фильтр

Нет

Color Gain (Усиление цвета)

Нет

Color Hue (Цветовой тон)

Нет

Color Matrix (Цветовая матрица)

Вкл./Выкл.

Color Detail (Цветовые детали)

Вкл./Выкл.

Skintone Detail (Детали телесного тона)

Нет

Гамма

STD1/STD2/STD3/STD4/CINE1/CINE2/CINE3/CINE4

Gamma Level (Уровень гаммы)

-99 ... 0 ... +99

Черный

-99 ... 0 ... +99

Black Gamma (Гамма черного)

-99 ... 0 ... +99

Knee Point (Точка колена)

50 ... 90 ... 109

Knee Slope (Наклон колена)

-99 ... 0 ... +99

Knee Sat Level (Уровень насыщенности в области колена)

0 ... 50 ... 99

Функция помощи при автофокусировке

Нет

Flicker Cancel (Подавление мерцаний)

Вкл./ Выкл.

B&W (Черно-белое изображение)

Нет

Color Bar (Сигнал цветных полос)

Вкл./ Выкл.

Камера может управляться через пульт управления, либо через интерфейсы RS232/RS422. Так как необходимо автоматизировать управление камерой без участия человека, то управлять камерой будет реализуемая программа с персонального компьютера с помощью интерфейса RS422, который описывался в предыдущей главе. Способ передачи по данному интерфейсу осуществляться с помощью особого протокола VISCA, который поддерживают только камеры модели SONY. Рассмотри данный протокол более детально.

С помощью протокола VISCA можно обеспечить полное управление функциями камеры, например, такими как, наклон, поворот, масштабирование, увеличение/уменьшение фокусного расстояния и т.п.

Для обмена данными по протоколу VISCA необходимо задать следующие параметры соединения, которые установлены в камере:

1) Скорость передачи бит в секунду: 9600 bps;

2) Число бит данных: 8;

3) Количество стартовых битов: 1;

4) Количество стоповых битов: 1;

5) Бит четности: нет. (Бит четности определяет четное или нечетное количество передаваемых единичных битов. На принимающей стороне проводится анализ этого бита, и если бит четности не соответствует количеству единичных битов, то пакет данных пересылается снова).

6) Контроль потока: нет (механизм, который притормаживает передатчик данных при неготовности приёмника).

Последовательная передача данных будет реализовываться асинхронным способом. Это подразумевает использование специальных битов, маркирующих начало и конец данных - стартового (логический ноль) и стопового (логическая единица) бита. Таким образом, каждый передаваемый байт будет выглядеть, как представлено на рис. 4.

Рис. 4 Формат одного передаваемого байта в протоколе VISCA.

Управление осуществляется с помощью отправки пакетов команд. Рассмотрим общую структуру пакета (рис. 5).

Рис. 5

Пакет может быть размером от 3х до 16 байт. Каждый пакет состоит из заголовка, который занимает 1 байт. В него входит адрес отправителя (контроллера) и адрес получателя (фактически, это номер камеры). Далее идет сама команда, которая может быть от 1 до 14 байт. Последний байт пакета всегда одинаковый, состоящий из восьми единиц в двоичном формате.

Далее рассмотрим основные команды, которые понадобятся в работе (таб. 3). Все команды представлены в шестнадцатеричном формате. Вместо “x” во всех командах указывается номер камеры (то есть ее адрес). После отправления команды, которая предполагает конкретное действие, приходит ответ:

1) z0 4y FF - команда принята;

2) z0 5y FF - команда выполнена, где z = адрес устройства + 8, y - номер разъема.

Если команда по каким-то причинам не выполнена, то приходит соответствующее сообщение об ошибке.

Таблица 3. Команды VISCA

Название команды

Действие

Пакет команды

Комментарии

POWER

Включение/выключение камеры

8x 01 04 00 0p FF

(p:2 - ON, 3 - OFF)

FOCUS

Ручная/автофокусировка

8x 01 04 38 0p FF

(p: 2 - Auto, 3 - Manual)

IF_Clear (Broadcast)

Очищает буфер

88 01 00 01 FF

Command Cancel

Отмена текущей команды

8x 2y FF

PAN-TILT Drive

Вверх

8x 01 06 01 VV WW 03 01 FF

WW - скорость наклона камеры вверх/вниз: 00-18; VV - скорость панорамирования (движения вправо/влево): 00-18

Вниз

8x 01 06 01 VV WW 03 02 FF

Вправо

8x 01 06 01 VV WW 02 03 FF

Влево

8x 01 06 01 VV WW 01 03 FF

Стоп

8x 01 06 01 VV WW 03 03 FF

Zoom

Приближение

8x 01 04 07 03 FF

Отдаление

8x 01 04 07 02 FF

Остановка

8x 01 04 07 00 FF

Для интерфейса RS-422 передача данных идёт по двум линиям, TXDIN- и TXDIN+, представляющим собой витую пару (два скрученных провода). Используется принцип дифференциальной передачи одного сигнала. По проводу TXDIN- идет исходный сигнал, по проводу TXDIN+ противофазный. Когда на одном проводе логическая 1, на другом логический 0 и наоборот. Этим достигается высокая устойчивость к синфазной помехе, действующей на оба провода одинаково. Электромагнитная помеха, проходя через участок линии связи, наводит в каждом проводе одинаковый потенциал, при этом информативная разность потенциалов остается без изменений.

На рис. 6 представлено обозначение выводов для интерфейса RS-422, где TXD (TransmittedData) - передающая линия; RXD (ReceivedData) - принимающая линия; GND - заземление.

Рис. 6 Обозначение выводов интерфейса RS-422

На рис. 7 представлена схема соединения по интерфейсу RS-422 между ПК и периферийным устройством.

Рис. 7 Соединение контроллера (ПК) и камеры через интерфейс RS-422

Получение изображения с камеры.

Для получения изображения с камеры использовалось программное обеспечение ManyCam, которое транслировало изображение с сервера управления камерой на персональный компьютер и представляло полученный видеопоток в виде передачи с виртуальной веб-камеры. Изображение транслировалось со скоростью 30 fps.

Таким образом, общая структура аппаратной реализации комплекса, представлена на рис.8 и 9. Отличие между двумя схемами в том, что в первой будет задержка получения изображения порядка 1 секунды. Во второй схеме задержка будет значительно меньше, что означает, что работу в режиме реального времени вполне можно реализовать. При разработке и тестировке использовалась первая схема из рисунка 8. Изображение с камеры поступает на персональный компьютер и через ManyCamразрабатываемая программа будет захватывать изображение, обрабатывать его, детектировать лицо человека и следить за ним, путем передачи команд камере через интерфейс RS422.

Рис. 8. Схема подключения на тестируемом оборудовании

Рис. 9. Схема подключения на реальном оборудовании

Работа с портом.

Открытие и инициализация порта.

Сначала откроем выбранный com порт на чтение-запись:

serial->open(QSerialPort::ReadWrite);

Зададим необходимые параметры для передачи по протоколу VISCA:

serial->setBaudRate(QSerialPort::Baud9600);

serial->setDataBits(QSerialPort::Data8);

serial->setParity(QSerialPort::NoParity);

serial->setStopBits(QSerialPort::OneStop);

serial->setFlowControl(QSerialPort::NoFlowControl);

Передача/чтение данных.

Передачу данных в com-порт будем осуществлять с помощью функции:

serial->write(command),

где command - это массив байтов, содержащий требуемую команду.

После передачи команды в порт поставим ограничение на запись на 200 мсек. Именно столько времени необходимо для передачи команды видеокамере. Считывание данных с com-порта будем проводить с помощью метода:

connect(serial,&QSerialPort::readyRead,this,&MainWindow::readData).

По сигналу readyRead(), который означает, что данные готовы к чтению, мы переходим к слоту readData(), где и осуществляется чтение с порта:

command_read.append(serial->readAll());

QByteArrayy=command_read.toHex();

Закрытие порта: serial->close();

3. Анализ видеоизображения. Детектор лица

3.1 Постановка задачи

Пусть - изображение с камеры в момент времени t, которое представляет собой совокупность изображений отдельных объектов (лиц) и фона:

,

где - лицо человека, F(x,y) - изображение фона; (x,y) Ѓё G - область определения изображения.

определён только на дискретном множестве точек D скоординатами Ѓё G. При этом,

,

где - дискретная область лица; D = ЃѕЃѕ… ЃѕЃѕ; D - дискретная прямоугольная решётка, в узлах которой определён снимок . Узлы решётки определяются координатами или их номерами (i,j), в которых задаётся цвет снимка в данной точке, что в совокупности определяет пиксель снимка.

Таким образом, исходное изображениеможно рассматривать как прямоугольную целочисленную решётку P, узлы которой являются пикселями:

P ={p(i, j) | i = 1,N, j = 1,M},

где i, j - целочисленные координаты (номера) пикселя; p(i, j)Ѓё{0, 1} - цветовой компонент пикселя.

Задача: найти множество точек (i,j)Ѓё, для которых .

3.2 Метод Виолы-Джонса

По итогам проведенного обзора было принято решение использовать метод категориального распознавания объектов на изображении. В настоящий момент самым популярным в силу высокой скорости и эффективности является представленный в 2001 году метод Виолы - Джонса. Этот детектор обладает низкой вероятностью ложного обнаружения лица. Алгоритм также хорошо работает и распознает черты лица под небольшим углом, примерно до 30 градусов, а так же при различных условиях освещенности. На момент написания алгоритм является основополагающим для поиска объектов на изображении в реальном времени в большинстве существующих методов распознавания и идентификации.

В 2001 году Виола и Джон предложили алгоритм для распознавания лиц, который стал прорывом в области распознавания лиц. Метод использует технологию скользящего окна. То есть рамка, размером, меньшим, чем исходное изображение, двигается с некоторым шагом по изображению, и с помощью каскада слабых классификаторов определяет, есть ли в рассматриваемом окне лицо. Метод скользящего окно эффективно используется в различных задачах компьютерного зрения и распознавания объектов.

Метод состоит из 2-х подалгоритмов: алгоритм обучения и алгоритм распознавания. На практике скорость работы алгоритма обучения не важна. Крайне важна скорость работы алгоритма распознавания. По введенной ранее классификации можно отнести к структурным, статистическим и нейронным методам.

Метод имеет следующие преимущества:

· возможно обнаружение более одного лица на изображении;

· использование простых классификаторов показывает хорошую скорость и позволяет использовать этот метод в видеопотоке.

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

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

Обобщенная схема распознавания в алгоритме Виолы-Джонса показана на рисунке 10.

Рис. 10. Обобщенная схема распознавания метода Виолы-Джонса

Обобщенная схема алгоритма выгляди следующим образом: перед началом распознавания алгоритм обучения на основе тестовых изображений обучает базу данных, состоящую из признаков, их паритета и границы. Подробнее о паритете, признаке и границе будет рассказано в следующих пунктах. Далее алгоритм распознавания ищет объекты на разных масштабах изображения, используя созданную базы данных. Алгоритм Виолы-Джонса на выходе дает всё множество найденных необъединенных объектов на разных масштабах. Следующая задача - принять решение о том, какие из найденных объектов действительно присутствуют в кадре, а какие - дубли.

В качестве признаков для алгоритма распознавания авторами были предложены признаки Хаара, на основе вейвлетов Хаара. Они были предложены венгерским математиком Альфредом Хааром в 1909 году.

В задаче распознавания лиц, общее наблюдение, что среди всех лиц области глаз темнее области щек. Рассмотрим маски, состоящие из светлых и темных областей.

Рис. 11. Признаки Хаара

Каждая маска характеризируется размером светлой и темной областей, пропорциями, а также минимальным размером. Совместно с другими наблюдениями были предложены следующие признаки Хаара, как пространство признаков в задаче распознавания для класса лиц.

Рис. 12. Признаки Хаара

Признаки Хаара дают точечное значение перепада яркости по оси X и Y соответственно. Поэтому общий признак Хаара для распознавания лиц представляет набор двух смежных прямоугольников, которые лежат выше глаз и на щеках. Значение признака вычисляется по формуле:

F=X-Y

где X - сумма значений яркостей точек закрываемых светлой частью признака, а Y - сумма значений яркостей точек закрываемых темной частью признака. Видно, что если считать суммы значений интенсивностей для каждого признака это потребует значительных вычислительных ресурсов. Виолой и Джонсом было предложено использовать интегральное представление изображения, подробнее о нем будет далее. Такое представление стало довольно удобным способом вычисления признаков и применяется также и в других алгоритмах компьютерного зрения, например SURF. Обобщенная схема алгоритма обучения выглядит следующим образом. Имеется тестовая выборка изображений. Размер тестовой выборки около 10 000 изображений. На рисунке 13 показан пример обучающих изображений лиц. Алгоритм обучения работает с изображениями в оттенках серого.

Рис. 13. Пример обучающих изображений

При размере тестового изображения 24 на 24 пикселя количество конфигураций одного признака около 40 000 (зависит от минимального размера маски). Современная реализация алгоритма использует порядка 20 масок. Для каждой маски, каждой конфигурации тренируется такой слабый классификатор, который дает наименьшую ошибку на всей тренировочной базе. Он добавляется в базу данных. Таким образом алгоритм обучается. И на выходе алгоритма получается база данных из T слабых классификаторов. Обобщённая схема алгоритма обучения показана на рисунке 14.

Рис. 14. Обобщенная схема алгоритма обучения

Обучение алгоритма Виола-Джонса - это обучение алгоритма с учителем. Для него возможно такая проблема как переобучение. Показано, что AdaBoost может использоваться для различных проблем, в том числе к теории игр, прогнозировании. В данной работе условие остановки является достижение заранее заданного количества слабых классификаторов в базе.

Для алгоритма необходимо заранее подготовить тестовую выборку из l изображений, содержащих искомый объект и n не содержащих. Тогда количество всех тестовых изображений будет:

где X - множество всех тестовых изображений, где для каждого заранее известно присутствует ли искомый объект или нет и отражено во множестве Y.

где:

Под признаком j будем понимать структуру вида:

Тогда откликом признака будет f_j (x), который вычисляется как разность интенсивностей пикселей в светлой и темной областях. Слабый классификатор имеет вид:

Задача слабого классификатора - угадывать присутствие объекта в больше чем 50% случаев. Используя процедуру обучения AdaBoost создается очень сильный классификатор состоящий из T слабых классификаторов и имеющий вид:

Целевая функция обучения имеет следующий вид:

Интегральное представление можно представить в виде матрицы, размеры которой совпадают с размерами исходного изображения I, где каждый элемент рассчитывается так:

где I(r,c) -- яркость пиксела исходного изображения.

Каждый элемент матрицы II[x,y] представляет собой сумму пикселов в прямоугольнике от (0,0) до (x,y). Расчет такой матрицы занимает линейное время. Для того, чтобы вычислить сумму прямоугольной области в интегральном представлении изображения требуется всего 4 операции обращения к массиву и 3 арифметические операции. Это позволяет быстро рассчитывать признаки Хаара для изображения в обучении и распознавании.

Например, рассмотрим прямоугольник ABCD.

Сумму внутри прямоугольника ABCD можно выразить через суммы и разности смежных прямоугольников по формуле:

Перед началом обучения инициализируются веса , где q - номер итерации, i-номер изображения.

После процедуры обучения получится T слабых классификаторов и T значений.

На каждой итерации цикла происходит обновление весов так, что их сумма будет равна 1. Далее для всех возможных признаков происходит подбор таких значений p,и,j что значение ошибки будет минимально на этой итерации. Полученный признак J(t) (на шаге t) сохраняется в базу слабых классификаторов, обновляются веса и вычисляется коэффициент .

В предложенном в 2001 году оригинальном алгоритме не была описана процедура получения оптимального признака на каждой итерации. Предполагается использование алгоритма AdaBoost и полный перебор возможных параметров границы и паритета.

После обучения на тестовой выборке имеется обученная база знаний из T слабых классификаторов. Для каждого классификатора известны: признак Хаара, использующийся в этом классификаторе, его положение внутри окна размером 24х24 пикселя и значение порога E.

На вход алгоритму поступает изображение I(r,c) размером WхH, где I(r,c) - яркостная составляющая изображения. Результатом работы алгоритма служит множество прямоугольников R(x,y,w,h), определяющих положение лиц в исходном изображении I.

Алгоритм сканирует изображение I на нескольких масштабах, начиная с базовой шкалы: размер окна 24х24 пикселя и 11 масштабов, при этом каждый следующий уровень в 1.25 раза больше предыдущего, по рекомендации авторов. Алгоритм распознавания выглядит следующим образом:

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

Структура классификатора:

где maxWeakCount - количество слабых классификаторов;

stageThereshold - максимальный порог яркости;

weakClassifiers - набор слабых классификаторов, на основе которых выносится решение о том, находится объект на изображении или нет;

internalNodes и leafValues - параметры конкретного слабого классификатора.

Первые два значения в internalNodes не используются, третье -- номер признака в общей таблице признаков (она располагается в XML-файле под тегом features), четвертое -- пороговое значение слабого классификатора. Если значение признака Хаара меньше порога слабого классификатора, выбирается первое значение leafValues, если больше -- второе.

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

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

3.3 Программная реализация

Для реализации метода трекинга будем использовать две обученные модели детектирования фронтального лица и лица в профиль:

CvHaarClassifierCascade*cascade_frontal_face=(CvHaarClassifierCascade*)cvLoad("D:/openCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml",0,0,0);

CvHaarClassifierCascade*cascade_profile_face=(CvHaarClassifierCascade*)cvLoad("D:/openCV/opencv/sources/data/haarcascades/haarcascade_profileface.xml",0,0,0);

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

Захватив изображение с камеры переводим в градации серого:

cvCvtColor(frame,gray,CV_RGB2GRAY);

· frame - входное изображение,

· gray - выходное,

· CV_RGB2GRAY- конвертирование из RGB-пространства в оттенки серого (значение интенсивности вычисляется как взвешенная линейная свертка интенсивностей по всем трем каналам R, G, B):

Y = 0.3R + 0.59G + 0.11B

Далее полученное изображению передаем в функцию, реализующую детектор лица Виолы-Джонса:

cvHaarDetectObjects(gray, cascade, MemStorage, 1.1, 3, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, cvSize(50, 50))

1) gray - целевое изображение, к которому применяется каскад;

2) cascade - обученная модель

3) MemStorage - хранилище памяти

4) 1.1 - коэффициент увеличения масштаба

5) 3 - минимальный соседний порог

6) CV_HAAR_FIND_BIGGEST_OBJECT - находит наибольшее лицо

7) CV_HAAR_SCALE_IMAGE

8) cvSize(50, 50) - минимальный размер, по которому производится поиск, нужно задать как можно меньше, так как какой масштаб лица будет - не определено.

На выходе функции получаем минимальный ограничивающий прямоугольник, содержащий лицо человека и передаем его модулю слежения:

CvRect (x,y,width,height),

где (x,y) - координаты нижней левой точки прямоугольника, width- ширина, height - высота.

В общем, алгоритм в цикле while() можно представить следующими шагами:

1. Получение нового изображения.

2. Детектирование лица в фронтал

3. Если лицо не найдено, то используется другая модель для поиска лица в профиль.

4. Если лицо не найдено, то возвращение к шагу 1, иначе выход из цикла и передача управления в модуль слежения за объектом.

4. Анализ видеоизображения. Слежение за лицом

4.1 Постановка задачи

Пусть - полученная прямоугольная область изображения лица от детектора лиц с камеры в момент времени t. Множество точек лица .

Пусть множество I=- это изображение в каждый момент времениt от 0 до k, где tдискретно.

Рассмотрим:

,

где - изображение фона; (x,y) Ѓё G - область определения изображения.

Задача: найти на изображении .

Таким образом, на вход алгоритма подается последовательность кадров и координаты точек, которые необходимо отслеживать. На выходе алгоритма мы должны получить траекторию точек как набор смещений точки между кадрами.

4.2 Метод Лукаса-Канаде

Одномерный случай.

Для начала рассмотрим одномерный случай.

Представим себе два одномерных кадра 1 пиксель в высоту и 20 пикселей в ширину. На втором кадре изображение немного будет смещено вправо. Именно это смещение мы и хотим найти. Для этого представим эти же кадры в виде функций (рисунок 15). На входе позиция пикселя, на выходе -- его интенсивность. В таком представление искомое смещение (d) видно еще более наглядно. В соответствии с нашим предположением, это просто смещенная , то есть можем сказать, что .

Рис. 15

Обратите внимание, что и при желании можно записать и в общем виде: ; где y и t зафиксированы и равны нулю.

Для каждой координаты нам известны значения и в этой точке, кроме того мы можем вычислить их производные. Свяжем известные значения со смещением d. Для этого запишем разложение в ряд Тейлора для :

Сделаем второе важное предположение: предположим, что достаточно хорошо аппроксимируется первой производной. Сделав это предположение, отбросим всё, что после первой производной:

Тут мы теряем в точности, если только наша функция/изображение не строго линейна, как в нашем искусственном примере. Зато это существенно упрощает метод, а для достижения требуемой точности можно сделать последовательное приближение, которое мы рассмотрим позже.

Смещение d -- это наша искомая величина, поэтому надо что-то сделать с . Как мы условились ранее, , поэтому просто перепишем:

То есть:

Теперь перейдем от одномерного случая к двумерному. Запишем разложение в ряд Тейлора для и сразу отбросим все старшие производные. Вместо первой производной появляется градиент:

Где -- вектор смещения.

В соответствии со сделанным допущением . Обратите внимание, что это выражение эквивалентно . Это то, что нам нужно. Перепишем:

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

Перепишем:

Перепишем ещё раз, раскрыв градиент:

Мы получили уравнение, которое говорит нам о том, что сумма частных производных должны быть равна нулю. Проблема только в том, что уравнение у нас одно, а неизвестных в нем два: и . На этом моменте начинается полет фантазии и разнообразие подходов.

Сделаем третье предположение: предположим, что соседние пиксели смещаются на одинаковое расстояние. Возьмем фрагмент изображения, скажем 5 на 5 пикселей, и условимся, что для каждого из 25 пикселей и равны. Тогда вместо одного уравнения мы получим сразу 25 уравнений! Очевидно, что в общем случае система не имеет решения, поэтому будем искать такие и , которые минимизируют ошибку:

Здесь g -- это функция, определяющая весовые коэффициенты для пикселей. Самые распространенный вариант -- двухмерная гауссиана, которая дает наибольший вес центральному пикселю и все меньший по мере удаления от центра.

Чтобы найти минимум воспользуемся методом наименьших квадратов, найдем её частные производные по и :

Перепишем в более компактной форме и приравняем к нулю:

Перепишем эти два уравнения в матричной форме:

где

Если матрица М обратима (имеет ранг 2), можем вычислить и , которые минимизируют ошибку E:

Вот собственно и все. Мы знаем приблизительное смещение пикселей между двумя соседними кадрами.

Рис. 16

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

Описанный выше метод основан на трех значительных допущениях, которые с одной стороны дают нам принципиальную возможность определить оптический поток, но с другой стороны вносят погрешность. Мы предполагали, что для аппроксимации смещения нам будет достаточно первой производной. В общем случае это конечно же не так (рисунок 16). Для достижения требуемой точности смещение для каждой пары кадров (назовём их и ) можно вычислять итеративно. В литературе это называется искажением (warping). На практике это означает, что, вычислив смещения на первой итерации, мы перемещаем каждый пиксель кадра в противоположную сторону так, чтобы это смещение компенсировать. На следующей итерации вместо исходного кадра мы будем использовать его искаженный вариант . И так далее, пока на очередной итерации все полученные смещения не окажутся меньше заданного порогового значения. Итоговое смещение для каждого конкретного пикселя мы получаем как сумму его смещений на всех итерациях.

По своей природе данный метод является локальным, то есть при определении смещения конкретного пикселя принимается во внимание только область вокруг этого пикселя -- локальная окрестность. Как следствие, невозможно определить смещения внутри достаточно больших (больше размера локальной окрестности) равномерно окрашенных участков кадра. К счастью на реальных кадрах такие участки встречаются не часто, но эта особенность все же вносит дополнительное отклонение от истинного смещения. Ещё одна проблема связана с тем, что некоторые текстуры в изображении дают вырожденную матрицу М, для которой не может быть найдена обратная матрица. Соответственно, для таких текстур мы не сможем определить смещение. То есть движение вроде есть, но непонятно в какую сторону. В общем-то от этой проблемы страдает не только рассмотренный метод. Даже глаз человека воспринимает такое движение не однозначно.

4.3 Выбор оптимальных параметров

Для реализации алгоритма на C/С++ понадобится функция вычисления оптического потока:

cvCalcOpticalFlowPyrLK(prev_img, current_img, previous_pyramid, current_pyramid, prev_points, current_points, count_point, cvSize(20, 20), n, status, 0, tc, flags);

Рассмотрим ее параметры:

1) prev_img - изображение, полученное на предыдущей итерации

2) current_img - изображение на текущей итерации

3) previous_pyramid - буфер для пирамиды предыдущего изображения

4) current_pyramid - буфер для хранения пирамиды текущего изображения

5) prev_points - точки, положение которых необходимо определить

6) current_points - новые координаты точек

7) count_point - количество найденных точек

8) cvSize - размер окна поиска на каждом уровне пирамиды

9) n - количество используемых уровней пирамид

10) Status - массив, элементы которого равны либо 1 (поток есть), либо 0 (потока нет).

11) 0 - массив, содержащий значения изменений в окрестности между исходной точкой и новой точкой, может быть равен нулю

12) Tc - критерии прекращения итерационного алгоритма поиска на пирамиде (после указанного максимального числа итераций criteria.maxCount, или когда окно поиска станет меньше, чем criteria.epsilon)

13) Flags:

CV_LKFLOWPyr_A_READY - пирамида для первого изображения вычисляется до вызова функции;

CV_LKFLOWPyr_B_READY - пирамида для второго изображения вычисляется до вызова функции;

CV_LKFLOW_INITIAL_GUESSES - исходный массив B, содержащий текущие координаты точек создается до вызова.

Задача: определить, при каких значениях входных параметров n,cvSize и Tc алгоритм будет иметь минимальную ошибку вычисления и минимальное время обработки на заданном множестве возможных значений параметров. Так как требование минимальной ошибки и минимального времени обработки противоречивы, то необходимо оптимальное соотношение между этими величинами. То есть необходимо решить задачу многокритериальной оптимизации.

Сначала необходимо исказить изображения, чтобы создать выборку для исследования алгоритма трекинга. Алгоритм этих преобразований описан ниже:

1. Выбор 10 произвольных изображений, на каждом из которых случайным образом отмечена точка (её координаты записываются в файл).

2. Выбор одного изображения выборки.

3. К выбранному изображению последовательно применяются аффинные преобразования (масштабирование и параллельный перенос). В результате получается новое изображение. Новые координаты точки, отмеченной в п. 1 на исходном изображении, сохраняются в файл.

4. К полученному в предыдущем пункте изображению применяются аффинные преобразования. В результате получается новое изображение и новые координаты точки.

5. Процесс продолжается по аналогии еще 98 раз. Таким образом, получается 100 новых изображений (и отмеченных на них точек) для одного изображения исходной выборки

6. Выбор следующего изображения из исходной выборки и для него повторяются действия пунктов 3-5. В итоге получилось 10 выборок по 100 изображений в каждой. После применения аффинных преобразований вычисляются координаты точек: аналитически и с помощью алгоритм трекинга Lucas-Kanade.

Для каждой пары точек ошибка вычислялась следующим образом: пусть (,) - координаты точки, полученной с помощью аналитического расчёта, а (,) - координаты точки, полученной с помощью алгоритма трекинга. Тогда ошибка eвычисляется как среднеквадратичное расстояние между аналитическим расчётом координат точки и расчётом координат этой же точки с помощью алгоритма Lucas-Kanade, по формуле:

Ниже приведена общая последовательность действий по анализу значений параметров алгоритма трекинга:

1. Фиксируются параметры алгоритма трекинга.

2. Берется множество из 100 искаженных изображений, сгенерированных ранее и соответствующих одному из изображений исходной выборки, и для каждых двух последовательных изображений множества вычисляется ошибка и время работы алгоритма. В конце вычисляется средняя ошибка и среднее время работы алгоритма.

3. Шаг 2 повторяется для каждых 100 изображений, соответствующих изображениям исходной выборки. В итоге мы имеем 10 значений средней ошибки и 10 значений среднего времени работы алгоритма.

4. Усредняются средние значения, полученные на предыдущем шаге. Результаты заносятся в таблицу (см. Таблица 3).

5. Изменяется значение одного из параметров алгоритма (n,cvSize), а затем повторяются шаги 2-5 до тех пор, пока все возможные сочетания параметров алгоритма (из заданных интервалов) не будут перебраны.

Параметр n будем изменять от 1 до 4 с шагом 1, а параметр cvSize от 3 до 59 с шагом 2. В таблице 3 приведена часть полученных результатов.

Таблица 3. Зависимость ошибки и времени работы алгоритма слежения от входных параметров

n

CvSize

Среднее отклонение

Среднее время

1

3

118,594124

0,001825

1

5

115,657422

0,001594

1

7

72,6525211

0,001363

1

9

68,7998512

0,001132

1

11

64,9471813

0,000901

1

13

61,0945114

0,00067

1

15

57,2418415

0,000439

1

17

53,3891716

0,00067

1

19

49,5365017

0,000901

1

21

45,6838318

0,001132

1

23

41,8311619

0,001363

1

25

37,978492

0,001594

1

27

34,1258221

0,001825

1

29

30,2731522

0,002056

1

31

26,4204823

0,002287

1

33

22,5678124

0,002518

1

35

18,7151425

0,002749

1

37

14,8624726

0,00298

1

39

11,0098027

0,003211

1

3

138,594124

0,001825

1

5

124,657422

0,001594

1

7

72,6525211

0,001363

1

9

68,7998512

0,001132

Выберем оптимальные параметры по критерию Парето.

Опр. Решение X2 называется доминируемым, если существует решение X1, не хуже чем X2, т.е. для любой оптимизируемой функции Fi, I=1, 2, …, m,

Fi(X2)Fi(X1) при максимизации функции Fi,

Fi(X2)Fi(X1) при минимизации Fi.

В случае доминирования при переходе от X2 к X1 ничего не будет проиграно ни по одному из частных критериев, но в отношении j - го частного критерия точно будет получен выигрыш. Говорят, что решение X1 лучше (предпочтительнее) решения X2[20].

Согласно данному определению получим следующие параметры:

n=4, winSize=(20; 20).

4.4 Программная реализация алгоритма

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

На вход модуля поступают координаты минимального ограничивающего прямоугольника, полученного от модуля-детектора лица:

CvRect (x,y,width,height).

Задача: найти смещение лица, находящегося внутри этой области.

Далее работа, как и для детектора лиц, будет проходить в бесконечном цикле while(), выход из которого возможен либо нажатием клавиши пользователя, либо при потере объекта слежения.

Алгоритм в цикле while():

1. Получение нового изображение.

2. Покроем прямоугольник лица равномерной сеткой:

const int step_x = face_rect.width*s / 16;

const int step_y = face_rect.height *s/ 16;

где s -коэффициент масштабирования.

В узлах этой сетки как раз те точки, для которых будет вычисляться оптический поток.

3. Вычислим оптический поток в вышеописанной функции, на выходе получаем новое положение точек в текущей итерации.

4. Проверяем количество точек соответствию порогу:

count_point<30.

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

5. Удаляем точки, не найденные на текущей итерации.

6. Вычисляем координаты централица на изображении C(x,y):

,

,

где - координаты точек, для которых найден оптический поток,n - их количество.

7. Строим новую ограничивающую прямоугольную область, а точнее смещаем вычисленный детектором лица прямоугольник на новое положение с центром C(x,y).

8. Удаляем точки, которые не попали в новый прямоугольник. Таким образом, решаем проблему «отставших» точек.

9. Выводим на экран найденные точки.

10. Возвращаемся к шагу один.

В результате на каждой итерации будем получать два изображения (рис. 17): первое (справа) - цветное с ограничивающим прямоугольником, определяющий положение лица на картинке, а второе (слева) - изображение в градациях серого с изображением всех точек, для которых вычислен оптический поток.

Рис. 17. Выходное изображение

5. Управление поворотом камеры

Цель настоящей главы -- создание математической модели перенацеливания используемой поворотной камеры, экспериментальная проверка ее адекватности и внедрение ее в разрабатываемый комплекс.

5.1 Постановка задачи

Рассмотрим постановку задачи в терминах ТАУ. Пусть g - координата центра изображения, а x(t) - положение объекта в текущий момент времени на плоскости изображении, тогда величина рассогласования будет равна:

Связь между скоростью перемещения камеры на изображении и угловой скоростью вращения можно выразить через следующую формулу:

,

где K - коэффициент пропорциональности. -угловая скорость вращения камеры, постоянная величина

Скорость движения объекта на изображении:

Цель управления:

Рис. 18. Математическая модель камеры

Для наблюдения за целевым объектом на заданном участке местности необходимо выработать соответствующие управления поворотной камерой так, чтобы в каждый текущий момент времени камера была направлена в сторону целевого объекта, например в его «центр». Видеокамера имеет две степени свободы, которая устроены следующим образом: камера крепится на одном приводе (привод 1), который в свою очередь крепится на другом приводе (привод 2). Камера установлена на приводе 1 таким образом, что оптическая ось ее объектива пересекает ось вращения этого привода и перпендикулярна ей; оси вращения приводов взаимно перпендикулярны. Примем, что привод 1 предназначен для вращения камеры по азимуту («влево-вправо»), а привод 2 - для вращения камеры по склонению («вверх-вниз»). При работе с поворотной камерой при помощи команд можно изменять направление объектива, вращая камеру вокруг осей двух приводов. В данной работе для упрощения задачи будем управлять только смещением привода 1.

Требуется решить задачу перенацеливания камеры на подвижный объект с известными координатами (x,y) на поверхности наблюдения, то есть, найти такой угол б поворота привода 1, которые переведут вектор наблюдения на точку (x,y). Полагаем, что y=const.

5.2 Перенацеливание на заданную точку поверхности

Далее будем считать, что наблюдаемая поверхность, то есть изображение с камеры представляет собой плоскость. Введем декартову систему координат для камеры так, что ось вращения первого привода совпадает с . Положим, что вращение камеры, если рассматривать его по направлению оси вращения, осуществляется по часовой стрелке вокруг оси . Зафиксируем начальное положение камеры таким образом, чтобы она была расположена (под расположением камеры будем понимать точку пересечения оптической оси объектива камеры и оси вращения первого привода) на известном расстоянии H от плоскости наблюдения и направлена перпендикулярно к ней, а оси и были параллельны этой плоскости. Выберем декартову прямоугольную систему координат так, чтобы в начальном положении камера располагалась на оси Oz в точке C = (0, 0, H) и была направлена в начало координат (плоскость наблюдения при этом совпадет с плоскостью Oxy), а оси Ox и Oy были сонаправлены осям и соответственно.

Пусть требуется направить камеру, находящуюся в начальном положении, на некоторую точку =(, , 0), расположенную на плоскости Oxy. Для этого необходимо повернуть камеру сначала вокруг оси на некоторый угол A (|A| </2). Вычислим углы поворота A. Абсцисса точки легко вычисляется из треугольника : =(HtgA, , 0). Так как нас интересует только смещение вдоль оси x, то.

Величина нам известна - это смещение относительно центра, получаемое в результате работы алгоритма слежения за объектом в момент времени t. Таким образом, можно найти угол A:

.

Рис. 19. Нахождение угла поворота

5.3 Модель принятия решений

Данная глава будет посвящена построению модели принятия решений для управления движением камеры.

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

В данном случае мы будем рассматривать смещение на изображении центра области лица по координатам x. Под центром лица подразумевается сумма координат всех точек, где есть оптический поток в момент времени t, разделенная на их количество n:

Так как управление будет происходить только по координате x, то обозначим просто .

Таким образом, на входе будут следующие исходные данные:

1) - центр изображения, где, - разрешение изображения.

2) -положение центра лица в текущий момент времени

3) - положение центра лица в предыдущий момент времени.

Теперь необходимо сформулировать правила, по которым будет приниматься решение куда смещать камеру.

Введем систему координат на плоскости изображения, центром в точке .

Рассмотрим значение d: в данном случае эторегулируемая величина, по сути это «коридор», находясь в котором центр объекта считается расположенной в центре экрана.

В общем, алгоритм принятия решений можно представить в виде модели дерева (рис. 20).

Есть три 4 варианта действий:

14) 0 - остановка камеры;

15) 1 - смещение камеры вправо;

16) 2- смещение камеры влево

17) 4 - никаких действий не предпринимается.

Данный алгоритм легко реализуется наC++.

Рис. 20. Алгоритм принятия решений

6. Исследование системы

6.1 Оценка точности перенацеливания

Рассмотрим расхождения значений положения центра экрана и центра лица, вычисленные при наведении на неподвижный объект.

Отклонение:

1.06415

3.70325

4.80161

4.72842

3.26971

8.73123

5.85681

2.43057

1.98102

1.77615

1.58008

3.75018

Среднее отклонение = 3,6394 пикс.

6.2 Проверка на устойчивость к смене освещения

Было проведено 100 испытаний, в ходе которых происходила резкая смена освещения при слежении за объектом. В результате в 94 случая из 100 объект детектировался заново и успешно отслеживался. В 6 случаях и 100 программа не могла заново найти объект.

6.3 Время задержки

Время задержки измерялось с момента подачи команды управления на поворот камеры и до момента появления смещения на изображении:

Данная задержка измерялась на тестируемом оборудовании, где изображение передавалось через локальную сеть, чем и объясняется такая величина. В технической среде, где будет внедрен комплекс, измеренная средняя задержка составила:

Данная величина вполне соответствует условиям выполнения в режиме реального времени.

6.4 Устойчивость при частичном перекрытии объекта

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

6.5 Анализ влияния шумов

Рассмотрим видеоизображение, полученное с веб-камеры с разрешением 640x480. Будем вычислять значение заранее заданной неподвижной точки в каждый момент времени и сравнивать ее значение в предыдущий момент.

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

Таблица 4. Результаты наблюдений

1.02921

0.115829

1.48715

0.295242

1.3222

1.09048

0.992188

0.382339

1.0459

0.894623

1.3714

1.3714

0.786346

1.1476

1.45007

1.28172

1.03217

1.22472

0.734528

0.68219

0.671539

0.737686

1.22433

0.452148

1.21979

0.807755

0.661194

1.25108

= 1.0734 пикс.

=0,8382 пикс.

Из данных результатов можно сделать вывод, что детектирования мелких объектов, а тем более их смещение в таком изображении не будет осуществляться с требуемой точностью.

7. Листинг программы

программный нейронный видеопоток детектирование

Файл Mainwindow.h

#ifndefMAINWINDOW_H

#defineMAINWINDOW_H

#include<opencv2/core/core.hpp>

#include<opencv2/features2d/features2d.hpp>

#include<opencv2/highgui/highgui.hpp>

#include<opencv2/imgproc/imgproc.hpp>

#include<opencv2/nonfree/nonfree.hpp>

#include<opencv2/objdetect/objdetect.hpp>

#include<QtSerialPort/QSerialPort>

#include<QtSerialPort/QSerialPortInfo>

#include"cv.h"

#include"highgui.h"

#include<stdio.h>

#include<ctype.h>

#include<QMainWindow>

#include<opencv\cv.h>

#include<iostream>

#include<stdlib.h>

#include<QDebug>

#include<algorithm>

#include<limits>

#include<time.h>

#include<math.h>

#include"myport.h"

#include<QThread>

#include"tracking.h"

#undefmin

#undefmax

namespaceUi{

classMainWindow;

}

classMainWindow:publicQMainWindow

{

Q_OBJECT

public:

explicitMainWindow(QWidget*parent=0);

~MainWindow();

IplImage*first_img;

//intadd_pt;

MyPort*port422;

//CvPoint2D32f*window_center;

IplImage*image;//длядетектированиялица

CvRecttarget;//интересующаяобласть

CvPointpt;

CvPoint2D32fwindow_center;

CvPoint2D32fprev_mass_center;

CvPoint2D32fmass_center;

boolobject_moving;

floatsum;

//CvPoint2D32fmass_center_next;

//CvRectface_size;

booldetect_face(IplImage*gray,CvHaarClassifierCascade*haar_cascade,CvMemStorage*mem_storage,CvRect&face_rect);

QSerialPort*serial;

QByteArraycommand_read;

QByteArraycommand;

//unsignedcharcamera_id;

voidinit(constIplImage*gray,constCvRect&face_rect);

voiddeinit();

boolobject_tracking(IplImage*gray,CvRect&face_rect);

signals:

voidsend_command(QByteArraycommand);

privateslots:

voidon_pushButton_up_clicked();

voidon_pushButton_down_clicked();

voidon_pushButton_left_clicked();

voidon_pushButton_right_clicked();

voidon_pushButton_clicked();

private:

Ui::MainWindow*ui;

IplImage*prev_img;

IplImage*current_img;

IplImage*previous_pyramid;

IplImage*current_pyramid;

intcount_point;

CvPoint2D32f*current_points;

CvPoint2D32f*prev_points;

char*status;

CvTermCriteriatc;

intflags;

};

#endif//MAINWINDOW_H

Файлmyport.h

#ifndefMYPORT_H

#defineMYPORT_H

#include<QObject>

#include<QDebug>

#include<QtSerialPort/QserialPort>//Обьявляемработуспортом

#include<QMainWindow>

#include"math.h"

#include<unistd.h>

structSettings{//Структураснастройкамипорта

QStringname;

////qint32baudRate;

//QSerialPort::DataBitsdataBits;

//QSerialPort::Parityparity;

//QSerialPort::StopBitsstopBits;

//QSerialPort::FlowControlflowControl;

//QSerialPort::setSettingsRestoredOnClosesetSettingsRestoredOnClose;

};

classMyPort:publicQObject

{

Q_OBJECT

public:

explicitMyPort(QObject*parent=0);

~MyPort();//хз

QSerialPortthisPort;

SettingsSettingsPort;

//QByteArraycommand;

QByteArraycommand_read;

unsignedcharcamera_id=0x83;

floats;

signals:

voidfinished_Port();//Сигналзакрытиякласса

voiderror_(QStringerr);//Сигналошибокпорта

voidoutPort(QStringdata);//Сигналвыводаполученныхданных

publicslots:

voidClosePort();//Слототключенияпорта

voidConnectPort(void);//Слотподключенияпорта

voidStopMoving();

voidleft();

voidright();

//voidWrite_Settings_Port();//Слотзанесениенастроекпортавкласс

voidprocess_Port();//Тело

voidchoose_action(floatprev,floatnext,floatwindow_center);

voidWriteToPort(QByteArraydata);//Слототправкиданныхвпорт

privateslots:

voidhandleError(QSerialPort::SerialPortErrorerror);//Слотобработкиощибок

voidReadInPort();//СлотчтенияизпортапоReadyRead

};

#endif//MYPORT_H

ФайлMain.cpp

#include"mainwindow.h"

#include<QApplication>

#include<QCoreApplication>

#include<opencv2/imgproc/imgproc.hpp>

#include<opencv2/highgui/highgui.hpp>

intmain(intargc,char*argv[])

{

QApplicationa(argc,argv);

MainWindoww;

w.show();

returna.exec();

}

Файл Mainwindow.cpp

#include"mainwindow.h"

#include"ui_mainwindow.h"

#include<QFileDialog>

#include<QDebug>

#include<QtDebug>

#include<QString>

#include<windows.h>

#include<iostream>

usingnamespacestd;

usingnamespacecv;

MainWindow::MainWindow(QWidget*parent):

QMainWindow(parent),

ui(newUi::MainWindow)

{

ui->setupUi(this);

/*дляпортаипередачикоманд*/

//camera_id=0x83;

//serial=newQSerialPort(this);

//serial->setPortName("COM1");

current_img=NULL;

prev_img=NULL;

current_pyramid=NULL;

previous_pyramid=NULL;

count_point=0;

flags=0;

current_points=NULL;

prev_points=NULL;

status=NULL;

object_moving=false;

sum=0;

QThread*my_thread=newQThread;//Создаемпотокдляпортаплаты

MyPort*port422=newMyPort();//Создаемобьектпоклассу

port422->moveToThread(my_thread);//помешаемклассвпоток

port422->thisPort.moveToThread(my_thread);//Помещаемсампортвпоток

//port422->

//Загружаемобученныеданныедляклассификатора

CvHaarClassifierCascade*cascade_frontal_face=(CvHaarClassifierCascade*)cvLoad("D:/openCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml",0,0,0);

//"D:/openCV/opencv/sources/data/haarcascades/haarcascade_mcs_upperbody.xml"

if(!cascade_frontal_face)

{

qDebug()<<"Errortoloadmodel"<<endl;

close();

}

CvMemStorage*MemStorage=cvCreateMemStorage(0);

tc=cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03);

//connect(port422,SIGNAL(error_(QString)),this,SLOT(Print(QString)));//Логошибок

connect(my_thread,SIGNAL(started()),port422,SLOT(process_Port()));//Переназначенияметодаrun

connect(port422,SIGNAL(finished_Port()),my_thread,SLOT(quit()));//Переназначениеметодавыход

connect(my_thread,SIGNAL(finished()),port422,SLOT(deleteLater()));//Удалитькчертямпоток

connect(port422,SIGNAL(finished_Port()),my_thread,SLOT(deleteLater()));//Удалитькчертямпоток

connect(this,SIGNAL(send_command(QByteArray)),port422,SLOT(WriteToPort(QByteArray)));//отправкавпортданных

//Захватываемвидео(можноискамеры)слицами

port422->ConnectPort();

CvCapture*capture_web=cvCaptureFromCAM(0);

assert(capture_web);

if(capture_web==NULL)

{

qDebug()<<"Errortocatchthecamera!!!!"<<endl;

cvClearMemStorage(MemStorage);

cvRelease((void**)&cascade_frontal_face);

close();

}

cvNamedWindow("frame",1);

//cvNamedWindow("points",1);

IplImage*gray=NULL;

window_center=cvPoint2D32f(0.f,0.f);

prev_mass_center=cvPoint2D32f(0.f,0.f);

mass_center=cvPoint2D32f(0.f,0.f);

//mass_center_next=cvPoint2D32f(0.f,0.f);

//Прямоугольникнайденноголица

CvRectface_rect=cvRect(0,0,0,0);

//Controlcontrol_action;

enumdetector_states//Состояниянашегодетектора

{

find_object,

track_object

};

detector_statesstate=find_object;

IplImage*frame=cvQueryFrame(capture_web);

my_thread->start();

while(true)

{

frame=cvQueryFrame(capture_web);

if(frame==NULL)

{

qDebug()<<"Error"<<endl;

break;

}

//Всяработаведётсянаизображениивградацияхсерого

if(!gray)

{

gray=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,1);

//CvPoint2D32fwindow_center=cvPoint2D32f(0.f,0.f);

window_center.x=float(frame->width/2);

window_center.y=float(frame->height/2);

//qDebug()<<"Centerx:"<<prev_mass_center.x<<endl;

//qDebug()<<"Centery:"<<prev_mass_center.y<<endl;


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.