Разработка мультимедийных приложений с использованием библиотек OpenCV и IPP

Введение в библиотеку IPP

Разбить на страницы
Показывать лекцию целиком

1. Обзор библиотеки Intel IPP

Презентацию к лекции Вы можете скачать здесь.

1.1. Введение

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

Необходимо отметить, что многие высокоуровневые алгоритмы обработки мультимедиа данных в итоге сводятся к базовым операциям над простыми структурами (например, массивами), прич?м производительность этих операций существенно влияет на производительность алгоритма в целом. Некоторые из базовых операций могут использоваться различными высокоуровневыми алгоритмами. Исходя из этих факторов, представляется целесообразным выполнять оптимизацию именно низкоуровневых функций. Данный подход лежит в основе разработанной компанией Intel библиотеки Integrated Performance Primitives [1], которая представляет собой набор кроссплатформенных библиотек, содержащих большое количество низкоуровневых оптимизированных под Intel CPU функций, которые могут быть использованы при разработке различных мультимедийных приложений таких как:

  • Видео-кодеки: H.264, MPEG2, MPEG4, VC-1
  • Аудио-кодеки: AAC, AC3, MP3
  • Сжатие изображений (кодеки JPEG, JPEG2000, JPEGXR)
  • Обработка изображений
  • Обработка сигналов
  • Сжатие естественной речи (кодеки AMR, AMR-WBE, G.711, G.722, G.723. G.726, G.728, G.729, GSM-AMR, GSM-MFR)
  • Криптографические приложения
  • 1.2. Структура библиотеки и модель использования

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

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

    1.3. Типы данных и именование функций

    Имена функций в библиотеке Intel IPP имеют следующую структуру:

    ipp<data-domain><name>[_<datatype>][_<descriptor>](<parameters>)

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

    <data-domain> - тип обрабатываемых данных:

  • s (signal) – одномерный массив
  • i (image, video) – двухмерный массив пикселей
  • m (matrice) – матрицы или вектора
  • r – исходные данные для функций реалистичного рендеринга изображений и обработки 3D данных (представление данных зависит от используемой функции)
  • Примеры: ipps, ippi, ippm, ippr

    <name> = <operation>[_modifier] - имя функции:

  • <operation> - символическое название выполняемой операции
  • modifier (дополнительный параметр) – дополнительная спецификация функции
  • Примеры: Copy, Malloc, DCTFwd_CToC (прямое дискретное косинус- преобразование, в котором входные и выходные значения являются комплексными)

    <datatype> = <bit_depth><bit_interpretation> – тип обрабатываемых данных:

  • <bit_depth> = 1|8|16|32|64 (размер элемента данных (в битах))
  • <bit_interpretation> = <u|s|f>[c]
  • u – целые числа без знака
  • s – целые числа со знаком
  • f – вещественные числа
  • c – комплексные числа
  • Intel IPP поддерживает следующие типы данных:

    Тип Тип C/++ Тип Intel IPP
    8u unsigned char Ipp8u
    8s signed char Ipp8s
    16u unsigned short Ipp16u
    16s signed short Ipp16s
    16sc complex short Ipp16sc
    32u unsigned int Ipp32u
    32s signed int Ipp32s
    32f float Ipp32f
    32fc complex float Ipp32fc
    64s __int64 (long long) Ipp64s
    64f double Ipp64f
    64fc complex double Ipp64fc

    В случае, если у функции есть несколько аргументов разных типов (или тип выходных данных отличается от типа входных данных), используется следующий формат типа обрабатываемых данных: <datatype> = <src1Datatype>[src2Datatype][dstDatatype]

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

    Примеры:

    M – используется маска, определяющая пиксели изображения, которые будут обработаны функцией, R – функция обрабатывает определенную область изображения (ROI – region of interest)

    <parameters> – параметры функции; указываются в следующем порядке:

  • входные аргументы
  • выходные аргументы
  • дополнительные аргументы
  • Рассмотрим функцию ippiCopy_8u_C3R. Согласно описанной выше структуре, данная функция копирует (<name> = Copy) изображение (ippi, vdata_domain> = i), элементами которого являются 8-битные целые числа без знака (<data_type> = 8u). Изображение является трехканальным (C3, <descriptor> = C3R), копирование осуществляется из заданной области изображения (R, <descriptor> = C3R).

    1.4. Инициализация библиотеки. Выделение и освобождение памяти.

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

    IppStatus ippStaticInit(void)  

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

    IppStatus ippInit(void))  

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

    Одним из факторов, влияющих на производительность функций библиотеки Intel IPP, является использование выровненных данных. Для выделения и освобождения памяти, выровненной по 32 байт, под произвольные данные используются следующие функции:

    void* ippMalloc(int length) 
    void ippFree(void* ptr) 
    

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

    Ipp<datatype>* ippsMalloc_<datatype>(int len)

    которое выделяет массив, состоящий из элементов типа <datatype> длины len.

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

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

    Ipp<datatype>*  ippiMalloc_<mod>(int  widthPixels,  int 
    heightPixels, int* pStepBytes) 
    
  • widthPixels – ширина изображения (в пикселях).
  • heightPixels – высота изображения (в пикселях).
  • pStepBytes (выходной параметр) – расстояние между последовательными строками в изображении (в байтах).
  • <mod> – число каналов в изображении и формат данных (например, 8u_C3 – трехканальное изображение, интенсивность каждого пикселя описывается unsigned char)
  • Память, выделенную с помощью ippiMalloc, необходимо освобождать с использованием функции ippiFree.

    1.5. Вопросы производительности

    1.6. Создание приложения в среде Microsoft Visual Studio 2010

    Рассмотрим пример создания приложения, использующего библиотеку Intel IPP, в среде Microsoft Visual Studio 2010.

  • Запустите приложение Microsoft Visual Studio 2010.
  • В меню File выполните команду New>Project….
  • Как показано на рис. 2, в диалоговом окне New Project в типах проекта выберите Win32, в шаблонах Win32 Console Application, в поле Name введите название проекта (ipp_demo), в поле Location укажите путь к папке, в которой будут сохранены с лабораторными работами. Нажмите OK. (рис 7.2) Создание решения для лабораторной работы
  • В диалоговом окне Win32 Application Wizard нажмите Next (или выберите Application Settings в дереве слева) и установите флаг Empty Project. Нажмите Finish.
  • В окне Solution Explorer в папке Source Files выполните команду контекстного меню Add>New Item…. В дереве категорий слева выберите Code, в шаблонах справа – C++ File (.cpp), в поле Name введите имя файла main. (рис 7.3) Добавление cpp файла в проект
  • Нажмите Add. В результате выполненной последовательности действий в окне редактора кода Visual Studio будет открыт пустой файл main.cpp.
  • Введите исходный код программы. Данное приложение инициализирует библиотеку, выделяет память под три одномерных массива a, b и c, заполняет массивы a и b данными, вычисляет поэлементную сумму этих массивов и помещает результат в массив с, печатает результат и освобождает память, выделенную под массивы.
    #include "ipp.h" 
    #include <stdio.h> 
    void main() 
    { 
      int n = 5; 
      ippInit(); 
      Ipp32f* a = ippsMalloc_32f(n); 
      Ipp32f* b = ippsMalloc_32f(n); 
      Ipp32f* c = ippsMalloc_32f(n); 
      for (int i = 0; i < n; i++) 
      { 
        a[i] = (float)i; 
        b[i] = (float)(10 - i); 
      } 
      ippsAdd_32f(a, b, c, n); 
    for (int i = 0; i < n; i++)    { 
        printf("%.3f + %.3f = %.3f\n",a[i],b[i], c[i]); 
      } 
      ippsFree(a); 
      ippsFree(b); 
      ippsFree(c); 
    } 
    
  • Выполните команду контекстного меню Properties, чтобы получить доступ к настройкам проекта. Откройте вкладку Configuration Properties-Intel Performance Libraries-Use IPP . Выберите один из предлагаемых способов линковки (Shared DLL, Single-threaded static library, Multi-threaded static library). (рис 7.4) Окно настроек проекта
  • Запустите компиляцию и сборку приложения.
  • Страницы:

    1. Обзор библиотеки Intel IPP

    Презентацию к лекции Вы можете скачать здесь.

    1.1. Введение

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

    Необходимо отметить, что многие высокоуровневые алгоритмы обработки мультимедиа данных в итоге сводятся к базовым операциям над простыми структурами (например, массивами), прич?м производительность этих операций существенно влияет на производительность алгоритма в целом. Некоторые из базовых операций могут использоваться различными высокоуровневыми алгоритмами. Исходя из этих факторов, представляется целесообразным выполнять оптимизацию именно низкоуровневых функций. Данный подход лежит в основе разработанной компанией Intel библиотеки Integrated Performance Primitives [1], которая представляет собой набор кроссплатформенных библиотек, содержащих большое количество низкоуровневых оптимизированных под Intel CPU функций, которые могут быть использованы при разработке различных мультимедийных приложений таких как:

  • Видео-кодеки: H.264, MPEG2, MPEG4, VC-1
  • Аудио-кодеки: AAC, AC3, MP3
  • Сжатие изображений (кодеки JPEG, JPEG2000, JPEGXR)
  • Обработка изображений
  • Обработка сигналов
  • Сжатие естественной речи (кодеки AMR, AMR-WBE, G.711, G.722, G.723. G.726, G.728, G.729, GSM-AMR, GSM-MFR)
  • Криптографические приложения
  • 1.2. Структура библиотеки и модель использования

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

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

    1.3. Типы данных и именование функций

    Имена функций в библиотеке Intel IPP имеют следующую структуру:

    ipp<data-domain><name>[_<datatype>][_<descriptor>](<parameters>)

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

    <data-domain> - тип обрабатываемых данных:

  • s (signal) – одномерный массив
  • i (image, video) – двухмерный массив пикселей
  • m (matrice) – матрицы или вектора
  • r – исходные данные для функций реалистичного рендеринга изображений и обработки 3D данных (представление данных зависит от используемой функции)
  • Примеры: ipps, ippi, ippm, ippr

    <name> = <operation>[_modifier] - имя функции:

  • <operation> - символическое название выполняемой операции
  • modifier (дополнительный параметр) – дополнительная спецификация функции
  • Примеры: Copy, Malloc, DCTFwd_CToC (прямое дискретное косинус- преобразование, в котором входные и выходные значения являются комплексными)

    <datatype> = <bit_depth><bit_interpretation> – тип обрабатываемых данных:

  • <bit_depth> = 1|8|16|32|64 (размер элемента данных (в битах))
  • <bit_interpretation> = <u|s|f>[c]
  • u – целые числа без знака
  • s – целые числа со знаком
  • f – вещественные числа
  • c – комплексные числа
  • Intel IPP поддерживает следующие типы данных:

    Тип Тип C/++ Тип Intel IPP
    8u unsigned char Ipp8u
    8s signed char Ipp8s
    16u unsigned short Ipp16u
    16s signed short Ipp16s
    16sc complex short Ipp16sc
    32u unsigned int Ipp32u
    32s signed int Ipp32s
    32f float Ipp32f
    32fc complex float Ipp32fc
    64s __int64 (long long) Ipp64s
    64f double Ipp64f
    64fc complex double Ipp64fc

    В случае, если у функции есть несколько аргументов разных типов (или тип выходных данных отличается от типа входных данных), используется следующий формат типа обрабатываемых данных: <datatype> = <src1Datatype>[src2Datatype][dstDatatype]

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

    Примеры:

    M – используется маска, определяющая пиксели изображения, которые будут обработаны функцией, R – функция обрабатывает определенную область изображения (ROI – region of interest)

    <parameters> – параметры функции; указываются в следующем порядке:

  • входные аргументы
  • выходные аргументы
  • дополнительные аргументы
  • Рассмотрим функцию ippiCopy_8u_C3R. Согласно описанной выше структуре, данная функция копирует (<name> = Copy) изображение (ippi, vdata_domain> = i), элементами которого являются 8-битные целые числа без знака (<data_type> = 8u). Изображение является трехканальным (C3, <descriptor> = C3R), копирование осуществляется из заданной области изображения (R, <descriptor> = C3R).

    1.4. Инициализация библиотеки. Выделение и освобождение памяти.

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

    IppStatus ippStaticInit(void)  

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

    IppStatus ippInit(void))  

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

    Одним из факторов, влияющих на производительность функций библиотеки Intel IPP, является использование выровненных данных. Для выделения и освобождения памяти, выровненной по 32 байт, под произвольные данные используются следующие функции:

    void* ippMalloc(int length) 
    void ippFree(void* ptr) 
    

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

    Ipp<datatype>* ippsMalloc_<datatype>(int len)

    которое выделяет массив, состоящий из элементов типа <datatype> длины len.

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

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

    Ipp<datatype>*  ippiMalloc_<mod>(int  widthPixels,  int 
    heightPixels, int* pStepBytes) 
    
  • widthPixels – ширина изображения (в пикселях).
  • heightPixels – высота изображения (в пикселях).
  • pStepBytes (выходной параметр) – расстояние между последовательными строками в изображении (в байтах).
  • <mod> – число каналов в изображении и формат данных (например, 8u_C3 – трехканальное изображение, интенсивность каждого пикселя описывается unsigned char)
  • Память, выделенную с помощью ippiMalloc, необходимо освобождать с использованием функции ippiFree.

    1.5. Вопросы производительности

    1.6. Создание приложения в среде Microsoft Visual Studio 2010

    Рассмотрим пример создания приложения, использующего библиотеку Intel IPP, в среде Microsoft Visual Studio 2010.

  • Запустите приложение Microsoft Visual Studio 2010.
  • В меню File выполните команду New>Project….
  • Как показано на рис. 2, в диалоговом окне New Project в типах проекта выберите Win32, в шаблонах Win32 Console Application, в поле Name введите название проекта (ipp_demo), в поле Location укажите путь к папке, в которой будут сохранены с лабораторными работами. Нажмите OK. (рис 7.2) Создание решения для лабораторной работы
  • В диалоговом окне Win32 Application Wizard нажмите Next (или выберите Application Settings в дереве слева) и установите флаг Empty Project. Нажмите Finish.
  • В окне Solution Explorer в папке Source Files выполните команду контекстного меню Add>New Item…. В дереве категорий слева выберите Code, в шаблонах справа – C++ File (.cpp), в поле Name введите имя файла main. (рис 7.3) Добавление cpp файла в проект
  • Нажмите Add. В результате выполненной последовательности действий в окне редактора кода Visual Studio будет открыт пустой файл main.cpp.
  • Введите исходный код программы. Данное приложение инициализирует библиотеку, выделяет память под три одномерных массива a, b и c, заполняет массивы a и b данными, вычисляет поэлементную сумму этих массивов и помещает результат в массив с, печатает результат и освобождает память, выделенную под массивы.
    #include "ipp.h" 
    #include <stdio.h> 
    void main() 
    { 
      int n = 5; 
      ippInit(); 
      Ipp32f* a = ippsMalloc_32f(n); 
      Ipp32f* b = ippsMalloc_32f(n); 
      Ipp32f* c = ippsMalloc_32f(n); 
      for (int i = 0; i < n; i++) 
      { 
        a[i] = (float)i; 
        b[i] = (float)(10 - i); 
      } 
      ippsAdd_32f(a, b, c, n); 
    for (int i = 0; i < n; i++)    { 
        printf("%.3f + %.3f = %.3f\n",a[i],b[i], c[i]); 
      } 
      ippsFree(a); 
      ippsFree(b); 
      ippsFree(c); 
    } 
    
  • Выполните команду контекстного меню Properties, чтобы получить доступ к настройкам проекта. Откройте вкладку Configuration Properties-Intel Performance Libraries-Use IPP . Выберите один из предлагаемых способов линковки (Shared DLL, Single-threaded static library, Multi-threaded static library). (рис 7.4) Окно настроек проекта
  • Запустите компиляцию и сборку приложения.
  • Вернуться к учебному плану