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


Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
Санкт
-
Петербургский государственный политехнический
университет имени Петра Великого

Институт компьютерных наук и технологий

Кафедра информационных и управляющих систем




Работа допущена к защите

Зав. кафедрой







П.Д.Дробинцев

«


»








201
6

г.






ВЫПУСКНАЯ РАБОТА БАКАЛАВРА


Тема:

Применение методов параллелизации вычислений для
обработки видеоизображения



Направление:

09.03.04



Программная инженерия




Выполнил студент гр. 43504/1





Архипов А.Г
.


Руководитель

проф.
д.т.н.





Молодяков С.А
.





Санкт
-
Петербург


2016


2

Содержание

Введение

................................
................................
................................
...........

3

Глава 1 Пути использова
ния методов параллелизации для обработки
видеоизображения

................................
................................
..........................

5

1.1

Основные операции по обработке видео

................................
..

5

1.2

Многоядерность

................................
................................
..........

14

1.3

Сопроцессоры,
GPU
. Библиотека
OpenCL

............................

16

1.4

Векторизация

................................
................................
..............

23

Гла
ва 2 Рассмотрение существующих программных средств, по
обработке видеоизображения

................................
................................
.....

25

2.1

Библиотеки обработки видеоизображений компьютерного
уровня

…………………………………………………………………….
25

2.1.1 Библиотека OpenCV

................................
................................
...

25

2.1.2 Библиотека D
irectS
how

................................
..............................

33

2.1.3 Другие библиот
еки для обработки видео

...............................

42

2.2

Библиотеки функций для параллельной обработки в
вычислительных ядрах OpenMP, MPI

................................
................

45

2.3

Обзор сущ
ествующих программных средств

........................

53

Глава 3 Разработка параллельных алгоритмов и программ

..............

60

Заключение

................................
................................
................................
...

70

Список литературы

................................
................................
.....................

71


3

Введение

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


кодирование и
декодирование в HD
-
системах требует гораздо большей
производительности и одного процессора уже недостаточно.

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

устройств
,
представленного сегодня на рынке. В этом случае

актуальны

системы, построенные из нескольких процессоров,

которые

могут реализовать высококачественное видео, не будучи

4

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



5

Глава 1

Пути использования методов параллелизации
для обработки видеоизображени
я

1.1

Основные операции по обработке видео

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

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

В таблице 1.1

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

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



6

Стадия
примен
е
ния

Название алгоритмов,
используемых в
цифровых видеоси
с
темах

Управление
фотоприемн
и
ком

Автоматическая экспозиция (
Auto exposure
AE
)
.

Автобаланс

белого

(
Auto white balance
AWB
).

Детектирование плавания сигнала (
Flicker avoid
).

Попиксельная
обработка

Компенсация

черного

(
Auto black reference ABR
).

Программирование аналогового усиления.

Программирование времени экспозиции.

Выбор разрядн
ости АЦП. Контроль насыщения.

Преобразование
Bayer RGB.

Построковая
обрабо
т
ка

Интерполяция цвета. Увеличение/уменьшение.

Коррекция дефектов. Коррекция цвета.

Гамма коррекция. Компенсация искажений в линзе.

Объединение отсчетов(Binning).

Подавление шумов.

Покадровая
обр
а
ботка

Контроль резкости (Sharpness).

Распознавание. Подчеркивание границ.

Изменение формата, сжатие.

Управление
реж
и
мом

Регистрация одного кадра. Потоковое видео.

Переключение памяти данных (
flash
)

Таблица 1.1 Алгоритмы обработки изображе
ний в цифровых
камерах.

Рассмотрим основную цепочку алгоритмов, которую
применяют для улучшения качества видеоизображений.


Компенсация уровня чёрного.

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

7

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


Подавление шумов.

Существует немало источников шумов


оптических,
электрических, цифровых и энергетических,


искажающих
данные изображения.

При анализе и разработке алгоритмов шумопо
давления
шум в видеопоследовательности условно разделяют на
пространственный и временной. Пространственный


это
шум внутри кадра, а временной


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

Для пространственного шумоподавления производят
усреднение пикселей по кадру (изображению), а для

8

временного шумоподавления
-

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

3D
-
фильтром. Первым обычно применяется пространственный
фильтр, поскольку после его работы врем
енное
шумоподавление становится более эффективным.

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

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


9

В целом, выбор алгоритма определяется имеющимся
уровнем шума в видео.


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

Различные типы освещения


например, лампа
накаливания, лампа дневного света, источники естественного
света, ксеноновые лампы и светодиодные вспышки


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

Тонкая
настройка баланса белого начинается с
измерения средних значений RGB, причем по умолчанию
значение зелёного устанавливается равное единице.


Интерполяция CFA
.

На матрице фотоприемника находится массив цветных
фильтров CFA (color filter arrays). Каждый
све
точувствительный элемент накрыт одним светофильтром
массива, поэтому для каждого пикселя можно получить

10

только один цветовой компонент, а в модели RGB требуются
три компонента.

Интерполяция
CFA


это процесс интерполирования
двух недостающих компонентов ц
вета для каждого пикселя
на основе имеющегося

компонента и соседних пикселов.
Интерполяция CFA является в основном функцией
трансформации, не меняющейся в зависимости от сенсора
или условий освещения, поэтому на данной стадии нет
необходимости в выполнении

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

Алгоритм интерполяции зависит от использ
уемы
х
матриц фильтров. На рис. 1.1

представлены три матрицы
фильтров:

Ф
ильтр Байера
-

наиболее распространенный RGB
фильтр
-

включает 1 синий, 1 крас
ный, 2 зелёных элемента
фильтра.


Ф
ильтр RGBE
-

один из зелёных

фильтров заменён на
изумрудный.

Ф
ильтр CYYM
-

голубой, 2 жёлтых, пурпурный.



11




Рис. 1.1

Три схемы матриц фильтров.


Смешивание

RGB
.

Различные сенсоры выдают различные значения RGB
для одного и того же цвета. Настройка данной стадии
заключается в создании матрицы смешивания, позволяющей
преобразовать цветовое пространство RGB сенсора в
стандартное цветовое пространство RGB, наприм
ер, Rec709.
Алгоритм смешивания сводится к перемножению RGB на
матрицу смешивания:



Коррекция гаммы
.

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

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

12

линейные значения RGB или YCbCr должны быть
преобразованы в нелинейные R'G'B' или Y'CbCr. Такое
преобразо
ва
ние называется гамма
-
коррекцией.


Преобразование RGB


YCC
.

Изображения также необходимо настроить для
восприятия человеческим глазом, который более
чувствителен к информации об освещённости (Y), чем к
информации о свете (Cb, Cr). На данной стадии
осущес
твляется разделение освещённости и цвета для
различной последующей обработки, с различной точностью.



Рис. 1.2

Матрица преобразования RGB


YCbCr.


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


Усиление контуров
.


13

Усиление контуров влияет на резкость изображения.
Фильтры метода усиления контуров по Лапласу могут
выглядет
ь следующим образом
:




Усиление контраста.

Усиление контраста состоит из двух параметров:
собственно,

контраста и яркости. Поскольку оптимальные
контраст и

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


Подавление цветовых артефактов.

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

14

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

Перечисленная цепочка алгоритмов обработки является
традиционной для цифровых камер.
Некоторые алгоритмы
обработки могут быть отключены
.


1.2

Многоядерность

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

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


15

Широкая доступность многоядерных п
роцессоров стала,
пожалуй, наиболее подрывной и вместе с тем наиболее
многообещающей инновацией на рынке встраиваемых
систем за много лет. Новейшие многоядерные процессоры
Intel демонстрируют значительное увеличение
производительности, по сравнению с одноя
дерными.
Системы на базе многоядерных процессоров также
обеспечивают большую масштабируемость, позволяя
наращивать вычислительную мощность увеличением
количества ядер без вмешательства в программное
обеспечение. Тенденция к сдвигу в сторону многоядерности
набирает обороты, и то, что объёмы продаж 2
-

и 4
-
ядерных
процессоров Intel давно уже превышают объёмы продаж
одноядерных процессоров,
-

наглядное тому подтверждение.

Другая важная технологическая тенденция


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

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

16

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


1.3

Сопроцессоры,
GPU
. Библиотека
OpenCL

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

В настоящее время в качестве сопроцессоров,
обеспечивающих быструю обработку введенного в ЭВМ
видео
изображения, используются графические процессор
ы
GPU
. Графический процессор является устройством
компьютера, которое выполняет операции по выводу
изображени
я на монитор (графический рендеринг). Однако

17

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

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

В настоящее время наибольшими вычислительными
мощностями обладают GPU компании Nvidia, которые
разрабатываются и поддерживаются в рамках технологии
CUDA. Технология CUDA п
оявилась в 2006 году и
представляет из себя программно
-
аппаратный комплекс,
позволяющий эффективно писать и исполнять программы
под графические адаптеры. Графический процессор
организует аппаратную многопоточность, что позволяет
задействовать все ресурсы г
рафического процессора.

GPU CUDA имеет следующую вычислительную
модель. Верхний уровень ядра GPU состоит из блоков,
которые группируются в сетку или грид (grid) размерностью
N1 * N2 * N3. Любой блок в свою очередь состоит из нитей
(threads), которые являют
ся непосредственными
исполнителями вычислений. Нити в блоке сформированы в
виде трехмерного массива (рис. 1.3
).


18


Рис. 1.3

Структура вычислительной модели GPU CUDA.


Программная часть содержит в себе всё необходимое
для разработки программы: расширения яз
ыка С,
компилятор, API для работы с графическими а
даптерами и
набор библиотек
. CUDA SDK позволяет программистам
реализовывать на специальном упрощённом ди
алекте языка
программирования
C

алгоритмы, выполнимые на
графических процессорах NVIDIA.

Пример прогр
аммы обработки изобра
жения с
использованием GPU CUDA:

#include stdio.h&#xstd-;io-;.-2;&#xh600;

#include conio.h -3o;&#x-5n6;&#xio-4;&#x.-2h;怀

#include math.h&#x-13m;zth;.-1;h60;

#include cutil.h -3u;&#x-5ti;&#xl.h6;

#include cuda_runtime_api.h -3u;m-5; _-7;&#xr-3u;&#x-5n6;&#xti-9;&#xm7e_;&#x-7ap;&#x-7i.;&#xh-70;

#include algorithm -3l;&#x-10g;o-5;&#xr-3i;&#xth-3;&#xm700;

using namespace std;


19

#pragma comment(lib, "cutil32D.lib")

int rint(int l, in
t h)

{

int r = h
-
l+1, res;


res = rand()%r+l;



}

int* rintarr(int size, int l, int h)

{

int *res = new int[size];//, t;


for (int i =0; i = size
-

1; i++)


{




//t = rint(0, size);



res[i] = size
-
i;//rint(l+t*h, h+t*h);


}



}

voi
d iaprint(int *arr, int size)

{

for (int i =0; i = size
-

1; i++)



printf("%i ", arr[i]);


printf("
\
n");

}

//Выводим информацию об устройствах

cudaDeviceProp* ShowDeviceInfo()

{

int deviceCount;


cudaDeviceProp deviceProp;




//Получаем и выводим количество устройств


cudaGetDeviceCount(&deviceCount);


printf("Device count: %d
\
n
\
n", deviceCount);



for (int i =

0; i = deviceCount
-

1; i++)


{

//Получаем информацию о текущем устройстве



cudaGetDeviceProperties(&deviceProp, i);






//Выводим иформацию об устройстве



printf("Device name: %s
\
n", deviceProp.name);



printf("Total global memory: %d
\
n",
deviceProp.
totalGlobalMem);



printf("Shared memory per block: %d
\
n",
deviceProp.sharedMemPerBlock);



printf("Registers per block: %d
\
n",
deviceProp.regsPerBlock);



printf("Warp size: %d
\
n", deviceProp.warpSize);


20



printf("Memory pitch: %d
\
n", deviceProp.memPitch);



printf("Max threads per block: %d
\
n",
deviceProp.maxThreadsPerBlock);



printf("Max threads dimensions: x = %d, y = %d, z = %d
\
n",
deviceProp.maxThreadsDim[0], deviceProp.maxThreadsDim[1],
deviceProp.maxThreadsDim[2]);



printf("Max grid size: x = %d, y

= %d, z = %d
\
n",
deviceProp.maxGridSize[0], deviceProp.maxGridSize[1],
deviceProp.maxGridSize[2]);



printf("Clock rate: %d
\
n", deviceProp.clockRate);



printf("Total constant memory: %d
\
n",
deviceProp.totalConstMem);



printf("Compute capability: %d.%d
\
n", deviceProp.major,
deviceProp.minor);



printf("Texture alignment: %d
\
n",
deviceProp.textureAlignment);



printf("Device overlap: %d
\
n", deviceProp.deviceOverlap);



printf("Multiprocessor count: %d
\
n",
deviceProp.multiProcessorCount);



printf("Kernel
execution timeout enabled: %s
\
n",
deviceProp.kernelExecTimeoutEnabled ? "true" : "false");


}




}

//Спецификаторы вызова: global
-

GPU из CPU; device
-

GPU из GPU; host
-

CPU из CPU

//Использован один блок

__global__ void vadd(float *v1
, float *v2, float *v3)

{

int cur = threadIdx.x; //Получение нномера текущей нити


v3[cur] = v1[cur] + v2[cur];

}

__global__ void sort(int *arr, int size)

{

int i = threadIdx.x;


int k = 0, b = arr[i];



for (int j = 0; j = size
-

1; j++)




if (arr[j]
b) k++;


__syncthreads();


arr[k] = b;

}

int main()

{

unsigned int t1;




21








cudaDeviceProp *deviceProp = ShowDeviceInfo();




int size = deviceProp
-
�maxThreadsPerBlock;


float *v1 = new float[size]
;


float *v2 = new float[size];


float *v3 = new float[size];


for (int i = 0; i = size
-

1; i++)


{



v1[i] = (float)i/10 + (float)i;



v2[i] = (float)i/5 + (float)2*i;


}


float *cv1, *cv2, *cv3;


cudaMalloc((void**)&cv1, size*sizeof(float));


cudaMallo
c((void**)&cv2, size*sizeof(float));


cudaMalloc((void**)&cv3, size*sizeof(float));


cudaMemcpy(cv1, v1, size*sizeof(float),
cudaMemcpyHostToDevice);


cudaMemcpy(cv2, v2, size*sizeof(float),
cudaMemcpyHostToDevice);




dim3 gridSize = dim3(1, 1, 1); //Испо
льзуем только один блок


dim3 blockSize = dim3(size, 1, 1); //Используем size нитей


//Событие окончания сложения


cudaEvent_t event;


cudaEventCreate(&event);


cudaEventRecord(event, 0); //0
-

номер основного потока


cutStartTimer(t1);


vaddgridSize, b
lockSize>>>(cv1, cv2, cv3); //Складываем
вектора (асинхронно)


cudaEventSynchronize(event); //Ожидание окончания работы всех
нитей GPU


cutStopTimer(t1);



cudaMemcpy(v3, cv3, size*sizeof(float),




printf("
\
nGPU vadd: %f ms
\
n
\
n",




cudaEventDestroy(event);


cudaFree(cv1); cudaFree(cv2); cudaFree(cv3);


22







}



Для программирования графических процессоров
может использоваться и язык OpenCL. OpenCL (Open
Computing Language
-

открытый язык вычислений)
-

фреймворк для написания компьютерных программ,
связанных с параллельными вычислениями на различных
разнородных

системах, которые могут включать графические
и централь
ные процессоры, а также FPGA
. В OpenCL вх
одят
язык программирования, который базируется на стандарте
C99, и интерфейс программирования приложений (API).
OpenCL обеспечивает параллелизм на уровне инструкций и
на уровне данных и является реализацией техники GPGPU.
OpenCL является полностью

открытым

стандартом, его
использование не облагается лицензионными отчислениями.

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

через
промежуточный API (как в случае NVidia: OpenCL работает
поверх CUDA Driver API, поддерживаемый устройствами).



23

1.4

Векторизация

Векторизация или векторная обработка массивов
данных связана с возможностью выполнения команды над
несколькими операндами од
новременно (в классификации
Флинна
-

SIMD). При использовании векторизации можно в
несколько раз повысить скорость обработки. Необходимость
применения векторизации видно из процесса развития
процессоров Intel. Первые команды класса SIMD над
регистрами MMX
(64 разряда) появились в первых
процессорах Pentium. Затем SIMD
-
команды нашли свое
развитие в технологиях SSE (128 разрядов) и AVX (256
разрядов). В ближайшее время появляются процессоры с
SIMD
-
регистрами разрядностью 512, 1024. Количество
SIMD
-
команд прев
осходит количество команд
вычислительного ядра процессора. SIMD
-
технология
поддержана и на высоком уровне программирования.
Имеются специальные директивы включения векторизации,
например,

при оптимизации кода программы или
применения библиотеки OpenMP 4.0
и выше.

Пример применения SIMD
-
команд при сложении двух
массивов

из 4 элементов в формате float:

#include stdio.h&#xstd-;io-;.-2;&#xh600;

#include conio.h -3o;&#x-5n6;&#xio-4;&#x.-2h;怀


24

void main(void) {


float c[4] = {1, 2, 3, 4};


float d[4] = {5, 6, 7, 8};


double f[2]= {16, 4};




_asm {//sse1



movup
s

xmm0, c



movups

xmm1, d



addps


xmm0, xmm1



movups

c, xmm0


}


_asm {//sse2



movups

xmm1, f



sqrtpd

xmm0, xmm1



movups

f, xmm0


}



}


25

Глава 2

Рассмотрение существующих программных
средств, по обработке видеоизображения

2.1

Библиотеки обра
ботки видеоизображений
компьютерного уровня

2.1.
1

Библиотека
OpenCV

OpenCV



библиотека компьютерного зрения с
открытым исходным
кодом (
Open Source Computer Vision
Library), содержащая более 1000 функций для работы в
первую очередь с потоковым видео. Библи
отека содержит
алгоритмы для обработки, реконструкции и очистки
изображений, распознания образов, захвата видео, слежения
за объектами, калибровки камер и др. Функциональность
доступна на разных языках: C, C++, Python, CUDA, Java.
Поддерживаются основные о
перационные системы: MS
Win
dows, Linux, Mac
OS
, Android, iOS.

Основные функции библиотеки OpenCV:

-

Функции для работы с изображениями
(преобразование, фильтрация и т.д.)

-

Функции для анализа изображений (поиск
контуров, гистограммы и т.д.)

-

Алгоритмы анализа д
вижений, слежение за
объектами


26

-

Алгоритмы распознания объектов (лиц,
предметов)

-

Алгоритмы для калибровки камер

-

Функции для классификации и анализа данных

-

Функции для работы с 2D графиками

-

Создание окон

-

Вывод изображений

-

Захват видео из файлов и камер

-

Чтение
/Запись изображений


Поддерживаемые компиляторы:

-

Windows


Microsoft Visual C++, Borland C++,
Intel Compiler, MinGW

-

Linux


GCC, Intel Compiler

-

Mac


Intel Compiler, Carbon и др.


Основные модули библиотеки.

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

27

функциями OpenCV, так как они обычно работают быстрее, а
код понятнее.

Заметим, что библиотека OpenCV реализует, как
правило, только базовые операции, используемые в
компьютерном зрении. Таким образом, ее можно
рассматривать как в целом н
изкоуровневую

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

необходимо на основе предоставленных библиотекой
простых функций,

создавать
более

сложные приложения.

На рис. 2.1

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







Рис.
2.1

Схема приложения для задачи компьютерного зрения.



28

Все начинается с захвата изображений из файла или с
видеокамеры (модуль highgui библиотеки OpenCV). Затем
осуществляется предварительная
обработка изображений
(модуль imgproc), такая, как устранение шума, выравнивание
яркости, контраста, выделение и удаление бликов, теней.
Например, один и тот же объект при разном освещении
выглядит по
-
разному. В ярком свете красная машина,
движение которой
, необходимо отслеживать, будет ярко
-
оранжевой. В пасмурную погоду та же машина будет
выглядеть красно
-
розовой. В этом случае на изображении
необходимо выполнить выравнивание цветов.
Предобработка может быть простой, но может заключать в
себе целую сложную

технологию.

Следующий этап


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


вычисления описания каждого пикселя.

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

29

камера неподвижна, а изображение подвижное, можно

использовать алгоритмы вычитания фона.

На следующем этапе можно производить вычисление
расположения объекта в 3d, реконструкцию 3d структуры,
анализ структуры, регистрацию и т. п. (модули calib3d,
contrib, video, stitching, videostab, ml). Например, в зад
аче
видеонаблюдения это восстановление траекторий объектов и
т. д.

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


детектирован
текст, что именно за текст и т. д.

Ниже представлен текст программы, которая
захватывает видео с веб
-
камеры. Видео воспринимается как
последовательность кадров, и к каждому кадру применяется
фильтр


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


30

#include openc
v
\
cv.h�

#include opencv
\
highgui.h�

#include stdlib.h&#xstd-;lib;&#x-3.-;h6;

#include stdio.h&#xstd-;io-;.-2;&#xh600;

#include opencv2/opencv.hpp&#xo-7p;&#x-5en;Lv4;-5/;&#xo-4p;&#x-5en;L-1;v6.;&#x-2h6;&#xp-17;&#xp-50;


int xorder = 1;

int xorder_max = 2;

int yorder = 0;

int yorder_max = 2;

// функция
-
обработчик ползунка
-

порядок производной по X

void myTrackbarXor
der(int pos) {


xorder = pos;

}

// функция
-
обработчик ползунка
-

порядок производной по Y

void myTrackbarYorder(int pos) {


yorder = pos;

}

int main(int argc, char* argv[])

{


// получаем любую подключённую камеру


CvCapture* ca
pture = cvCreateCameraCapture(CV_CAP_ANY);
//cvCaptureFromCAM( 0 );



//проверяем корректность подключения



assert( capture );


// узнаем ширину и высоту кадра


CV_CAP_PROP_FRAME_WIDTH);


d
CV_CAP_PROP_FRAME_HEIGHT);


printf("[i] %.0f x %.0f
\
n", width, height );


IplImage* frame=0;



IplImage* filterframe=0;



IplImage* filterframe2=0;



//создаем окна


cvNamedWindow("capture",

CV_WINDOW_AUTOSIZE);



cvNamedWindow("filter", CV_WINDOW_AUTOSIZE);




int aperture = 3;



//название ползунка, в каком окне будет, текущее
значение,



//максимальное, функция при изменении


31



myTra
ckbarXorder);


myTrackbarYorder);


printf("[i] press Enter for capture image and Esc for quit!
\
n
\
n");



int counter=0;


char filename[512];



CvMat img;



while(tr
ue){


// получаем кадр


frame = cvQueryFrame( capture );





cvShowImage("capture", frame);
//показываем





filterframe = frame;





filterframe2 = filterframe;





// проверяем, чтобы порядок
производных по X и Y был отличен от 0


if(xorder==0 && yorder==0){


printf("[i] Error: bad params for cvSobel() !
\
n");


cvZero(filterframe);


}


else{


// применяем оператор Собел
я


cvSobel(filterframe, filterframe2, xorder, yorder, aperture);


}


// показываем





cvShowImage("filter", filterframe2);


char c = cvWaitKey(33);


if (c == 27) {
// нажата ESC


break;


}


else if(c == 13) { // Enter


// сохраняем кадр в файл


sprintf(filename, "Image%d.jpg", counter);


printf("[
i] capture... %s
\
n", filename);


cvSaveImage(filename, frame);


counter++;


}


}


// освобождаем ресурсы


32


cvReleaseCapture( &capture );



cvReleaseImage(& frame);


cvR
eleaseImage(& filterframe);


cvReleaseImage(&filterframe2);


cvDestroyWindow("capture");


cvDestroyWindow("filter");



}



Рис. 2.2

Результат работы программы

захвата видео и нахождения
границ,

с использованием функций

библиотеки OpenCV.


А также пример программы

определения
доминирующих цветов на изображении может быть полезна
для выбора палитры. например на Web
-
сайте. Алгоритм
программы построен на определении отношения пикселя к
набору цвет
ов в пространстве HSV. На р
ис. 2.3

представлена

33

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

Рис. 2.3

Результат работы программы о
пределения доминирующих
цветов
,

с
использованием

функций библиотеки OpenCV
.


2.1.2 Библиотека

D
irectS
how

DirectShow


мультимедийный фреймворк и интерфейс
программирования приложений (API)


это универсальная
библиотека от Microsoft для работы с аудио и видео
.
Предоставляет широкий набор возможностей по
вводу/выводу
и редактиров
анию аудио
-

и видео
потоков.
Является одним из интерфейсов семейства DirectX, входит в
Windows SDK.

DirectShow основан полностью на технологии COM.
Программирование DirectShow связано с графами. Графы

34

строятся из элементов (фильтров), которыми являются
коде
ки, декомпрессоры и т.д. У каждого элемента есть
каналы, входные и выходные, по которым элементы
соединяются между собой. Несколько соединенных между
собой элементов образуют граф.

Любая программа, которая использует DirectShow
интерфейс, автоматически смо
жет использовать другие
DirectShow компоненты, установленные в систему: декодеры
видео, декодеры звука, splitter’ы (демультиплексоры) для
извлечения аудио/видеопотоков из разных форматов файлов
-
контейнеров, фильтры для их обработки (например, для
наложения

субтитров). Это позволяет каждому пользователю
конструировать подсистему для работы с видео из различных
«кубиков» по своему вкусу


за их применение по
назначению и автоматическое соединение в цепочки
отвечает ОС. Перечислим основные элементы Direct Show
.

Filter. Фильтры выполняют работу по переработке
данных, получаемых от входных соединений, и передают
обработанные данные на выходные соединения.

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


35

Filter graph.

Граф фильтров


это

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

Filter Graph Manager.

Media Sample. Порция данных представляет
обрабатываемые данные. Она имеет определенный тип,
формат, объект ее представляющий со своим интерфейсом,
обеспечивающим доступ к данным. Понятия тип и формат
поясняются в описании реализ
ации фильтра для передачи
данных.

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

Фильтры DirectShow разделены на три типа,
соответственно и возможности DirectShow можно
классифицировать соответствующим образом.

Фильтры захвата


предназначены для ввода
мультимедиа

данных в
поток

программы с различных

36

физических устройств. В

роли устройства могут быть как
различного рода видео устройства (портативные видео
камеры, веб
-
камеры, TV
-
тюнеры), так и аудио устройства
(
микрофон
, модемная линия), а также данные могут быть
получены и из файла (MPEG, MP3
,
AVI
).

Используя

DirectShow
можно

одновременно

использов
ать несколько
фильтров захвата к примеру,

для
одновременного захвата
видео с
камеры и звука с микрофона. Количество
использу
емых фильтров захвата зависит

лишь

от мощности

используемого
компьютера
.








Ри
с. 2.4

Пример графа фильтров для воспроизведения AVI файла
.


Фильтры преобразования
-

используются

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

тип фильтров может
производить анализ данных, может полностью

37

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

аудио и видео каналы. В стандартной поставке
вместе с операционной системой Windows корпорация
Microsoft предоставляет небольшое количество филь
тров:
кодеки (
MPEG
-
1
, MP3
, WMV,

WMA
, MIDI), контейнеры
(AVI,
WAV
, ASF
), несколько сплитеров (или
демультиплексоров) и
мультиплексоров
.
Остальные

популя
рные фильтры: кодеки (MPEG
-
4
, H.264,

AAC
,

Vorbis)
и контейнеры (
mov
,
MP4
,
Ogg
) устанав
ливаются с
различными дополнительными

программами.

Фильтры

визуализации (рендеринга)
-

используются

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

на монитор, на
звуковую
карту

или в файл. Аналогично

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

в файл.

Фильтры соединяются между собой через кана
лы,
образуя поток, через который идут данные. Совокупность
соединенных между собой фильтров образуют граф. Пример
графа фильтров для воспроизведения AVI файла представлен
на рис.
2.4
.


38

Синхронизация фильтров. Однако, просто правильно
составленного графа
не
д
остаточно
. Граф должен иметь
возможность управлять потоком, например, поставить
воспроизведение на паузу, остановить поток или напротив,
воспроизвести его. Кроме того, нужно как
-
то
синхронизировать фильтры, потому, что звук и видео при
воспроизведении виде
о фильма делятся на два потока,
которые
могут

один

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


Когда программист посылает одну из
трех основн
ых команд стоп или пауза, она передается
каждому фильтру графа в отдельности, фильтры в свою
очередь должны быть способны обработать команду. Ниже
приведен пример про
граммы проигрывания видеофайлов,
написанной на языке C# с использованием функций
библиотек
и DirectShow. На рис.

6.9 представлен экран этой
программы.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using Micros
oft.DirectX.AudioVideoPlayback;


39


namespace WindowsFormsApplication1

{ public partial class Form1 : Form


{ Video vv;


bool playing = false;


string filename = "";


public Form1()


{ InitializeComponent();

}


private void button1_Click(object sender, EventArgs e)


{ if (!playing)


{ vv = new Video(filename);


vv.Audio.Volume = trackBar1.Value;


vv.Owner = pictureBox1;


tra
ckBar2.Maximum = Convert.ToInt32(vv.Audio.Duration) * 10;


vv.Fullscreen = false;


vv.Size = new Size(ClientRectangle.Width
-
30,
ClientRectangle.Height
-
100);


vv.Play();


timer1.Start();



playing = true; }


else if(playing)


{ timer1.Start();


vv.Play();


vv.Audio.Volume = trackBar1.Value;


playing = true

} }


private void button4_Click(objec
t sender, EventArgs e)


{ OpenFileDialog ofd = new OpenFileDialog();


ofd.Filter = "Avi files| *.avi|Wmv files| *wmv";


if (ofd.ShowDialog() == DialogResult.OK)


{ filename = ofd.FileName;


if (
playing)


{ trackBar2.Value = 0;


timer1.Stop();


vv.Stop();


vv = new Video(filename);


vv.Open(filename);


vv.Owner = pictureBox1;



vv.Fullscreen = false;


vv.Size = new Size(ClientRectangle.Width + 50,
ClientRectangle.Height
-

110); } } }


private void button2_Click(object sender, EventArgs e)


{ if (playing)


40



{ vv.Pause();


timer1.Stop(); }


else




private void button3_Click(object sender, EventArgs e)


{ if (playing)


{ trackBar2.Value = 0;


tim
er1.Stop();


vv.Stop(); }




}




Рис. 2.5 Экран программы
проигрывателя видеофайлов,
написанной с использованием функций библиотеки DirectShow.


Проста в использовании библиотека Windows.Med
ia,
которая имеет большое количество классов и структур,
позволяющих работать с разным контентом, в том числе с

41

видео и аудио. В классе функций MediaPlayer имеются
методы Open, Play, Pause, Stop и др., которые позволяют
легко написать программу проигрывате
ля. На рис.
2.6

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


Рис. 2.6

Экран программы проигрывателя видеофайлов со
звуком, написанной с использованием функций библиотеки
Windows.Media.



42

2.1
.
3

Другие библиотеки

для обработки видео

Для обработки и просмотра
видео можно использовать
функции и других библиотек. Такими библиотеками могут
быть: Intel IPP, AviCap32, Qt, Media Foundation, Accord.NET
и др.

В библиотеке Intel IPP (Integrated Performance
Primitives) реализованы сотни широко используемых
функций для пр
еобразований изображений, статистики,
компьютерного зрения и еще десятка областей. Функции
оптимизированы под архитектуру процессора, в частности, в
них используются возможности векторизации. Они
значительно увеличивают скорость работы приложений.

Библиоте
ка Intel IPP представляет собой набор
оптимизированных реализаций базовых (низкоуровневых)
операций (данные реализации поставляются в бинарном
виде). Логически библиотеку можно разделить на 3 больших
модуля: обработка сигналов (одномерных массивов),
обрабо
тка изображений и видео, операции над матрицами
небольшого размера и реалистичный рендеринг. Для того
чтобы облегчить процесс разработки ПО с использованием
библиотеки, отдельно в виде исходных кодов поставляются
высокоуровневые API для аудио и видеокодеко
в, функций

43

обработки изображений и речи. Данные API могут быть
использованы при разработке собственных приложений.
Графически модель использования библиотеки представлена
на

рис. 2.7
.







Рис. 2.7

Структура и модель использования библиотеки Intel IPP
.


Media Foundation
-

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


44

Библиотека Accord.NET обеспечивает статистический
анализ, машинное обучение, обработку изображений и
компьютерное зрение для .NET приложений. Accord.NET
Framew
ork расширяет популярную AForge.NET с новыми
функциями, добавляя к более полному среды для научных
вычислений в .NET. Библиотека содержит большой набор
методов для работы с видео: детекторы
интереса,
графические

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

Qt


кроссплатформенный инструментарий разработки
ПО на языке программирования
C++
. Qt позволяет запускать
написанное с его помощью ПО в большинстве современных
операционных систем путём простой компиляции
программы для каждой ОС без изменения исходного кода.
Включает в себя все основные классы, ко
торые могут
потребоваться при разработке прикладного программного
обеспечения, в том числе элементы графического
интерф
ейса, функции работы с камерой.

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

45

DirectS
how и OpenCV. Они позволяют не только легко
написать программу чтения и вывода видео, но и
обеспечивают предельно высокую производительность.


2.2

Библиотеки функций для параллельной обработки в
вычислительных ядрах OpenMP, MPI

В
посл
еднее время активно развив
ается

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


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

46

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

пр
ограммного
кода (рис. 2.8
).


Рис 2.8

Общая схема выполнения параллельной программы при
использовании технологии
OpenMP
.



47

При разработке технологии
OpenMP

был учтен накопленный
опыт по разработке параллельных программ для систем с
общей памятью. В техно
логии
OpenMP

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

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

в значительной степени
согласуется со сло
жностью решаемой задачи


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

обеспечивает

возможность поэтапной (инкрементной)
разработки параллельных программы


директивы
OpenMP

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

48

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

позволяет в значительной степени

снизить остроту проблемы переносимости параллельных
программ между разными компьютерными системами


параллельная программа, разработанная на языке
C

или
Fortran

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

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

(англ.
Message
Passing Interface).
На сегодняшний день
MPI

является
наиболее распространенной технологией параллельного
программирования для супе
ркомпьютеров. Существуют
реализации
MPI

для языков Си,
C
++ и
Fortran
. Примеры и
описания всех функций даны с использованием языка Си.
Основные идеи и правила создания программ с
использованием интерфейса
MPI

схожи для всех языков.


49


Рис
.

2.9

Модель параллельных вычислений
MPI
.

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

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

50

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

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

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

MPI

основные понятия:

Процесс


это исполнение программы на одном
процесс
оре, на котором установлен
MPI
, безотносительно к
тому, содержит ли эта программа внутри параллельные ветви
или операции ввода/вывода или просто последовательный
программный код;

Группа


это совокупность процессов, каждый из
которых имеет внутри группы у
никальное имя, используемое
для взаимодействия с другими процессами группы
посредством коммуникатора группы;

Коммуникатор группы


интерфейс синхронизации и
обмена данными между процессами.


51


Рис.

2.10

Коммуникатор.

Коммуникатор выступает для прикладной г
руппы как
коммуникационная среда взаимодействия. Коммуникаторы
бывают внутригрупповыми (
intra
) и межгрупповыми (
inter
).
Коммуникатор определяет контекст передачи сообщений.
Сообщения, использующие разные коммуникаторы, не
оказывают влияния друг на друга и
не взаимодействуют друг
с другом. Каждая группа процессов использует отдельный
коммуникатор. Если в группе
n

процессов, то процессы
внутри группы имеют номера от 0 до
n



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


52


Рис.

2.11

Обмен сообщениями
MPI

(
MPI
_
Send



отправка сообщения;
MPI
_
Recv



прием сообщения
)
.

С точки зрения разработчика процесс


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

53

заб
оту о передаче сообщений между процессами берет на
себя интерфейс
MPI
.


2.3

Обзор
существующих программных средств

Программными средствами

для видеокамер являются
два типа программ


это видеопроигрыватели и программы
обработки видео. Известно достаточно много

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

распространенные проигрыватели:


Media Player
. И
меет следующие особенности: быстрая
скорость работы; поддержка всех современных ОС Windows;
поддерживает сетевой режи
м: можно смотреть видео из
интернета,
а также
самому

организовывать трансляцию
.

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

54

популярных форматов

видео без установки дополнительных
кодеков.

GOM Media Player имеет так же много опций, как и в
других проигрывателях: захват экрана, захват аудио,
контроль скорости воспроизведения видео и др.
Особенностью Gom Player является возможность
самостоятельного
поиска и загрузки кодеков. Благодаря
этому, Gom

Player может открывать даже файлы с
нарушенной и неправильной структурой.

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

видеофильмы, а во
втором случае обрабатывают специальные видео,
полученные, например, на телескопах.

VirtualDub
-

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

55

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

Mathcad позволяет получить первые результаты работы
алгоритма за минимальный промежуток времени. Поиск
ошибок осуществляется быстрее, чем в тексте
программы на
любом языке программирования. Исходный код программы
выводится в графическом режиме, и потому выглядит
нагляднее, чем в текстовом редакторе. Mathcad имеет
множество реализованных, готовых к использованию
функций. Перечислим основные функции чт
ения
-
записи
изображения (file


путь к файлу):

READRGB ("file")


чтение цветного изображения;

READBMP ("
file")


чтение изображения в оттенках
серого;

WRITERGB("file")


запись цветного изображения;

WRITEBMP ("
file")


запись изображения в оттенках
серог
о.

Результатом выполнения, например, функции
READRGB ("file"), являются три матрицы RGB пикселей.

56

Таким образом, в Mathcad читаем и обрабатываем
статические изображения.

Для обработки видео можно использовать среду Matlab.
Имеется большой объем
документаци
и
. Приведем два
примера.

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

// открываем файл

video = mmreader('d:
\
test
\
1.avi');


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

width = video.Width;

height = video.H
eight;

frameRate = video.FrameRate;

numOfFrames = video.NumberOfFrames;


// читаем кадр, кадры нумеруются с 1

frameNo = 50;

frame = read(video, frameNo);


// читаем диапазон кадров

// 50
-

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

// 100
-

номер последнего прочитан
ного кадра

framesRange = [50 100];

frames = read(video, framesRange);


// читаем все видео, операция не будет выполнена,

// в случае, если видео большое и не влезает в память

entireVideo = read(video);



57

Приведем пример проигрывания видео. В программе, в
пе
ременной mov подготавливается ролик. Эта переменная
хранит массив из структур. Каждая структура имеет два
поля: cdata и colormap. Поле cdata хранит битовый образ
кадра, а поле colormap нужно чтобы хранить цветовую
палитру для видео с индексированным цветом
.

// чтение видео

filename = 'd:
\
test
\
1.avi';

video = mmreader(filename);

nFrames = 200;


// подготавливаем структуру в которую будет прочитана информация

mov(1:nFrames) = struct('cdata', [], 'colormap', []);


// Читаем покадрово

for k = 1 : nFrames


m
ov(k).cdata = read(video, k);

end


// проигрываем видео

hf = figure;


movie(hf, mov, 1, video.FrameRate);


Для обработки и визуализации данных в разных
областях используют кроссплатформенный язык
прогр
аммирования IDL (Interface Definition Language).
Последняя версия языка IDL v.8.5. Язык IDL предлагает
пользователям большое количество разнообразных
математических преобразований и функций, способных

58

помочь решить достаточно сложные задачи. IDL обладает
м
ощными средствами визуализации данных. Визуализация
данных в IDL поддерживает два типа рендеринга (rendering):
программный рендеринг и рендеринг с использованием
аппаратных 3D ускорителей, которые поддерживают
библиотеку OpenGL. В большинстве случаев визуа
лизация
данных через OpenGL обладает лучшим качеством
изображения, чем визуализация через программный
рендеринг. Но следует учесть следующий аспект
программного рендеринга: он может быть единственно
доступным решением для систем, в которых нет аппаратных
3
D ускорителей.

IDL позволяет работать с файлами различных форматов
в том числе с графическими, например, BMP, JPEG, PNG;
форматами, разработанными специально для научных задач,
например, HDF, CDF, NCDF и несколькими
распространенными форматами хранения дан
ных, например,
XML, ASCII. Существует возможность работы с данными в
формате DICOM (Digital Imaging and Communications in
Medicine).

Результатом программирования на языке IDL может
быть представление данных

наблюдений Солнца (рис. 2.
12
)
.


59


Рис. 2.
12

Форма
представления данных наблюдений Солнца.



60

Глава
3 Разработка

параллельных алгоритмов и
программ

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

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

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

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

61

ответить на два вопроса: как выделить относит
ельно
независимые потоки команд и

как размещать и использовать
кадры данных.

На рис. 3.1

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

абл
ица 1.1)
.

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






62









Рис. 3.1

Схема многоуровневых алгоритмов, потоков команд и их
реализации.


П
оток

I

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

Поток II осуществляет передачу обработанных кадров
на этап отображения. При передаче кадров из буфера

63

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

Команды потока III осуществляют покадровую
обработку. Алгоритмами обработки могут быть: контроль
резкости, распознавание, п
одчеркивание границ и др. Для
выполнения алгоритмов необходимо читать данные всего
кадра. Начало работы потока осуществляется импульсами
периода обрабатываемых сигналов (мягкая синхронизация).

Команды потока IV осуществляют построковую
обработку. Основны
е алгоритмы: интерполяция цвета,
коррекция дефектов, коррекция цвета, гамма коррекция,
компенсация искажений в линзе, объединение отсчетов и др.
Алгоритмы работают с одной строкой кадра изображения.
Мягкая синхронизация проводится с использованием
строковы
х импульсов.

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

64

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

Самый низкоуровневый поток


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

с тактовым генератором ФП. Кроме
чтения отсчетов в этом потоке могут выполняться простые
алгоритмы обработки:
авто баланс

белого, ДКВ и др.

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

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

Рассмотрим вопрос, как размещать и использовать
буферы данных. Данный вопрос возникает потому, что при
пара
ллельно работающих потоках команд происходит
регулярное обращение к одним и тем же данным из разных
потоков. Указанную зависимость по данным можно
преодолеть двумя путями. Во
-
первых, для каждого
вычислительного ядра можно создавать свой буфер данных,
с кот
орыми происходит работа текущего алгоритма. Во
-
вторых, можно иметь общий буфер, например, на кадр

65

пикселей, и с ним работать со стороны всех имеющихся ядер,
используя при этом команды синхронизации по аналогии с
командами библиотеки OpenMP (команды замков
lock).

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

представлена схема буферов при многопоточной обработке с
разделением

потоков в соответств
ии с рис.

3.1
.


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


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


66

Наиболее широкое распространение получили
кадровые видеокамеры, в которых единицей информации,
получаемой из

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

Кадры из камеры один за другим поступают в буфер Б1
с участием процессорного ядра 1. Затем они переписываются
в буфер

Б2, с которым работает процессорное ядро 2,
выполняя поток команд П5. Затем кадр, обработанных на
первом этапе пикселей, переписываются в буфер Б3, с
которым начинает работать процессорное ядро 3. Процесс
перепись


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

Представленная схема (рис. 3.3
) является примером
реализации конвейерного м
еханизма обработки кадров.
Схема может быть применена как с использованием команд
OpenMP, так и команд MPI. Ограничением является
необходимость использования операций по переписи кадров
из одного буфера в другой, что существенно уменьшает

67

время, выделяемое

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

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

На рис. 3.4

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

Ниже представлена возможная реализация алгоритма с
применением функции omp parallel for библиотек
и OpenMP и
функций cvQueryFrame (захват картинки с камеры или с

68

видеофайла), CV_GAUSSIAN (сглаживание по гауссиане в
области 3х3 вокруг каждого пикселя изображения),
cvWriteFrame (запись кадра в видеофайл) библиотеки
OpenCV. Программа захватывает кадр, фил
ьтрует по
гауссиане и записывает в выходной видеофайл. Захват
(чтение) и вывод кадров
происходит

последовательно, для
этой цели применена директива omp critical. Обработка
полученных кадров происходит параллельно тем
количеством вычислительных ядер, которы
е имеются в
вычислительной системе.


#pragma omp parallel for


for (int i = 0; i count; i++) {



IplImage *inputFrame3;


#pragma omp critical



{




inputFrame3 = cvQueryFrame(input3);



}




cvSmooth(inputFrame
3, inputFrame3, CV_GAUSSIAN, 5,
3);


#pragma omp critical



{




cvWriteFrame(parallelGaussWriter, inputFrame3);



}


}


Можно предложить алгоритм многопоточной
обработки данных видеокамеры, в котором отдельные

69

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


Применение рассмотренных принципов конвейерной,
векторной и
параллельной обработки видео определяется
выбранной аппаратной платформой камеры.



70

Заключение

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


71

Список литературы

1)
Дьяконов В. П.

MATLAB

6.5/7.0/7
SP
1 +
Simuli
nk

5/6.
Работа с изображениями и видеопотоками. Библиотека

профессионала
.

-

Москва
.

«
СОЛОН
-
Пресс
», 2005
г
.

2) OpenCL
-

The open standard for parallel programming of
heterogeneous systems. https://www.khronos.org

3) Молодяков С.А. Проектирование
специализиро
ванных
цифровых видеокамер. СПб. Изд
-
во Политехн. ун
-
та, 2016г.

4)
Боресков А.В., Харламов А.А. Основы работы с
технологией CUDA. ДМК Пресс, 2010г.

5)
Джианпинг Жоу
.

Как получить максимум от конвейерной
обработки изображений // Компоненты 2010г
.

6)
Основны
е форматы видеофайлов.
http://www.antula.ru/video
-
format.htm

7)
Калинкина Д., Ватолин Д. Проблема подавления шума на
изображениях и видео и различные подходы к ее решению.
Компьютерная графика и мультимедиа. 2005г.

Обработка
кадров
Верхний уровень
Построковая
обработка
Попиксельная
обработка
Обработка в ФПЗС,
формирование
сигналов
Нижний
уровень
вни алгоритмов
Управление
режимом
Компьютер
Процессор
вторичной обр
Первичный
процессор
Генератор
БИС, ПЛИС
Уровни реализации
Поток
. Поддерживает работу с
оператором .
Синхронизация по часам времени.
Поток V. Попиксельная
обработка. Синхронизируется
тактовым генератором ФП.
Мягкая синхронизация.
Поток VI. Управление
фотоприемником
чтение отсчета
Синхронизируется тактовым
генератором ФП.
Жесткая синхронизация.
Поток III. Обработка кадров.
Син
хронизируется импульсами
периода обрабатываемых сигналов.
Поток II. Передача данных.
Внутренняя синхронизация.
Поток IV. Построковая обработка.
Синхронизируется тактовым
генератором ФП. Мягкая
синхронизация.
Список литературы
1)
Дьяконов В. П.
MATLAB
6.5/7.0/7
1 +
Simuli
Работа с изображениями и видеопотоками. Библиотека
профессионала
СОЛОН
Пресс
», 2005
2) OpenCL -
The open standard for parallel programming of
heterogeneous systems. https://www.khronos.org
3) Молодяков С.А. Проектирование специализированных
цифровых видеокамер. СПб. Изд-во Политехн. ун-та, 2016г.
4)
Боресков А.В., Харламов А.А. Основы работы с
технологией CUDA. ДМК Пресс, 2010г.
5)
Джианпинг Жоу.
Как получить максимум от конвейерной
обработки изображений // Компоненты 2010г.
6)
Основные форматы видеофайлов.
http://www.antula.ru/video-format.htm
7)
Калинкина Д., Ватолин Д. Проблема подавления шума на
изображениях и видео и различные подходы к ее решению.
Компьютерная графика и мультимедиа. 2005г.
Заключение
В ходе данной работы были исследованы пути
использования методов параллелизации для обработки
видеоизображения. Также рассмотрены существующие и
актуальные на данный момент программные средства, по
обработке видеоизображения. И на основе полученной в ходе
исследования информации, были разработаны параллельные
алгоритмы и приведены примеры программ.
потоки команд работают с разными участками кадра
изображения. В этом случае, возможно, устранить
зависимости по данным между командами. Но
предпочтительно использовать не один, а два
переключаемых буфера, с каждым из которых по переменно
работают все вычислительные ядра.
Применение рассмотренных принципов конвейерной,
векторной и параллельной обработки видео определяется
выбранной аппаратной платформой камеры.
видеофайла), CV_GAUSSIAN (сглаживание по гауссиане в
области 3х3 вокруг каждого пикселя изображения),
cvWriteFrame (запись кадра в видеофайл) библиотеки
OpenCV. Программа захватывает кадр, фильтрует по
гауссиане и записывает в выходной видеофайл. Захват
(чтение) и вывод кадров происходит последовательно, для
этой цели применена директива omp critical. Обработка
полученных кадров происходит параллельно тем
количеством вычислительных ядер, которые имеются в
вычислительной системе.
#pragma omp parallel for
for (int i = 0; i < count; i++) {
IplImage *inputFrame3;
#pragma omp critical
{
inputFrame3 = cvQueryFrame(input3);
}

cvSmooth(inputFrame
3, inputFrame3, CV_GAUSSIAN, 5,
3);
#pragma omp critical
{
cvWriteFrame(parallelGaussWriter, inputFrame3);
}
}
Можно предложить алгоритм многопоточной
обработки данных видеокамеры, в котором отдельные
время, выделяемое на выполнение команд алгоритмов
обработки. Для сокращения указанного времени можно
предложить использование команд строковой передачи,
которые можно включить в программу с использованием
встроенного ассемблера.
Можно предложить схему (рис. 3.4) конвейерной
обработки видео, которая не требует переписи кадров из
буфера в буфер. В этом случае видеокамера должна
переключать адреса записи кадров в память. Каждый
следующий кадр будет находиться в новом буфере.
На рис. 3.4 показано 4-е буфера. Пятый кадр будет
записан снова в первый буфер. Таким образом, время на
работу совокупного алгоритма обработки будет равно
времени следования 4-х кадров. В представленной схеме
каждое ядро обработки выполняет полный набор алгоритмов
обработки видео. Разбиение на потоки в этих ядрах может
отсутствовать. В данной схеме можно ожидать большей
производительности и за счет более эффективного
использования Кэш-памяти в ядрах обработки.
Ниже представлена возможная реализация алгоритма с
применением функции omp parallel for библиотеки OpenMP и
функций cvQueryFrame (захват картинки с камеры или с
Наиболее широкое распространение получили
кадровые видеокамеры, в которых единицей информации,
получаемой из камеры, является кадр пикселей. В этом
случае схема буферов при многопоточной обработке данных
может выглядеть в соответствии с рис. 3.3.
Кадры из камеры один за другим поступают в буфер Б1
с участием процессорного ядра 1. Затем они переписываются
в буфер
Б2, с которым работает процессорное ядро 2,
выполняя поток команд П5. Затем кадр, обработанных на
первом этапе пикселей, переписываются в буфер Б3, с
которым начинает работать процессорное ядро 3. Процесс
перепись –
обработка может исполняться дальше.
Количество этапов и соответственно буферов зависит от
количества имеющихся ядер и используемых алгоритмов
обработки. В конце обработки (из 4-го ядра) данные
передаются на отображение.
Представленная схема (рис. 3.3) является примером
реализации конвейерного механизма обработки кадров.
Схема может быть применена как с использованием команд
OpenMP, так и команд MPI. Ограничением является
необходимость использования операций по переписи кадров
из одного буфера в другой, что существенно уменьшает
пикселей, и с ним работать со стороны всех имеющихся ядер,
используя при этом команды синхронизации по аналогии с
командами библиотеки OpenMP (команды замков lock).
Предложенная схема разделения алгоритмов и команд
на потоки позволяет существенно сократить объем буферной
памяти, необходимой для работы программ. На рис. 3.2
представлена схема буферов при многопоточной обработке с
разделением
потоков в соответствии с рис.
В схеме представлены все потоки команд и буферы для
их выполнения. Показано, что для попиксельной и для
построко
й обработки размер буферов минимальный –
на
несколько пикселей и строку пикселей соответственно.
Основные буферы хранения пикселей продублированы. Это
необходимо для разнесения операций работы с памятью. В
один буфер пишем, например, строку пикселей, а во втором
обрабатываем и передаем. Затем происходит переключение
буферов. Время выполнения, например, построковых
алгоритмов ограничено периодом следования строк. Для
увеличения времени, выделенного для алгоритма, количество
буферов должно быть соответственно также увеличено.
и др. Поток синхронизируется тактовым генератором
управления ФП. Синхронизацию можно считать условно
мягкой.
Самый низкоуровневый поток –
это поток VI. Здесь
осуществляется управление фотоприемником и чтение
отсчета. Синхронизация выполнения команд безусловно
жесткая, связанная с тактовым генератором ФП. Кроме
чтения отсчетов в этом потоке могут выполняться простые
алгоритмы обработки: авто баланс
белого, ДКВ и др.
Перечисленные потоки команд могут быть выполнены
в разных процессорах и элементах. Некоторые комбинации
элементов представлены на рис. 3.1, причем, например,
ЦСП можно использовать несколько вычислительных ядер.
Рассмотрим вопрос, как размещать и использовать
буферы данных. Данный вопрос возникает потому, что при
параллельно работающих потоках команд происходит
регулярное обращение к одним и тем же данным из разных
потоков. Указанную зависимость по данным можно
преодолеть двумя путями. Во-первых, для каждого
вычислительного ядра можно создавать свой буфер данных,
с которыми происходит работа текущего алгоритма. Во-
вторых, можно иметь общий буфер, например, на кадр
обработки в буфер отображения возможно осуществить
дополнительную обработку или преобразование формата
данных. Поддерживается жесткая внутренняя
синхронизация.
Команды потока III осуществляют покадровую
обработку. Алгоритмами обработки могут быть: контроль
резкости, распознавание, подчеркивание границ и др. Для
выполнения алгоритмов необходимо читать данные всего
кадра. Начало работы потока осуществляется импульсами
периода обрабатываемых сигналов (мягкая синхронизация).
Команды потока IV осуществляют построковую
обработку. Основные алгоритмы: интерполяция цвета,
коррекция дефектов, коррекция цвета, гамма коррекция,
компенсация искажений в линзе, объединение отсчетов и др.
Алгоритмы работают с одной строкой кадра изображения.
Мягкая синхронизация проводится с использованием
строковых импульсов.
Команды потока V проводят попиксельную обработку,
т.е. для их выполнения необходимо иметь буфер на один или
несколько ближайших пикселей. В командах потока V могут
быть реализованы следующие алгоритмы: компенсация
уровня черного, контроль насыщения, преобразование Bayer
Рис. 3.1
Схема многоуровневых алгоритмов, потоков команд и их
реализации.
Поток
поддерживает работу с пользователем камеры
или с оператором. Этот поток команд о
существляет
отображение видео. Может поддерживаться мягкая
синхронизация, например, по кадровым сигналам или по
часам времени.
Поток II осуществляет передачу обработанных кадров
на этап отображения. При передаче кадров из буфера
ответить на два вопроса: как выделить относительно
независимые потоки команд и как размещать и использовать
кадры данных.
На рис. 3.1 показан практически полный набор потоков,
которые могут исполняться параллельно на вычислительных
ядрах и других устройствах. Разделение на потоки команд
проведено на основе разделения алгоритмов на пять уровней
аблица 1.1).
В схеме отмечены особенности синхр
онизации
потоков. Причем определены два режима синхронизации:
жесткая и мягкая синхронизации. При жесткой
синхронизации обработка пикселей должна осуществляться
сразу же при их появлении. При мягкой синхронизации
обработка пикселей может осуществляться с задержкой, но
время обработки ограничено появлением следующей порции
пикселей.
Глава
3 Разработка
параллельных алгоритмов и
программ
Параллельная обработка на вычислительных ядрах.
Известны три парадигмы использования вычислительных
ядер. Первая парадигма определяется архитектурой
применения общей памяти несколькими процессорными
ядрами. Примером является архитектура процессоров i7,
которые включают, например, 4 ядра, расположенных на
общей шине с памятью. Программирование поддержано с
использованием библиотеки OpenMP. Вторая парадигма
связана с архитектурой систем с распределенной памятью.
Примером являются различные архитектуры
суперкомпьютеров. Программирование осуществляется с
использованием библиотеки MPI. Третья парадигма связана с
использованием матричных процессоров. Примером является
технология CUDA.
Непосредственное применение любой из описанных
парадигм для приема, обработки и передачи потока
изображений затруднительно. Трудности параллельной
обработки потока кадров на параллельных вычислительных
ядрах связаны с большим объемом данных (пикселей),
которые непрерывно поступают с фотоприемника. Для
использования процессорной многоядерности необходимо
Рис. 2.
Форма представления данных наблюдений Солнца.
помочь решить достаточно сложные задачи. IDL обладает
мощными средствами визуализации данных. Визуализация
данных в IDL поддерживает два типа рендеринга (rendering):
программный рендеринг и рендеринг с использованием
аппаратных 3D ускорителей, которые поддерживают
библиотеку OpenGL. В большинстве случаев визуализация
данных через OpenGL обладает лучшим качеством
изображения, чем визуализация через программный
рендеринг. Но следует учесть следующий аспект
программного рендеринга: он может быть единственно
доступным решением для систем, в которых нет аппаратных
D ускорителей.
IDL позволяет работать с файлами различных форматов
в том числе с графическими, например, BMP, JPEG, PNG;
форматами, разработанными специально для научных задач,
например, HDF, CDF, NCDF и несколькими
распространенными форматами хранения данных, например,
XML, ASCII. Существует возможность работы с данными в
формате DICOM (Digital Imaging and Communications in
Medicine).
Результатом программирования на языке IDL может
быть представление данных
наблюдений Солнца (рис. 2.12
).
Приведем пример проигрывания видео. В программе, в
ременной mov подготавливается ролик. Эта переменная
хранит массив из структур. Каждая структура имеет два
поля: cdata и colormap. Поле cdata хранит битовый образ
кадра, а поле colormap нужно чтобы хранить цветовую
палитру для видео с индексированным цветом.
// чтение видео
filename = 'd:\test\1.avi';
video = mmreader(filename);
nFrames = 200;
// подготавливаем структуру в которую будет прочитана информация
mov(1:nFrames) = struct('cdata', [], 'colormap', []);
// Читаем покадрово
for k = 1 : nFrames
mov(k).cdata = read(video, k);
end
// проигрываем видео
hf = figure;
set(hf, 'position', [150 150 video.Width video.Height])
movie(hf, mov, 1, video.FrameRate);
Для обработки и визуализации данных в разных
областях используют кроссплатформенный язык
программирования IDL (Interface Definition Language).
Последняя версия языка IDL v.8.5. Язык IDL предлагает
пользователям большое количество разнообразных
математических преобразований и функций, способных
Таким образом, в Mathcad читаем и обрабатываем
статические изображения.
Для обработки видео можно использовать среду Matlab.
Имеется большой объем документации. Приведем два
примера.
Первый простой пример чтения видео. Результатом
работы программы будет многомерная матрица изображений
кадров.
// открываем файл
video = mmreader('d:\test\1.avi');
// параметры открытого видео
width = video.Width;
height = video.Height;
frameRate = video.FrameRate;
numOfFrames = video.NumberOfFrames;
// читаем кадр, кадры нумеруются с 1
frameNo = 50;
frame = read(video, frameNo);
// читаем диапазон кадров
// 50 - номер первого прочитанного кадра
// 100 - номер последнего прочитанного кадра
framesRange = [50 100];
frames = read(video, framesRange);
// читаем все видео, операция не будет выполнена,
// в случае, если видео большое и не влезает в память
entireVideo = read(video);
скрипте автоматическую обработку фильмов, осуществляет
качественный захват видео с камеры.
Mathcad позволяет получить первые результаты работы
алгоритма за минимальный промежуток времени. Поиск
ошибок осуществляется быстрее, чем в тексте программы на
любом языке программирования. Исходный код программы
выводится в графическом режиме, и потому выглядит
нагляднее, чем в текстовом редакторе. Mathcad имеет
множество реализованных, готовых к использованию
функций. Перечислим основные функции чтения-записи
изображения (file —
путь к файлу):
READRGB ("file") —
чтение цветного изображения;
READBMP ("file") —
чтение изображения в оттенках
серого;
WRITERGB("file") —
запись цветного изображения;
WRITEBMP ("file") — запись изображения в оттенках
серог
о.
Результатом выполнения, например, функции
READRGB ("file"), являются три матрицы RGB пикселей.
популярных форматов видео без установки дополнительных
кодеков.
GOM Media Player имеет так же много опций, как и в
других проигрывателях: захват экрана, захват аудио,
контроль скорости воспроизведения видео и др.
Особенностью Gom Player является возможность
самостоятельного поиска и загрузки кодеков. Благодаря
этому, Gom
Player может открывать даже файлы с
нарушенной и неправильной структурой.
Программы обработки видео можно разделить на
готовые и на те, которые нужно написать. В первом случае
обычно обрабатывают традиционные видеофильмы, а во
втором случае обрабатывают специальные видео,
полученные, например, на телескопах.
VirtualDub - это одна из готовых распространенных
программ для поточной обработки видео. У программы
открытые исходники, что позволяет модифицировать
исходный код. Программа имеет следующие возможности:
осуществляет просмотр и базовое редактирование видео,
позволяет конвертировать в разные форматы видео и аудио,
обрабатывает видео (и аудио) с использованием фильтров,
осуществляет восстановление файлов, позволяет указывать в
заботу о передаче сообщений между процессами берет на
себя интерфейс
MPI
Обзор существующих программных средств
Программными средствами для видеокамер являются
два типа программ – это видеопроигрыватели и программы
обработки видео. Известно достаточно много разных
видеопроигрывателей. Они позволяют просматривать видео
файлы и отображать видео поток с камеры и отличаются
функциональной насыщенностью. Обычно по умолчанию на
компьютере установлен Windows Media, однако он не
поддерживает ряд функций. Например, он не позволяет
изменять пропорции картинки, просматривать ее часть и т.д.
Перечислим самые
распространенные проигрыватели:
Media Player. Имеет следующие особенности: быстрая
скорость работы; поддержка всех современных ОС Windows;
поддерживает сетевой режим: можно смотреть видео из
интернета, а также самому
организовывать трансляцию.
KMPlayer. Основной особенностью является наличие
встроенных кодеков, т.е. после установки проигрывателя
KMPlayer можно открывать и просматривать большинство
Рис.
2.11
Обмен сообщениями
MPI
MPI
отправка сообщения;
MPI
прием сообщения
С точки зрения разработчика процесс –
это одна из ветвей
параллельной программы, которой необходимо обеспечить
коммуникацию с другими ветвями (процессами)
параллельного приложения. Поскольку зачастую все
процессы одного приложения выполняют один и тот же код,
то приходится реализовывать взаимодействие этого кода с
самим собой с учетом его выполнения в разных процессах.
Коммуникатор группы как раз и является той абстракцией,
которая обеспечивает взаимодействие процессов между
собой. При этом разработчика не должно интересовать,
каким способом передается информация между процессами:
Рис.
2.10
Коммуникатор.
Коммуникатор выступает для прикладной группы как
коммуникационная среда взаимодействия. Коммуникаторы
бывают внутригрупповыми (
intra
) и межгрупповыми (
inter
Коммуникатор определяет контекст передачи сообщений.
Сообщения, использующие разные коммуникаторы, не
оказывают влияния друг на друга и
не взаимодействуют друг
с другом. Каждая группа процессов использует отдельный
коммуникатор. Если в группе
процессов, то процессы
внутри группы имеют номера от 0 до
1. С точки зрения
операционной системы процесс рассматривается как
отдельное приложен
ие, не взаимодействующее с другими
процессами (приложениями).
участвующих в работе приложения, используется один и тот
же программный код.
Таким образом, для создания параллельной программы
достаточно написать программный код, в который будет
включена библиотека
MPI
реализованы все необходимые
механизмы взаимодействия параллельных ветвей
программы, откомпилировать этот программный код и
обеспечить запуск исполняемого файла на нескольких ядрах.
MPI
основные понятия:
Процесс – это исполнение программы на одном
процессоре, на котором установлен
MPI
, безотносительно к
тому, содержит ли эта программа внутри параллельные ветви
или операции ввода/вывода или просто последовательный
программный код;
Группа – это совокупность процессов, каждый из
которых имеет внутри группы уникальное имя, используемое
для взаимодействия с другими процессами группы
посредством коммуникатора группы;
Коммуникатор группы –
интерфейс синхронизации и
обмена данными между процессами.
Рис
. 2.9
Модель параллельных вычислений
MPI
Главное отличие параллельной программы, использующей
интерфейс
MPI
, от традиционной непараллельной
программы состоит в том, что в параллельной программе в
один момент времени могут выполняться несколько
различных о
пераций на разных процессорах/ядрах.
Разработчик должен создать программный код для каждого
ядра. Стандарт
MPI
предполагает возможность разработки
приложений с уникальным кодом для каждой из
параллельных ветвей алгоритма, т.е. со своим кодом для
каждого яд
ра. Однако в большинстве случаев для всех ядер,
последовательного и параллельного вариантов программы
является единым и это в значительной степени упрощает
проблему сопровождения, развития и совершенствования
программ.
OpenMP
позволяет в значительной степени
снизить остроту проблемы переносимости параллельных
программ между разными компьютерными системами
параллельная программа, разработанная на языке
или
Fortran
с использованием технологии
OpenMP
, как правило,
будет работать для разных вычислительных сис
тем с общей
памятью.
Существует также другая библиотека для параллельной
обработки в вычислительных ядрах:
MPI
(англ.
Message
Passing Interface).
На сегодняшний день
MPI
является
наиболее распространенной технологией параллельного
программирования для супе
ркомпьютеров. Существуют
реализации
MPI
для языков Си,
++ и
Fortran
. Примеры и
описания всех функций даны с использованием языка Си.
Основные идеи и правила создания программ с
использованием интерфейса
MPI
схожи для всех языков.
При разработке технологии
OpenMP
был учтен накопленный
опыт по разработке параллельных программ для систем с
общей памятью. В техно
логии
OpenMP
в значительной
степени упрощена форма записи директив и добавлены
новые функциональные возможности. Технология
OpenMP
позволяет в максимальной степени эффективно реализовать
возможности многопроцессорных вычислительных систем с
общей памятью,
обеспечивая использование общих данных
для параллельно выполняемых потоков без каких
либо
трудоемких межпроцессорных передач сообщений.
Сложность разработки параллельной программы с
использованием технологии
OpenMP
в значительной степени
согласуется со сло
жностью решаемой задачи
распараллеливание сравнительно простых последовательных
программ, как правило, не требует больших усилий (порою
достаточно включить в последовательную программу всего
лишь несколько директив
OpenMP
). Технология
OpenMP
обеспечивает
возможность поэтапной (инкрементной)
разработки параллельных программы
директивы
OpenMP
могут добавляться в последовательную программу
постепенно, позволяя уже на ранних этапах разработки
получать параллельные программы, готовые к применению;
при этом в
ажно отметить, что программный код получаемых
данной технологии директивы параллелизма используются
для выделения в программе параллельных фрагментов, в
которых последовательный исполняемый код может быть
разделен на несколько раздельных командных потоков
threads
). Далее эти потоки могут исполняться на разных
процессорах (процессорных ядрах) вычислительной системы.
В результате такого подхода программа представляется в
виде набора последовательных (однопотоковых) и
параллельных (многопотоковых) участков
ограммного
кода (рис. 2.8
Рис 2.8
Общая схема выполнения параллельной программы при
использовании технологии
OpenMP
DirectShow и OpenCV. Они позволяют не только легко
написать программу чтения и вывода видео, но и
обеспечивают предельно высокую производительность.
Библиотеки функций для параллельной обработки в
вычислительных ядрах OpenMP, MPI
последнее время активно развивается подход к разработке
параллельных программ, когда указания программиста по
организации параллельных вычислений добавляются в
программу при помощи тех или иных внеязыковых средств
языка программирования –
например, в виде директив или
комментариев, которые обрабатываются специальным
препроцессором до начала компиляции программы. При
этом исходный текст программы остается неизменным, и по
нему, в случае отсутствия препроцессора, компилятор
построит исходный последовательный программный код.
Препроцессор же, будучи примененным, заменяет директивы
параллелизма на некоторый дополнительный программный
код. Рассмотренный выше подход является основой
технологии
OpenMP
, наиболее широко применяемой в
настоящее время для организации параллельных вычислений
на мног
опроцессорных системах с общей памятью. В рамках
Библиотека Accord.NET обеспечивает статистический
анализ, машинное обучение, обработку изображений и
компьютерное зрение для .NET приложений. Accord.NET
Framework расширяет популярную AForge.NET с новыми
функциями, добавляя к более полному среды для научных
вычислений в .NET. Библиотека содержит большой набор
методов для работы с видео: детекторы интереса,
графические фильтры, методы сшивания изображений, в
режиме реального времени обнаружения лица и слежения, а
также общие методы для обнаружения, отслеживания и
трансформации объектов в потоках изображений.
Qt – кроссплатформенный инструментарий разработки
ПО на языке программирования
C++
. Qt позволяет запускать
написанное с его помощью ПО в большинстве современных
операционных систем путём простой компиляции
программы для каждой ОС без изменения исходного кода.
Включает в себя все основные классы, которые могут
потребоваться при разработке прикладного программного
обеспечения, в том числе элементы графического
интерфейса, функции работы с камерой.
В заключении отметим, что наиболее удобным и
понятным в разработке приложений являются библиотеки
обработки изображений и речи. Данные API могут быть
использованы при разработке собственных приложений.
Графически модель использования библиотеки представлена
рис. 2.7.
Рис. 2.7
Структура и модель использования библиотеки Intel IPP
.
Media Foundation - мультимедийный фреймворк и
интерфейс программирования приложений нового
поколения, который создан корпорацией Microsoft для
работы с цифровым мультимедиа под операционными
системами семейства Windows. Он приходит на смену
DirectShow.
Другие библиотеки
для обработки видео
Для обработки и просмотра видео можно использовать
функции и других библиотек. Такими библиотеками могут
быть: Intel IPP, AviCap32, Qt, Media Foundation, Accord.NET
и др.
В библиотеке Intel IPP (Integrated Performance
Primitives) реализованы сотни широко используемых
функций для преобразований изображений, статистики,
компьютерного зрения и еще десятка областей. Функции
оптимизированы под архитектуру процессора, в частности, в
них используются возможности векторизации. Они
значительно увеличивают скорость работы приложений.
Библиотека Intel IPP представляет собой набор
оптимизированных реализаций базовых (низкоуровневых)
операций (данные реализации поставляются в бинарном
виде). Логически библиотеку можно разделить на 3 больших
модуля: обработка сигналов (одномерных массивов),
обработка изображений и видео, операции над матрицами
небольшого размера и реалистичный рендеринг. Для того
чтобы облегчить процесс разработки ПО с использованием
библиотеки, отдельно в виде исходных кодов поставляются
высокоуровневые API для аудио и видеокодеков, функций
видео и аудио. В классе функций MediaPlayer имеются
методы Open, Play, Pause, Stop и др., которые позволяют
легко написать программу проигрывателя. На рис. 2.6
приведен пример внешнего вида экрана компьютера при
работе программы просмотра видеофайлов, написанной с
использованием функций библиотеки Windows.Media. В
программе можно не только управлять громкостью звука,
выбирать файл, проигрывать, ставить на паузу, но и
управлять скоростью воспроизведения.
Рис. 2.6
Экран программы проигрывателя видеофайлов со
звуком, написанной с использованием функций библиотеки
Windows.Media.

{ vv.Pause();

timer1.Stop(); }

else

{ return; } }
private void button3_Click(object sender, EventArgs e)
{ if (playing)

{ trackBar2.Value = 0;

er1.Stop();

vv.Stop(); }

else { return; }
}
Рис. 2.5 Экран программы проигрывателя видеофайлов,
написанной с использованием функций библиотеки DirectShow.
Проста в использовании библиотека Windows.Media,
которая имеет большое количество классов и структур,
позволяющих работать с разным контентом, в том числе с
namespace WindowsFormsApplication1
{ public partial class Form1 : Form
{ Video vv;
bool playing = false;
string filename = "";
public Form1()
{ InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{ if (!playing)

{ vv = new Video(filename);

vv.Audio.Volume = trackBar1.Value;

vv.Owner = pictureBox1;

trackBar2.Maximum = Convert.ToInt32(vv.Audio.Duration) * 10;

vv.Fullscreen = false;

vv.Size = new Size(ClientRectangle.Width-30,
ClientRectangle.Height-100);

vv.Play();

timer1.Start();

playing = true; }

else if(playing)

{ timer1.Start();

vv.Play();

vv.Audio.Volume = trackBar1.Value;

playing = true
} }
private void button4_Click(object sender, EventArgs e)
{ OpenFileDialog ofd = new OpenFileDialog();

ofd.Filter = "Avi files| *.avi|Wmv files| *wmv";

if (ofd.ShowDialog() == DialogResult.OK)

{ filename = ofd.FileName;

if (playing)

{ trackBar2.Value = 0;

timer1.Stop();

vv.Stop();

vv = new Video(filename);

vv.Open(filename);

vv.Owner = pictureBox1;

vv.Fullscreen = false;

vv.Size = new Size(ClientRectangle.Width + 50,
ClientRectangle.Height - 110); } } }
private void button2_Click(object sender, EventArgs e)
{ if (playing)
Синхронизация фильтров. Однако, просто правильно
составленного графа
достаточно. Граф должен иметь
возможность управлять потоком, например, поставить
воспроизведение на паузу, остановить поток или напротив,
воспроизвести его. Кроме того, нужно как-то
синхронизировать фильтры, потому, что звук и видео при
воспроизведении видео фильма делятся на два потока,
которые могут
один опережать другой. Для синхронизации
DirectShow предоставляет программные часы, которые
доступны для всех фильтров графа. Часы работают с
точностью до 100 нс.
Когда программист посылает одну из
трех основных команд стоп или пауза, она передается
каждому фильтру графа в отдельности, фильтры в свою
очередь должны быть способны обработать команду. Ниже
приведен пример программы проигрывания видеофайлов,
написанной на языке C# с использованием функций
библиотеки DirectShow. На рис.
6.9 представлен экран этой
программы.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX.AudioVideoPlayback;
манипулировать аудио-, видеоданными для создания
сложных визуальных эффектов, или, просто объединять или
разъединять аудио и видео каналы. В стандартной поставке
вместе с операционной системой Windows корпорация
Microsoft предоставляет небольшое количество фильтров:
кодеки (
MPEG-1
, MP3, WMV, WMA, MIDI), контейнеры
(AVI, WAV, ASF), несколько сплитеров (или
демультиплексоров) и
мультиплексоров
. Остальные
популярные фильтры: кодеки (MPEG-4
, H.264,
Vorbis)
и контейнеры (
MP4
Ogg
) устанавливаются с
различными дополнительными
программами.
Фильтры визуализации (рендеринга) - используются
для вывода данных из потока в стандартное физическое
устройство вывода, например, на монитор, на
звуковую
карту
или в файл. Аналогично с фильтрами захвата,
фильтров визуализации тоже может быть несколько,
например, для одновременного отображения видео на экране
и записи его
в файл.
Фильтры соединяются между собой через каналы,
образуя поток, через который идут данные. Совокупность
соединенных между собой фильтров образуют граф. Пример
графа фильтров для воспроизведения AVI файла представлен
на рис. 2.4.
физических устройств. В роли устройства могут быть как
различного рода видео устройства (портативные видео
камеры, веб-камеры, TV-тюнеры), так и аудио устройства
микрофон
, модемная линия), а также данные могут быть
получены и из файла (MPEG, MP3, AVI
Используя
DirectShow можно одновременно использовать несколько
фильтров захвата к примеру, для одновременного захвата
видео с камеры и звука с микрофона. Количество
используемых фильтров захвата зависит лишь от мощности
используемого
компьютера
с. 2.4
Пример графа фильтров для воспроизведения AVI файла
.
Фильтры преобразования -
используются
для обработки
поступающих данных из потока программы и последующей
отправки преобразованных данных назад в поток
следующему типу фильтров. Данный тип фильтров может
производить анализ данных, может полностью
Filter graph. Граф фильтров —
это совокупность
активно существующих (как объектов) фильтров для
некоторой программы. Фильтры могут, как быть, так и не
быть соединенными. Они просто являются узлами графа. Для
организации графа используется специальный программный
компонент -
Filter Graph Manager.
Media Sample. Порция данных представляет
обрабатываемые данные. Она имеет определенный тип,
формат, объект ее представляющий со своим интерфейсом,
обеспечивающим доступ к данным. Понятия тип и формат
поясняются в описании реализации фильтра для передачи
данных.
Allocator. Объект, отвечающий за выделение блоков
памяти для хранения порций данных. При соединении
фильтров от одного соединителя к другому должен быть
выбран такой объект (создан или использован имеющийся от
других соединений).
Фильтры DirectShow разделены на три типа,
соответственно и возможности DirectShow можно
классифицировать соответствующим образом.
Фильтры захвата —
предназначены для ввода
мультимедиа
данных в
поток
программы с различных
строятся из элементов (фильтров), которыми являются
кодеки, декомпрессоры и т.д. У каждого элемента есть
каналы, входные и выходные, по которым элементы
соединяются между собой. Несколько соединенных между
собой элементов образуют граф.
Любая программа, которая использует DirectShow
интерфейс, автоматически сможет использовать другие
DirectShow компоненты, установленные в систему: декодеры
видео, декодеры звука, splitter’ы (демультиплексоры) для
извлечения аудио/видеопотоков из разных форматов файлов-
контейнеров, фильтры для их обработки (например, для
наложения субтитров). Это позволяет каждому пользователю
конструировать подсистему для работы с видео из различных
«кубиков» по своему вкусу —
за их применение по
назначению и автоматическое соединение в цепочки
отвечает ОС. Перечислим основные элементы Direct Show.
Filter. Фильтры выполняют работу по переработке
данных, получаемых от входных соединений, и передают
обработанные данные на выходные соединения.
Pin. Соединения отвечают за соединения фильтров
между собой, указывая пути прохождения потоков.
исходная картинка, распределение пикселей по цветам и
палитра по количеству используемого цвета.
Рис. 2.3
Результат работы программы определения доминирующих
цветов
,
использованием
функций библиотеки OpenCV
.
2.1.2 Библиотека
irectS
how
DirectShow – мультимедийный фреймворк и интерфейс
программирования приложений (API) –
это универсальная
библиотека от Microsoft для работы с аудио и видео
Предоставляет широкий набор возможностей по
вводу/выводу и редактированию аудио- и видеопотоков.
Является одним из интерфейсов семейства DirectX, входит в
Windows SDK.
DirectShow основан полностью на технологии COM.
Программирование DirectShow связано с графами. Графы
cvReleaseCapture( &capture );
cvReleaseImage(& frame);
cvReleaseImage(& filterframe);
cvReleaseImage(&filterframe2);
cvDestroyWindow("capture");
cvDestroyWindow("filter");
return 0;
}
Рис. 2.2
Результат работы программы
захвата видео и нахождения
границ,
с использованием функций
библиотеки OpenCV.
А также пример программы определения
доминирующих цветов на изображении может быть полезна
для выбора палитры. например на Web-сайте. Алгоритм
программы построен на определении отношения пикселя к
набору цветов в пространстве HSV. На рис. 2.3 представлена
cvCreateTrackbar("xorder", "filter", &xorder, xorder_max,
myTrackbarXorder);
cvCreateTrackbar("yorder", "filter", &yorder, yorder_max,
myTrackbarYorder);
printf("[i] press Enter for capture image and Esc for quit!\n\n");
int counter=0;
char filename[512];
CvMat img;
while(true){

// получаем кадр

frame = cvQueryFrame( capture );
cvShowImage("capture", frame);
//показываем
filterframe = frame;
filterframe2 = filterframe;
// проверяем, чтобы порядок
производных по X и Y был отличен от 0

if(xorder==0 && yorder==0){

printf("[i] Error: bad params for cvSobel() !\n");

cvZero(filterframe);

}

else{

// применяем оператор Собеля

cvSobel(filterframe, filterframe2, xorder, yorder, aperture);

}

// показываем
cvShowImage("filter", filterframe2);

char c = cvWaitKey(33);

if (c == 27) { // нажата ESC

break;

}

else if(c == 13) { // Enter

// сохраняем кадр в файл

sprintf(filename, "Image%d.jpg", counter);

printf("[i] capture... %s\n", filename);

cvSaveImage(filename, frame);

counter++;

}
}
// освобождаем ресурсы
#include
#include
#include
#include
#include
int xorder = 1;
int xorder_max = 2;
int yorder = 0;
int yorder_max = 2;
// функция-обработчик ползунка -
порядок производной по X
void myTrackbarXorder(int pos) {
xorder = pos;
}
// функция-обработчик ползунка - порядок производной по Y
void myTrackbarYorder(int pos) {
yorder = pos;
}
int main(int argc, char* argv[])
{
// получаем любую подключённую камеру
CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY);
//cvCaptureFromCAM( 0 );
//проверяем корректность подключения
assert( capture );
// узнаем ширину и высоту кадра
double width = cvGetCaptureProperty(capture,
CV_CAP_PROP_FRAME_WIDTH);
double height = cvGetCaptureProperty(capture,
CV_CAP_PROP_FRAME_HEIGHT);
printf("[i] %.0f x %.0f\n", width, height );
IplImage* frame=0;
IplImage* filterframe=0;
IplImage* filterframe2=0;
//создаем окна
cvNamedWindow("capture", CV_WINDOW_AUTOSIZE);
cvNamedWindow("filter", CV_WINDOW_AUTOSIZE);
int aperture = 3;
//название ползунка, в каком окне будет, текущее
значение,
//максимальное, функция при изменении
камера неподвижна, а изображение подвижное, можно
использовать алгоритмы вычитания фона.
На следующем этапе можно производить вычисление
расположения объекта в 3d, реконструкцию 3d структуры,
анализ структуры, регистрацию и т. п. (модули calib3d,
contrib, video, stitching, videostab, ml). Например, в задаче
видеонаблюдения это восстановление траекторий объектов и
т. д.
В конце происходит распознавание и принятие
конкретных решений (модуль ml). Например, в системе
видеонаблюдения: появился нежелательный объект в кадре
или нет. В задаче детектирования текст
детектирован
текст, что именно за текст и т. д.
Ниже представлен текст программы, которая
захватывает видео с веб-камеры. Видео воспринимается как
последовательность кадров, и к каждому кадру применяется
фильтр –
оператор Собеля. Он позволяет находить границы
на изображении, для этого использует производные по x и y,
порядок производной влияет на точность результата,
изменять x и y можно с помощью ползунков. Видео и
результат работы программы отображается на экране
компьютера (рис. 2.2
Все начинается с захвата изображений из файла или с
видеокамеры (модуль highgui библиотеки OpenCV). Затем
осуществляется предварительная обработка изображений
(модуль imgproc), такая, как устранение шума, выравнивание
яркости, контраста, выделение и удаление бликов, теней.
Например, один и тот же объект при разном освещении
выглядит по-разному. В ярком свете красная машина,
движение которой, необходимо отслеживать, будет ярко-
оранжевой. В пасмурную погоду та же машина будет
выглядеть красно-розовой. В этом случае на изображении
необходимо выполнить выравнивание цветов.
Предобработка может быть простой, но может заключать в
себе целую сложную
технологию.
Следующий этап –
выделение особенностей (модули
imgproc, features2d). Например, в задаче слежения за
объектом это может быть поиск специальных точек на
объекте, за которыми легко наблюдать; для задачи
детектирования (т. е. обнаружения на изображении) лица –
вычисления описания каждого пикселя.
Далее происходит детектирование интересующих нас
объектов, выделение значимых частей, сегментация
изображения (модули imgproc, objdetect). Если, например,
функциями OpenCV, так как они обычно работают быстрее, а
код понятнее.
Заметим, что библиотека OpenCV реализует, как
правило, только базовые операции, используемые в
компьютерном зрении. Таким образом, ее можно
рассматривать как в целом низкоуровневую
библиотеку
компьютерного зрения. Для решения серьезных задач,
необходимо на основе предоставленных библиотекой
простых функций,
создавать более
сложные приложения.
На рис. 2.1 представлена общая схема типичного
приложения, предназначенного для решения той или иной
задачи компьютерного зрения.
Рис.
2.1
Схема приложения для задачи компьютерного зрения.
Алгоритмы распознания объектов (лиц,
предметов)
Алгоритмы для калибровки камер
Функции для классификации и анализа данных
Функции для работы с 2D графиками
Создание окон
Вывод изображений
Захват видео из файлов и камер
Чтение/Запись изображений
Поддерживаемые компиляторы:
Windows –
Microsoft Visual C++, Borland C++,
Intel Compiler, MinGW
Linux –
GCC, Intel Compiler
Mac
– Intel Compiler, Carbon и др.
Основные модули библиотеки.
Попиксельный доступ к изображениям. В OpenCV ест
несколько способов попиксельного доступа к изображениям.
Они различны по степени безопасности (контроль типов и
выхода за границы), по скорости работы и удобству. Всюду,
где это возможно, следует стараться избегать прямых
обращений к пикселям, а вместо этого пользоваться
Глава 2
Рассмотрение существующих программных
средств, по обработке видеоизображения
Библиотеки обработки видеоизображений
компьютерного уровня
Библиотека
OpenCV
OpenCV –
библиотека компьютерного зрения с
открытым исходным кодом (Open Source Computer Vision
Library), содержащая более 1000 функций для работы в
первую очередь с потоковым видео. Библиотека содержит
алгоритмы для обработки, реконструкции и очистки
изображений, распознания образов, захвата видео, слежения
за объектами, калибровки камер и др. Функциональность
доступна на разных языках: C, C++, Python, CUDA, Java.
Поддерживаются основные операционные системы: MS
Windows, Linux, Mac
, Android, iOS.
Основные функции библиотеки OpenCV:
Функции для работы с изображениями
(преобразование, фильтрация и т.д.)
Функции для анализа изображений (поиск
контуров, гистограммы и т.д.)
Алгоритмы анализа движений, слежение за
объектами
void main(void) {
float c[4] = {1, 2, 3, 4};
float d[4] = {5, 6, 7, 8};
double f[2]= {16, 4};

_asm {//sse1
movups xmm0, c
movups xmm1, d
addps xmm0, xmm1
movups c, xmm0
}
_asm {//sse2
movups xmm1, f
sqrtpd xmm0, xmm1
movups f, xmm0
}
getch();
Векторизация
Векторизация или векторная обработка массивов
данных связана с возможностью выполнения команды над
несколькими операндами одновременно (в классификации
Флинна - SIMD). При использовании векторизации можно в
несколько раз повысить скорость обработки. Необходимость
применения векторизации видно из процесса развития
процессоров Intel. Первые команды класса SIMD над
регистрами MMX (64 разряда) появились в первых
процессорах Pentium. Затем SIMD-команды нашли свое
развитие в технологиях SSE (128 разрядов) и AVX (256
разрядов). В ближайшее время появляются процессоры с
SIMD
-регистрами разрядностью 512, 1024. Количество
SIMD
-команд превосходит количество команд
вычислительного ядра процессора. SIMD-технология
поддержана и на высоком уровне программирования.
Имеются специальные директивы включения векторизации,
например, при оптимизации кода программы или
применения библиотеки OpenMP 4.0 и выше.
Пример применения SIMD-команд при сложении двух
массивов из 4 элементов в формате float:
#include
#include
delete[] v1; delete[] v2; delete[] v3;
getch();
return 0;
}
Для программирования графических процессоров
может использоваться и язык OpenCL. OpenCL (Open
Computing Language - открытый язык вычислений) -
фреймворк для написания компьютерных программ,
связанных с параллельными вычислениями на различных
разнородных системах, которые могут включать графические
и центральные процессоры, а также FPGA. В OpenCL входят
язык программирования, который базируется на стандарте
C99, и интерфейс программирования приложений (API).
OpenCL обеспечивает параллелизм на уровне инструкций и
на уровне данных и является реализацией техники GPGPU.
OpenCL является полностью
открытым стандартом, его
использование не облагается лицензионными отчислениями.
OpenCL предоставляет программисту низкоуровневый
API, через который он взаимодействует с ресурсами
устройства. OpenCL API может либо напрямую
поддерживаться устройством, либо работать через
промежуточный API (как в случае NVidia: OpenCL работает
поверх CUDA Driver API, поддерживаемый устройствами).
cutResetTimer(t1);
cudaSetDevice(0);

cudaDeviceProp *deviceProp = ShowDeviceInfo();

int size = deviceProp->maxThreadsPerBlock;
float *v1 = new float[size];
float *v2 = new float[size];
float *v3 = new float[size];
for (int i = 0; i <= size - 1; i++)
{
v1[i] = (float)i/10 + (float)i;
v2[i] = (float)i/5 + (float)2*i;
}
float *cv1, *cv2, *cv3;
cudaMalloc((void**)&cv1, size*sizeof(float));
cudaMalloc((void**)&cv2, size*sizeof(float));
cudaMalloc((void**)&cv3, size*sizeof(float));
cudaMemcpy(cv1, v1, size*sizeof(float),
cudaMemcpyHostToDevice);
cudaMemcpy(cv2, v2, size*sizeof(float),
cudaMemcpyHostToDevice);

dim3 gridSize = dim3(1, 1, 1); //Используем только один блок
dim3 blockSize = dim3(size, 1, 1); //Используем size нитей
//Событие окончания сложения
cudaEvent_t event;
cudaEventCreate(&event);
cudaEventRecord(event, 0); //0 - номер основного потока
cutStartTimer(t1);
vadd<<>>(cv1, cv2, cv3); //Складываем
вектора (асинхронно)
cudaEventSynchronize(event); //Ожидание окончания работы всех
нитей GPU
cutStopTimer(t1);
cudaMemcpy(v3, cv3, size*sizeof(float),
cudaMemcpyDeviceToHost);

printf("\nGPU vadd: %f ms\n\n", cutGetTimerValue(t1));

cudaEventDestroy(event);
cudaFree(cv1); cudaFree(cv2); cudaFree(cv3);
printf("Memory pitch: %d\n", deviceProp.memPitch);
printf("Max threads per block: %d\n",
deviceProp.maxThreadsPerBlock);
printf("Max threads dimensions: x = %d, y = %d, z = %d\n",
deviceProp.maxThreadsDim[0], deviceProp.maxThreadsDim[1],
deviceProp.maxThreadsDim[2]);
printf("Max grid size: x = %d, y = %d, z = %d\n",
deviceProp.maxGridSize[0], deviceProp.maxGridSize[1],
deviceProp.maxGridSize[2]);
printf("Clock rate: %d\n", deviceProp.clockRate);
printf("Total constant memory: %d\n",
deviceProp.totalConstMem);
printf("Compute capability: %d.%d\n", deviceProp.major,
deviceProp.minor);
printf("Texture alignment: %d\n",
deviceProp.textureAlignment);
printf("Device overlap: %d\n", deviceProp.deviceOverlap);
printf("Multiprocessor count: %d\n",
deviceProp.multiProcessorCount);
printf("Kernel execution timeout enabled: %s\n",
deviceProp.kernelExecTimeoutEnabled ? "true" : "false");
}
return &deviceProp;
}
//Спецификаторы вызова: global - GPU из CPU; device - GPU из GPU; host
- CPU из CPU
//Использован один блок
__global__ void vadd(float *v1, float *v2, float *v3)
{ int cur = threadIdx.x; //Получение нномера текущей нити
v3[cur] = v1[cur] + v2[cur];
}
__global__ void sort(int *arr, int size)
{ int i = threadIdx.x;
int k = 0, b = arr[i];
for (int j = 0; j <= size - 1; j++)
if (arr[j] < b) k++;
__syncthreads();
arr[k] = b;
}
int main()
{ unsigned int t1;
cutCreateTimer(&t1);
#pragma comment(lib, "cutil32D.lib")
int rint(int l, int h)
{ int r = h-l+1, res;
res = rand()%r+l;
return res;
}
int* rintarr(int size, int l, int h)
{ int *res = new int[size];//, t;
for (int i =0; i <= size - 1; i++)
{
//t = rint(0, size);
res[i] = size-i;//rint(l+t*h, h+t*h);
}
return res;
}
void iaprint(int *arr, int size)
{ for (int i =0; i <= size - 1; i++)
printf("%i ", arr[i]);
printf("\n");
}
//Выводим информацию об устройствах
cudaDeviceProp* ShowDeviceInfo()
{ int deviceCount;
cudaDeviceProp deviceProp;

//Получаем и выводим количество устройств
cudaGetDeviceCount(&deviceCount);
printf("Device count: %d\n\n", deviceCount);
for (int i = 0; i <= deviceCount - 1; i++)
{ //Получаем информацию о текущем устройстве
cudaGetDeviceProperties(&deviceProp, i);

//Выводим иформацию об устройстве
printf("Device name: %s\n", deviceProp.name);
printf("Total global memory: %d\n",
deviceProp.totalGlobalMem);
printf("Shared memory per block: %d\n",
deviceProp.sharedMemPerBlock);
printf("Registers per block: %d\n",
deviceProp.regsPerBlock);
printf("Warp size: %d\n", deviceProp.warpSize);
Рис. 1.3
Структура вычислительной модели GPU CUDA.
Программная часть содержит в себе всё необходимое
для разработки программы: расширения языка С,
компилятор, API для работы с графическими адаптерами и
набор библиотек. CUDA SDK позволяет программистам
реализовывать на специальном упрощённом диалекте языка
программирования
алгоритмы, выполнимые на
графических процессорах NVIDIA.
Пример программы обработки изображения с
использованием GPU CUDA:
#include
#include
#include
#include
#include
#include
using namespace std;
за счет имеющейся высокой резервной вычислительной
мощности GPU можно с успехом использовать для задач
обработки потока изображений. Высокая вычислительная
мощность GPU достигается за счет параллельной обработки
пикселей изображений на многих вычислительных ядрах,
организованных в виде матрицы.
В настоящее время наибольшими вычислительными
мощностями обладают GPU компании Nvidia, которые
разрабатываются и поддерживаются в рамках технологии
CUDA. Технология CUDA появилась в 2006 году и
представляет из себя программно-аппаратный комплекс,
позволяющий эффективно писать и исполнять программы
под графические адаптеры. Графический процессор
организует аппаратную многопоточность, что позволяет
задействовать все ресурсы графического процессора.
GPU CUDA имеет следующую вычислительную
модель. Верхний уровень ядра GPU состоит из блоков,
которые группируются в сетку или грид (grid) размерностью
N1 * N2 * N3. Любой блок в свою очередь состоит из нитей
(threads), которые являются непосредственными
исполнителями вычислений. Нити в блоке сформированы в
виде трехмерного массива (рис. 1.3).
виртуализации, позволяет объединить в одном устройстве
функции, ранее выполняемые несколькими отдельными
устройствами. Такая интеграция уменьшает общий объём
оборудования и снижает энергопотребление, что позволяет
сократить количество необходимых компонентов и получить
выигрыш в эксплуатационных расходах.
Сопроцессоры,
GPU
. Библиотека
OpenCL
При рассмотрении аппаратных средств компьютерного
уровня следует выделить те, которые обеспечивают высокую
скорость обработки видеоизображения, и те, которые
обеспечивают ввод видеоизображений в память компьютера.
В качестве первых в компьютерах используются многие
процессорные ядра и сопроцессоры обработки
видеоизображений, а в качестве вторых рассматривается
набор интерфейсов для связи с видеокамерами.
В настоящее время в качестве сопроцессоров,
обеспечивающих быструю обработку введенного в ЭВМ
видеоизображения, используются графические процессор
. Графический процессор является устройством
компьютера, которое выполняет операции по выводу
изображения на монитор (графический рендеринг). Однако
Широкая доступность многоядерных процессоров стала,
пожалуй, наиболее подрывной и вместе с тем наиболее
многообещающей инновацией на рынке встраиваемых
систем за много лет. Новейшие многоядерные процессоры
Intel демонстрируют значительное увеличение
производительности, по сравнению с одноядерными.
Системы на базе многоядерных процессоров также
обеспечивают большую масштабируемость, позволяя
наращивать вычислительную мощность увеличением
количества ядер без вмешательства в программное
обеспечение. Тенденция к сдвигу в сторону многоядерности
набирает обороты, и то, что объёмы продаж 2- и 4-ядерных
процессоров Intel давно уже превышают объёмы продаж
одноядерных процессоров, -
наглядное тому подтверждение.
Другая важная технологическая тенденция — это
виртуализация вычислений. Она предоставляет возможность
нескольким виртуальным машинам работать на одной
физической плате, представляя нижележащие ядра
процессора. память и периферийные устройства как уровень
абстракции.
Прирост производительности, обеспечиваемый
комбинацией многоядерного процессора и технологии
фиолетовая кайма. Как правило, в большинстве случаев при
обычных условиях освещения дополнительной настройки не
требуется. Если же в условиях слабой освещённости камера
выдаёт снимки очень низкого качества, то появившиеся
цветовые артефакты можно удалить из текстур или контуров
объектов, увеличив значение параметра подавления
цветовых артефактов.
Перечисленная цепочка алгоритмов обработки является
традиционной для цифровых камер. Некоторые алгоритмы
обработки могут быть отключены.
Многоядерность
Бурное развитие рынка встраиваемых систем делает его
всё более подверженным действию так называемых
подрывных инноваций (инноваций, предполагающих не
развитие существующих технологий, а их полную замену),
благодаря которым производители устройств
промышленного назначения получают значительные
возможности по улучшению как самих устройств, так и
бизнеса в целом. В частности, широкие возможности для
достижения конкурентных преимуществ предоставляют
такие технологические тенденции, как: развитие
многоядерных процессоров и виртуализация вычислений.
Усиление контуров влияет на резкость изображения.
Фильтры метода усиления контуров по Лапласу могут
выглядеть следующим образом:
Усиление контраста.
Усиление контраста состоит из двух параметров:
собственно, контраста и яркости. Поскольку оптимальные
контраст и яркость варьируются в зависимости от условий
освещённости, равно как и от предпочтений пользователя, то
эти параметры зачастую реализуются так, чтобы
пользователь имел возможность их динамической настройки.
Подавление цветовых артефактов.
Конечной стадией обработки изображений является
коррекция различных цветовых искажений (артефактов).
Например, если сделать снимок листвы на фоне яркого неба,
то на высококонтрастных контурах может появиться
линейные значения RGB или YCbCr должны быть
преобразованы в нелинейные R'G'B' или Y'CbCr. Такое
преобразо
ние называется гамма-коррекцией.
Преобразование RGB –
.
Изображения также необходимо настроить для
восприятия человеческим глазом, который более
чувствителен к информации об освещённости (Y), чем к
информации о свете (Cb, Cr). На данной стадии
осуществляется разделение освещённости и цвета для
различной последующей обработки, с различной точностью.
Рис. 1.2
Матрица преобразования RGB –
YCbCr.
Данная процедура основывается на стандартной
формуле и является прямым преобразованием, не
требующим настройки.
Усиление контуров
.
Рис. 1.1
Три схемы матриц фильтров.
Смешивание
RGB.
Различные сенсоры выдают различные значения RGB
для одного и того же цвета. Настройка данной стадии
заключается в создании матрицы смешивания, позволяющей
преобразовать цветовое пространство RGB сенсора в
стандартное цветовое пространство RGB, например, Rec709.
Алгоритм смешивания сводится к перемножению RGB на
матрицу смешивания:
Коррекция гаммы
Воспринимаемая человеком яркость изображения
нелинейно зависит от «реальной» яркости: тёмные оттенки
человек различает лучше, чем светлые. Чтобы избежать
неравномерных потерь при передаче и кодировании сигнала,
только один цветовой компонент, а в модели RGB требуются
три компонента.
Интерполяция CFA –
это процесс интерполирования
двух недостающих компонентов цвета для каждого пикселя
на основе имеющегося компонента и соседних пикселов.
Интерполяция CFA является в основном функцией
трансформации, не меняющейся в зависимости от сенсора
или условий освещения, поэтому на данной стадии нет
необходимости в выполнении каких-либо настроек. Тем не
менее, это один из самых сложных алгоритмов в обработке
изображений, и качество его конечного результата в большой
степени зависит от качества используемых в системе
фотоприемников.
Алгоритм интерполяции зависит от используемы
матриц фильтров. На рис. 1.1 представлены три матрицы
фильтров:
ильтр Байера - наиболее распространенный RGB
фильтр - включает 1 синий, 1 красный, 2 зелёных элемента
фильтра.
ильтр RGBE - один из зелёных фильтров заменён на
изумрудный.
ильтр CYYM -
голубой, 2 жёлтых, пурпурный.
В целом, выбор алгоритма определяется имеющимся
уровнем шума в видео.
Баланс белого
Различные типы освещения –
например, лампа
накаливания, лампа дневного света, источники естественного
света, ксеноновые лампы и светодиодные вспышки –
оказывают существенное влияние на цветопередачу.
Наиболее трудным для настройки является смешанное
освещение. Функция настройки баланса белого
автоматически компенсирует разницу цветов, возникающую
-за освещения, чтобы белый цвет оставался действительно
белым.
Тонкая настройка баланса белого начинается с
измерения средних значений RGB, причем по умолчанию
значение зелёного устанавливается равное единице.
Интерполяция CFA
На матрице фотоприемника находится массив цветных
фильтров CFA (color filter arrays). Каждый
светочувствительный элемент накрыт одним светофильтром
массива, поэтому для каждого пикселя можно получить
временного шумоподавления - между несколькими
последовательно идущими кадрами. Во временных фильтрах
часто используются алгоритмы детектирования и/или
компенсации движения. Сочетание пространственного и
временного алгоритмов шумоподавления называют 3D-
фильтром. Первым обычно применяется пространственный
фильтр, поскольку после его работы временное
шумоподавление становится более эффективным.
Основной проблемой при пространственном
шумоподавлении является размытие границ изображения, то
есть портится четкость краев предметов на изображении, а
также мелкие детали, соизмеримые по амплитуде с шумом.
При временном шумоподавлении подобные детали можно
детектировать, отслеживая их на протяжении нескольких
кадров.
Основной проблемой при временном шумоподавлении
является эффект размытия движения, возникающий при
попытке усреднить пиксели вдоль границ движущихся
объектов. Для устранения этой проблемы во временные
методы часто встраивают алгоритм компенсации движения,
но, во
-первых, при этом значительно снижается скорость
работы фильтра, а во-вторых, неточное нахождение блоков
приводит к появлению артефактов.
результате, при оцифровывании изображения никогда не
будет получаться код с нулевым значением, т.е. в
изображении всегда будет отсутствовать черный цвет.
алогичный эффект отсутствия в коде нуля наблюдается
при смещении нулевого уровня сигнала с фотоприемника в
диапазоне работы АЦП. Простейшим способом получения
нулевого отсчета при отсутствии засветки соответствующего
пикселя фотоприемника является вычитание из кода отсчета
кода отсчета, полученного при отсутствии засветки.
Подавление шумов.
Существует немало источников шумов –
оптических,
электрических, цифровых и энергетических, –
искажающих
данные изображения.
При анализе и разработке алгоритмов шумоподавления
шум в видеопоследовательности условно разделяют на
пространственный и временной. Пространственный –
это
шум внутри кадра, а временной –
от кадра к кадру. Обычно
оба вида шума приблизительно описывают моделью белого
гауссовского шума, поэтому большинство алгоритмов
ориентировано на подавление именно этого вида шума.
Для пространственного шумоподавления производят
усреднение пикселей по кадру (изображению), а для
Стадия
примен

Название алгоритмов,
используемых в
цифровых видеоси
темах

Управление
фотоприемн
ком
Автоматическая экспозиция (
Auto exposure
Автобаланс
белого
Auto white balance
AWB
Детектирование плавания сигнала (
Flicker avoid
Попиксельная
обработка
Компенсация
черного
Auto black reference ABR
Программирование аналогового усиления.
Программирование времени экспозиции.
Выбор разрядн
ости АЦП. Контроль насыщения.
Преобразование
Bayer RGB.
Построковая
обрабо
Интерполяция цвета. Увеличение/уменьшение.
Коррекция дефектов. Коррекция цвета.
Гамма коррекция. Компенсация искажений в линзе.
Объединение отсчетов(Binning).
Подавление шумов.
Покадровая
ботка
Контроль резкости (Sharpness).
Распознавание. Подчеркивание границ.
Изменение формата, сжатие.
Управление
реж
мом
Регистрация одного кадра. Потоковое видео.
Переключение памяти данных (
flash
Таблица 1.1 Алгоритмы обработки изображе
ний в цифровых
камерах.
Рассмотрим основную цепочку алгоритмов, которую
применяют для улучшения качества видеоизображений.
Компенсация уровня чёрного.
Даже при полной темноте на выходе фотодетектора
может наблюдаться небольшой сигнал. Этот сигнал
называют темновыми токами, т.е. токами, возникающими в
фотополупроводнике, находящемся в полной темноте. В
Глава 1
Пути использования методов параллелизации
для обработки видеоизображения
Основные операции по обработке видео
Задачами обработки изображений могут быть:
улучшение изображения (повышение контраста, резкости,
коррекция цветов, сглаживание, реставрация); специальное
преобразование, кардинально меняющее изображение,
например, с целью дальнейшего распознавания изображен
сжатие изображения.
Можно выделить две группы алгоритмов цифровой
обработки изображений: алгоритмы обработки статических
изображений, алгоритмы обработки потоковых изображений.
Рассмотрим вторую группу алгоритмов, именно они связаны
с работой цифровых камер.
В таблице 1.1 перечислены основные алгоритмы
обработки изображений в цифровых камерах. Эти алгоритмы
предназначены для улучшения качества потокового видео и
сжатия. Они разделены на стадии применения и могут быть
реализованы как в аналоговом, так и цифровом виде в
цифровых процессорах и в программируемой логике.
чрезмерно сложными и дорогостоящими. Чтобы принять
разумное решение о том, как распределить задачи между
процессорами, необходимо не только учитывать ресурсы
устройств, но и анализировать алгоритмы.
Введение
В настоящее время в видеосистемах повсеместно
происходит замена систем стандартной (SD) четкости
изображений на высокую четкость (HD). Количество
пикселов в кадре существенно увеличивается,
соответственно повышается сложность проектирования
систем обработки видеоизображения —
кодирование и
декодирование в HD-системах требует гораздо большей
производительности и одного процессора уже недостаточно.
Использование видео давно уже стало повсеместным, при
этом потребители хотят иметь поддержку видео на всех
типах устройств, обеспечивающих различное качество
изображения. В некоторых видах
техники, таких
как
мобильные телефоны, портативные музыкальные плееры
или
деоплееры, один
процессор
может выполнять все задачи
обработки видеоданных
вписывается в строгие ценовые
рамки.
Но если речь идет о приложениях с высоким
качеством видео, например, телевидении высокой четкости
или реализации видеоконференций, требования
к обработке
данных превышают возможности
большинства
устройств
представленного сегодня на рынке. В этом случае
актуальны
системы, построенные из нескольких процессоров,
которые
могут реализовать высококачественное видео, не будучи
Содержание
Введение
Глава 1 Пути использования методов параллелизации для обработки
видеоизображения
1.1
Основные операции по обработке видео
1.2
Многоядерность
1.3
Сопроцессоры,
GPU
. Библиотека
OpenCL
1.4
Векторизация
Глава 2 Рассмотрение существующих программных средств, по
обработке видеоизображения
2.1
Библиотеки обработки видеоизображений компьютерного
уровня
…………………………………………………………………….
2.1.1 Библиотека OpenCV
2.1.2 Библиотека D
irectS
how
2.1.3 Другие библиотеки для обработки видео
2.2
Библиотеки функций для параллельной обработки в
вычислительных ядрах OpenMP, MPI
2.3
Обзор существующих программных средств
Глава 3 Разработка параллельных алгоритмов и программ
Заключение
Список литературы
Санкт-Петербургский политехнический университет
Петра Великого
Институт компьютерных наук и технологий
Кафедра информационных и управляющих систем
Работа допущена к защите
Зав. кафедрой
П.Д.Дробинцев
ВЫПУСКНАЯ РАБОТА БАКАЛАВРА
Тема: Применение методов параллелизации вычислений для
обработки видеоизображения
Направление:
09.03.04
Программная инженерия
Выполнил студент гр. 43504/1

Архипов А.Г.
Руководитель проф. д.т.н.

Молодяков С.А.
Санкт-Петербург

Приложенные файлы

  • pdf 35373151
    Размер файла: 1 MB Загрузок: 0

Добавить комментарий