Библиотека OpenCV

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

Полезные ссылки

Как начать пользоваться

  1. Скачать самораспаковывающийся архив с последней стабильной версией библиотеки для вашей операционной системы. На момент написания данного материала – это версия 2.4.11.
  2. Распаковать архив, например, в C:\OpenCV. После распаковки по указанному пути будут 2 папки:
    • build – заголовочные файлы, скомпилированные библиотеки и т.п. Эта папка потребуется в первую очередь.
    • sources – полные исходные коды библиотеки. Могут потребоваться для самостоятельной компиляции библиотеки.
  3. Часто возникает ситуация, когда на разных машинах библиотека может быть распакована в разные папки, и при переходе с одной машины на другую может потребоваться исправить в настройках проекта пути до библиотеки. Что бы избежать правок, вместе с распаковкой библиотеки необходимо настроить переменную окружения, хранящую путь до библиотеки. Создадим переменную OPENCV_DIR:
    1. запустим cmd.exe с правами администратора
    2. наберём команду: setx -m OPENCV_DIR "<Папка_куда_распаковали_OpenCV>\build"
  4. В Visual Studio нужно создать проект Win32 Console Application.
  5. Для использования библиотеки нужно указать пути до заголовочных файлов OpenCV. Для этого открываем настройки проекта, выбираем в списке конфигураций All Configurations, затем выбираем параметр Configuration Properties → C/C++ → General → Additional Include Directories = $(OPENCV_DIR)\include;$(OPENCV_DIR)\include\opencv
  6. Стандартная библиотека C/C++ реализована в 2-х вариантах как статическая библиотека (.lib) и как динамическая библиотека (.dll). Библиотеки OpenCV скомпилированы в предположении, что стандартная библиотека подключена статически, как lib файл. В то же время проект Visual Studio по умолчанию подключает стандартную библиотеку динамически, как dll файл. В настройках проекта необходимо указать, что стандартная библиотека подключается статически: Configuration Properties → C/C++ → Code Generation → Runtime Library = Multi-threaded Debug (/MTd) – в конфигурации Debug и Multi-threaded (/MT) – в конфигурации Release.
  7. Также необходимо в настройках проекта указать пути до библиотек. Для OpenCV с поставкой идут уже скомпилированные статические библиотеки для популярных компиляторов. В настройках проекта для всех конфигураций выбираем параметр Configuration Properties → Linker → General → Additional Library Directories = :
    • $(OPENCV_DIR)\x86\vc12\staticlib – Visual Studio 2013, для x86 платформы,
    • $(OPENCV_DIR)\x86\vc11\staticlib – Visual Studio 2012, для x86 платформы,
    • $(OPENCV_DIR)\x86\vc12\staticlib – Visual Studio 2010, для x86 платформы,
    • $(OPENCV_DIR)\x64\vc12\staticlib – Visual Studio 2013, для x64 платформы,
    • $(OPENCV_DIR)\x64\vc11\staticlib – Visual Studio 2012, для x64 платформы,
    • $(OPENCV_DIR)\x64\vc12\staticlib – Visual Studio 2010, для x64 платформы.
  8. Помимо указания директории со статическими библиотеками, необходимо указать файлы библиотек, непосредственно использующиеся в вашем проекте. Configuration Properties → Linker → Input → Additional Dependencies → добавить список .lib файлов. Имена .lib файлов из библиотеки OpenCV образуются следующим образом: <имя_модуля>d.lib для Debug конфигурации, и <имя_модуля>.lib – для Release. Список требующихся модулей:
    • zlib
    • libjpeg
    • libtiff
    • libpng
    • libjasper
    • IlmImf
    • opencv_core2411
    • opencv_highgui2411
    • opencv_imgproc2411
    • opencv_video2411
    • opencv_ml2411
    • opencv_calib3d2411
    • opencv_objdetect2411
    • opencv_features2d2411
    • opencv_contrib2411
    • opencv_ts2411
    • opencv_legacy2411
    • opencv_flann2411
    • opencv_gpu2411
    • opencv_nonfree2411
    • opencv_ocl2411
    • opencv_photo2411
    • opencv_stitching2411
    • opencv_superres2411
    • opencv_videostab2411
  9. Для работы с видео потребуется дополнительно подключить библиотеку Video for Windows: добавить в приведенный выше список файл vfw32.lib (не различается для Debug и Release конфигураций).
  10. Проект настроен, осталось в коде подключить заголовочный файл opencv2/opencv.hpp.

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

// OpenCV.h
#pragma once
#include <opencv2/opencv.hpp>

#ifdef _MSC_VER // Visual Studio compiler

# if CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION == 4 && CV_SUBMINOR_VERSION == 11
// OpenCV version 2.4.11
#  if defined(_DEBUG) // debug versions: '***d.lib'

#  pragma comment(lib, "zlibd.lib")
#  pragma comment(lib, "libjpegd.lib")
#  pragma comment(lib, "libtiffd.lib")
#  pragma comment(lib, "libpngd.lib")
#  pragma comment(lib, "libjasperd.lib")
#  pragma comment(lib, "IlmImfd.lib")

#  pragma comment(lib, "opencv_core2411d.lib")
#  pragma comment(lib, "opencv_highgui2411d.lib")
#  pragma comment(lib, "opencv_imgproc2411d.lib")
#  pragma comment(lib, "opencv_video2411d.lib")
#  pragma comment(lib, "opencv_ml2411d.lib")

#  pragma comment(lib, "opencv_calib3d2411d.lib")
#  pragma comment(lib, "opencv_objdetect2411d.lib")
#  pragma comment(lib, "opencv_features2d2411d.lib")
#  pragma comment(lib, "opencv_contrib2411d.lib")
#  pragma comment(lib, "opencv_ts2411d.lib")
#  pragma comment(lib, "opencv_legacy2411d.lib")
#  pragma comment(lib, "opencv_flann2411d.lib")
#  pragma comment(lib, "opencv_gpu2411d.lib")

#  pragma comment(lib, "opencv_nonfree2411d.lib")
#  pragma comment(lib, "opencv_ocl2411d.lib")
#  pragma comment(lib, "opencv_photo2411d.lib")
#  pragma comment(lib, "opencv_stitching2411d.lib")
#  pragma comment(lib, "opencv_superres2411d.lib")
#  pragma comment(lib, "opencv_videostab2411d.lib")

# else  // release versions: '***.lib'

#  pragma comment(lib, "zlib.lib")
#  pragma comment(lib, "libjpeg.lib")
#  pragma comment(lib, "libtiff.lib")
#  pragma comment(lib, "libpng.lib")
#  pragma comment(lib, "libjasper.lib")
#  pragma comment(lib, "IlmImf.lib")

#  pragma comment(lib, "opencv_core2411.lib")
#  pragma comment(lib, "opencv_highgui2411.lib")
#  pragma comment(lib, "opencv_imgproc2411.lib")
#  pragma comment(lib, "opencv_video2411.lib")
#  pragma comment(lib, "opencv_ml2411.lib")

#  pragma comment(lib, "opencv_calib3d2411.lib")
#  pragma comment(lib, "opencv_objdetect2411.lib")
#  pragma comment(lib, "opencv_features2d2411.lib")
#  pragma comment(lib, "opencv_contrib2411.lib")
#  pragma comment(lib, "opencv_ts2411.lib")
#  pragma comment(lib, "opencv_legacy2411.lib")
#  pragma comment(lib, "opencv_flann2411.lib")
#  pragma comment(lib, "opencv_gpu2411.lib")

#  pragma comment(lib, "opencv_nonfree2411.lib")
#  pragma comment(lib, "opencv_ocl2411.lib")
#  pragma comment(lib, "opencv_photo2411.lib")
#  pragma comment(lib, "opencv_stitching2411.lib")
#  pragma comment(lib, "opencv_superres2411.lib")
#  pragma comment(lib, "opencv_videostab2411.lib")

# endif // defined(_DEBUG)

# endif // CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION == 4 && CV_SUBMINOR_VERSION == 11

#pragma comment(lib, "Vfw32.lib") // 'Video for Windows', used by OpenCV for video capture

#endif // _MSC_VER

Проект готов, можно начинать пользоваться:

#include "OpenCV.h"

void main(void) {
    cv::Mat image = cv::imread("sample.jpg");
    cv::imshow("image", image);
    cv::waitKey(0);
}

Самостоятельная сборка библиотеки OpenCV

Если вы используете Visual Studio 2008 или более раннюю, то подходящих готовых *.lib файлов в поставке нет. Придётся их собрать из исходных кодов самостоятельно.

  1. Скачиваем и устанавливаем последнюю версию утилиты CMake. На момент написания данного материала для Windows доступна CMake версии 3.2.2.
  2. Из папки установки CMake запускаем bin\cmake-gui.exe.
  3. В поле Where is the source code указываем <Папка_куда_распаковали_OpenCV>\source
  4. В поле Where to build the binaries указываем временную папку, наподобие C:\Temp\build_x86.
  5. Ставим галочку Grouped. В меню отмечаем Options → Supress dev Warnings.
  6. Нажимаем кнопку Configure. На запрос Specify the generator for this project выбираем имеющуюся версию Visual Studio, например Visual Studio 9 2008. После этого некоторое время будет идти анализ конфигурационных файлов CMake в папке sources.
  7. По окончании анализа появится список настроек CMake проекта. Поскольку ранее была установлена галочка Grouped, то настройки будут иерархически сгруппированы. Необходимо снять галочку BUILD → BUILD SHARED LIBS, это приведёт к тому, что будут сгенерированы проекты для создания статических библиотек (.lib), а не динамических (.dll).
  8. Нажимаем кнопку Generate и дожидаемся окончания процесса генерации. Всё, утилита CMake более не нужна, её можно закрыть.
  9. Теперь в указанной нами ранее папке C:\Temp\build_x86 находится проект для Visual Studio: OpenCV.sln. Загружаем его, и запускаем компиляцию командой Build → Build solution, сначала для Debug, а затем и для Release конфигурации. Построение всех библиотек может занять довольно значительное время.
  10. Теперь необходимо найти все сгенерированные *.lib файлы и сложить вместе, например, в <Папка_куда_распаковали_OpenCV>\build\x86\vc9\staticlib. В нашем примере искать файлы нужно в папках
    • C:\Temp\build_x86\3rdparty\lib\Debug
    • C:\Temp\build_x86\3rdparty\lib\Release
    • C:\Temp\build_x86\lib\Debug
    • C:\Temp\build_x86\lib\Release