OpenCV
Материал из Википедии — свободной энциклопедии

OpenCV (англ. Open Source Computer Vision Library, библиотека компьютерного зрения с открытым исходным кодом) — библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом. Реализована на C/C++, так же разрабатывается для PythonRubyMatlab и других языков[1]. Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD.

Применение
  • Для утверждения общего стандартного интерфейса компьютерного зрения для приложений в этой области. Для способствования росту числа таких приложений и создания новых моделей использования PC.
  • Сделать платформы Intel привлекательными для разработчиков таких приложений за счёт дополнительного ускорения OpenCV с помощью Intel® Performance Libraries (Сейчас включают IPP (низко-уровневые библиотеки для обработки сигналов, изображений, а также медиа-кодеки) и MKL (специальная версия LAPACK и FFTPack)). OpenCV способна автоматически обнаруживать присутствие IPP и MKL и использовать их для ускорения обработки.
  • (Замечание - для работы OpenCV c IPP версии 5.3 необходимо скачать с сайта Intel и подменить файл cxswitcher.cpp -иначе IPP не будет обнаруживаться)
Поддерживаемые платформы и инструменты
Сами библиотеки:
  • Microsoft Windows: компиляторы Microsoft Visual C++ (6.0, .NET 2003), Intel Compiler, Borland C++, Mingw (GCC 3.x).
  • GNU/Linux: GCC (2.9x, 3.x), Intel Compiler: «./configure-make-make install», RPM (spec файл включен в поставку)
  • Используются C и «облегченный» C++. Прагмы и условная компиляция используются очень ограниченно.
Средства GUI, захват видео:
  • Microsoft Windows: DirectShow, VfW, MIL, CMU1394
  • GNU/Linux: V4L2, DC1394, FFMPEG
Основные модули
Ядро cxcore
  • Базовые операции над многомерными числовыми массивами
  • Матричная алгебра, математические ф-ции, генераторы случайных чисел
  • DFT, DCT
  • Запись/восстановление структур данных в/из XML/YAML
  • Базовые функции 2D графики
  • Поддержка более сложных структур данных: разреженные массивы, динамически растущие последовательности, графы
CV — Модуль обработки изображений и компьютерного зрения
  • Базовые операции над изображениями (фильтрация, геометрические преобразования, преобразование цветовых пространств и т. д.)
  • Анализ изображений (выбор отличительных признаков, морфология, поиск контуров, гистограммы)
  • Структурный анализ (описание форм, плоские разбиения, …)
  • Анализ движения, слежение за объектами
  • Обнаружение объектов, в частности лиц
  • Калибровка камер, элементы восстановления пространственной структуры
Highgui — Модуль для ввода/вывода изображений и видео, создания пользовательского интерфейса
  • Захват видео с камер и из видео файлов, чтение/запись статических изображений.
  • Функции для организации простого UI (сейчас все демо приложения используют HighGUI)
Cvaux — Экспериментальные и устаревшие функции
  • Пространств. зрение: стерео калибрация, само калибрация
  • Поиск стерео-соответствия, клики в графах
  • Нахождение и описание черт лица
  • Сравнение форм, построение скелетонов …
  • Скрытые Марковские цепи
  • Описание текстур
CvCam — захват видео Позволяет осуществлять захват видео (только в Windows), имеет несколько недоделок, поддержка прекращена.
Пример проверки работы OpenCV с IPP
      
 #include "stdio.h"
#include "windows.h"
 
#include "cv.h"
#include "highgui.h"
 
char name0[] = "lena.jpg";
char name1[] = "fruits.jpg";
 
int main()
{
  IplImage* img1 = NULL;
  IplImage* img2 = NULL;
 
  //cvNamedWindow("Image", 1);
  //load original image
  img1 = cvLoadImage(name0,1);
  img2 = cvLoadImage(name1,1);
 
  //cvUseOptimized(1); // load IPP
  //How to check whether IPP is used or not?
  const char* plugin_info = 0;
 
  DWORD sm1, sm2, sm3;
  int Count = 100;
  printf("== Test for resizing images in OpenCV with IPP ==\n");
 
  for (int j=0; j<2; j++ ) {
    if (j == 1)
      cvUseOptimized(0);  unload IPP
 
    cvGetModuleInfo(0,0,&plugin_info);
    bool ipp_is_used = plugin_info != 0 && strstr(plugin_info,"ipp")!=0;
 
    sm1=GetTickCount(); 
for (int i=0; iwidth*2.55) , (img1->height*3.77)), img1->depth, img1->nChannels); newImage2 = cvCreateImage(cvSize((img2 - >width*2.55) , (img2->height*3.77)), img2->depth, img2->nChannels); cvResize(img1, newImage1); cvResize(img2, newImage2); // cvReleaseImage(&newImage1); cvReleaseImage(&newImage2); } sm2=GetTickCount(); sm3 = sm2 - sm1; if (ipp_is_used) printf("* IPP is used\n"); else printf("* IPP is not used! \n"); printf("* Iteration resize = %d \n", Count); DWORD m, s, ms; m = sm3 / 60000; s = (sm3 - m*60000) /1000; ms = (sm3 - (m*60000)-(s*1000)); printf("* Time - %d min %d sec %d msec \n",(int)(m), (int)s, (int)ms); printf("=================================================\n"); } cvReleaseImage(&img1); cvReleaseImage(&img2); printf("Press any key ..."); getchar(); //cvShowImage("Image", newImage1); cvWaitKey(0); //cvDestroyWindow( "Image" ); return 0; }

Литература:

Bradsky G., Kaehler A. Learning OpenCV - O'Reilly, 2008. - C. 1 - ISBN 978-0-596-51613-0