Pull to refresh

Установка OpenCV в Windows для чайников и подключение библиотеки в Code Blocks

Reading time 17 min
Views 107K
image

Данная статья будет полезна чайникам новичкам в программировании, которые хотят начать изучать техническое зрение при помощи библиотеки OpenCV с полного нуля. Если Вы пользователь Windows и даже не знаете, что значит «прилинковать библиотеку», и при этом Вы мечтаете поглубже изучить работу OpenCV и программирование «под железо», перейти на кроссплатформенное ПО, пойти по пути тру специалиста, то Вам сюда. В статье будут приведены подробные инструкции с картинками, так что не понять, что к чему, будет просто невозможно!

Краткий экскурс по содержанию. Если Вы в первый раз слышите про всё, что написано ниже, то просто читайте и изучайте статью по порядку. Если же Вы что-то уже знаете, можете пропустить данный пункт в статье.

  1. Как пользоваться командной строкой
    Всё про необходимый набор команд для сборки OpenCV.
  2. Компилятор GCC
    Немного о том, как найти нужную Вам сборку GCС и предостережение о возможных ошибках, а также немного про некоторые встроенные в GCC библиотеки для распараллеливания процессов на CPU и GPU.
  3. Установка компилятора
    Вы узнаете, как прописывать переменные среды PATH, и какие проблемы могут возникнуть при установке компилятора.
  4. CMake
    Немного про Cmake.
  5. OpenCV
    Вы узнаете, где скачать, и как подготовить к установке OpenCV, а также немного про саму библиотеку.
  6. Как пользоваться CMake
    Вы узнаете, как настроить компилятор в Cmake и указать пути к библиотеке и к сборке.
  7. Настраиваем сборку OpenCV в Cmake
    Вы узнаете про некоторые опции сборки OpenCV, для настройки его под свои нужды.
  8. Code::Blocks
    Немного о Code::Blocks. Создание примера проекта.
  9. Проблемы с Code::Blocks
    Какие бывают глюки при работе с Code::Blocks.
  10. Подключение OpenCV в Code Blocks
    Вся необходимая и подробная информация, чтобы подключить библиотеку OpenCV к Вашему проекту.
  11. Ошибки во время компиляции программы с библиотекой OpenCV
    Здесь приводится порядок подключения файлов библиотек OpenCV, а также рассматриваются ошибки из-за отсутствия необходимых для работы OpenCV библиотек.
  12. Заключение

Как пользоваться командной строкой

Если в Linux командная строка является неотъемлемой частью операционной системы, то в Windows она почти никогда не нужна. Однако мы ведь хотим стать тру специалистами и научиться программировать под любое железо в любой ОС, писать программы в блокноте и т.д.? Поэтому начнем с командной строки, хотя она будет нужна нам всего лишь для двух команд — mingw32-make и mingw32-make install, но об этом позже. Если Вы уже в курсе, как пользоваться командной строкой, то можете пропустить данный пункт. В противном случае смотрим под спойлер.

Командная строка
Итак, сначала запустим командную строку. Зайдем в ПУСК и в поиске введем cmd. Что поиск найдет, то и запускаем. Должно появиться такое вот окошко:

image

Чтобы перейти на диск D: нужно набрать команду cd /d D:, как на картинке.

image

Дальше попробуем перейти в папку ( в примере это папка YAR ). Команда cd может нам в этом помочь. В моем случае надо просто набрать cd YAR и нажать клавишу Enter, как на картинке.

image

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

image

Командная строка показывает лишь две папки на букву 'o', так как в папке YAR есть лишь две такие папки.

image

Это минимальный набор команд для перемещения в файловой системе, который нам необходимо знать. Запомните их, cd /d <имя диска> перемещает на указанный диск, cd <имя папки> перемещает в указанную папку, а команда cd .. возвращает нас назад.

Компилятор GCC

image Существует хороший, бесплатный и открытый компилятор — GCC. Для Windows есть коллекция бесплатных виндоусовских компиляторов для C и C++MinGW. Другие компиляторы я не использовал, поэтому в данной статье не затрагиваю.

Итак, компилятор значит GCC, гуглим MinGW, однако не спешите тут же скачивать что попало. Сначала надо уловить пару тонкостей, так как мы же сидим под Windows. Во-первых, если Вы скачаете первое, что попадется под руку, пусть и последнюю сборку компилятора, в дальнейшем Вас может ждать разочарование, когда во время сборки библиотеки OpenCV выскочит ошибка вроде этой:

image

Обратим внимание на строку: error: 'thread' in namespace 'std' does not name a type std::thread second_workthread; Эта ошибка говорит о том, что в стандартной библиотеке std нет класса thread, и это несмотря на то, что std стандартная библиотека, и класс thread в ней должен быть обязателен в С++ 11, и компилятор MinGW у Вас версии 6. Дело в том, что во многих сборках MinGW под Windows не поддерживается работа с потоками через std::thread. Поэтому надо найти сборку MinGW (или собрать MinGW самому) с рабочим классом std::thread. В том числе поэтому нельзя использовать TDM GCC. По-другому эту проблему не решить.

Если Вас устроит версия MinGW 5.1, то советую скачать ее тут, с помощью этого набора компиляторов я удачно собрал OpenCV на Windows 10.

Если Вас интересует, как можно распараллелить процессы между ядрами процессора или видеокарты с помощью библиотек OpenMP, OpenACC, то стоит прочитать об этом под спойлером.

А если пока лень во всё вникать, просто качайте компилятор по ссылке, распакуйте архив, переместите содержимое архива, куда Вам нужно, и следуйте инструкции дальше.

Подробнее про распараллеливание процессов
Если Вас интересует распараллеливание процессов на GPU с помощью встроенной в компилятор библиотеки OpenACC, то я советую найти 6 версию GCC под Windows, ведь тру специалист по техническому зрению наверняка захочет написать что-то свое (например, нейросеть) с использованием мощности GPU. Дело в том, что версия GCC 5.1 включает в себя экспериментальную версию OpenACC, и потому не очень подходит для этих целей. Впрочем, можно использовать и CUDA, тем более что OpenCV дружит с CUDA, и если Вы собираетесь на перспективу делать приложения для ПК с мощной видеокартой от nvidia, то Вам необязательно знакомиться с OpenACC. Также в компиляторах GCC есть другая полезная библиотека, которая используется и в OpenCV. Это OpenMP. С помощью OpenMP можно легко делать распараллеливание вычислений между ядрами процессора (CPU), увеличивая скорость работы программы в несколько раз. Поэтому я советую Вам изучить OpenMP и скачать компилятор с его поддержкой. Выбирайте компиляторы с учетом разрядности вашей системы.

Установка компилятора

После того, как Вы скачаете MinGW, надо будет провести пару нехитрых манипуляций с ним — прописать папку bin в переменную среды PATH. Это нужно для того, чтобы из командной строки можно было воспользоваться командой make или mingw32-make, иначе Вас будет ждать такое сообщение: «mingw32-make» не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Также в папке bin расположены динамические библиотеки для работы компилятора, которые windows попросту не увидит, если Вы не пропишите путь к папке bin в переменную среды PATH.

Итак, чтобы прописать путь к папке с компиляторами в переменную среды PATH, идем сначала в ПУСК, затем тыкаем в Этот компьютер и заходим в свойства. Там нажимаем Дополнительные параметры системы, находим и жмем переменные среды и затем, или в окне переменные среды пользователя (если Вы делаете эту переменную только для себя), или в окне системные переменные (если Вы делаете переменную для всех пользователей Windows) находим переменную PATH (или Path) и в нее дописываем Ваш путь до папки bin. Например, как в моем случае C:\MinGW\mingw64\bin. Путь прописываем после символа ';'. Если у Вас в списке переменных нет PATH, то можете создать её, и тогда в ней будет пока один единственный путь — путь до Вашего компилятора GCC. Не забудьте переместить MinGW в удобную для Вас папку, прежде чем прописывать путь до папки bin. Также не забудьте перезапустить командную строку (если Вы её уже запустили) после добавления в PATH папки bin Вашего MinGW.

Как прописать PATH в картинках
image

Установка Cmake

image Cmake полезная штука, это кроcсплатформенная утилита для автоматической сборки программы из исходного кода. Она нам будет нужна, чтобы подготовить OpenCV к сборке. Качаем Cmake, если у Вас 64-разрядная система, качаем архив cmake-3.7.1-win64-x64.zip. Когда архив будет скачен, распакуйте его куда Вам удобнее. Cmake можно пользоваться через GUI. Для этого в папке с Cmake заходим в папку bin и нажимаем cmake-gui.exe. Теперь на время отложим Cmake и займемся OpenCV.

OpenCV

image Если Вы читаете данную статью, то скорее всего уже знаете, зачем нужен OpenCV, и на что эта библиотека способна. Остальные могут посмотреть это видео и почитать тут. Для установки OpenCV нам надо скачать два архива. Один архив непосредственно с самой библиотекой OpenCV, а второй архив — дополнительные модули для библиотеки OpenCV. Каждый модуль ответственен за что-то свое, например, bioinspired модуль содержит в себе модель сетчатки глаза и может быть применен для детектора движения или для выравнивания яркости на изображении. Некоторые модули идут в составе архива с библиотекой OpenCV.

Итак, гуглим extra modules, чтобы найти модули для OpenCV. Если лень искать, можете скачать тут.

Затем гуглим саму библиотеку OpenCV, скачать ее можно тут и тут (во втором случае выберете OpenCV for Linux/Mac, так как версия для Windows рассчитана на Visual Studio). На момент написания статьи последняя версия OpenCV 3.2.0.

После того, как скачали два архива, распакуйте их и переместите содержимое, куда Вам удобно. Зайдите в папку OpenCV и создайте там папку build (или назовите ее как угодно, это просто папка, куда будет собираться OpenCV). И вот теперь можно начать работать с Cmake.

Папка build в папке с библиотекой OpenCV
image

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

В окне Cmake нажимаем Browse Source и выбираем папку, где находятся файлы библиотеки OpenCV. Затем нажимаем Browse Build и выбираем папку build, которую ранее создали внутри папки с библиотекой OpenCV. В итоге должно получиться примерно, как на этой картинке.

Окно Cmake с указанными папками библиотеки OpenCV
image

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

Вид окна Cmake
image

Где написано Specify the generator for this project оставьте без изменений, строка MinGW Makefiles будет говорить о том, что Cmake соберет библиотеку с файлом инструкции для программы make под компиляторы MinGW. О том, что такое Makefiles можно почитать тут, а как этим пользоваться, тут. Впрочем, пока не надо на это распыляться, продолжаем установку OpenCV. Выберите пункт Specify native compilers, затем нажмите кнопку Next.

Как должно выглядеть окошко Cmake с правильными установленными пунктами
image

Дальше в новом окне выбираем компиляторы для языка C и С++. Эти компиляторы находятся в папке bin набора компиляторов MinGW. Для языка C прописываем путь до программы в папке bin, что заканчивается на mingw32-gcc.exe, а для языка C++ — путь до программы, что заканчивается на mingw32-g++.exe, язык Fortan не трогаем. В моем случае в папке bin есть такие программы компиляторов x86_64-w64-mingw32-gcc.exe и x86_64-w64-mingw32-g++.exe, их я и указал. Если вы забудете, что именно нужно указывать в этих пунктах, можно подсмотреть в настройках компилятора Code::Blocks (Если Вы скачали его со встроенным компилятором MinGW). Для этого в программе Code::Blocks заходим в Settings, выбираем пункт Compiler, заходим в Toolchain executables. В закладке Program Files на строчках C Compiler и C++ Compiler указаны компиляторы для языка C и C++.

Настройка компиляторов в Cmake в картинках
image
В итоге должно получиться примерно так
image

Где расположены настройки компилятора Code::Blocks в картинках
image

Жмем в настройках компиляторов Cmake кнопку Finish и…

image

Это означает, что библиотека OpenCV слишком сложная для обывателя, и зря мы вообще начали ее устанавливать. Чтобы ею пользоваться, надо сначала получить академические корочки и изучать программирование лет 10-20, и вообще технический прогресс уже слишком далеко ушел, и никакие DIY проекты за ним не угонятся… Короче, бросьте это дело, не для Вас это.

Шучу. Ошибка скорее всего вызвана тем, что Windows не видит dll библиотеки компилятора, несмотря на то, что мы прописали папку bin в PATH. Поэтому идем в папку bin и копируем все dll файлы, а затем вставляем в папку system32, которая находится в папке Windows на диске C:. В моем случае таких dll файлов было много.

Динамические библиотеки DLL в папке bin MinGW
image

Теперь снова жмем кнопку Cmake'a Configure и процесс должен пойти успешно. В конце получим такую вот картину:

image

Настраиваем сборку OpenCV в Cmake

Как Вы видите, есть много опций. Затронем некоторые важные из них. Начнем с внешних модулей OpenCV. Ищем в Cmake опцию OPENCV_EXTRA_MODULES_PATHCmake есть поиск, в котором удобно искать интересующую Вас опцию) и прописываем там путь до внешних модулей, которые мы скачали отдельным архивом opencv_contrib-master.zip. В моем случае путь выглядит так: D:\YAR\_repoz\opencv_contrib-master\opencv_contrib-master\modules.

OPENCV_EXTRA_MODULES_PATH на картинке
image

Рассмотрим флаги, например, BUILD_EXAMPLES включает постройку примеров, можно поставить галочку. BUILD_SHARED_LIBS (по умолчанию стоит галочка) указывает, строить динамические библиотеки или статические. Статические библиотеки будут вшиты в программный код Вашей программы, поэтому ее будет легче переносить с одного компьютера на другой, однако при этом программа будет больше весить. Динамические библиотеки могут использовать все Ваши программы, однако на другом компьютере их может не быть, если OpenCV не будет установлен. WITH_TBB включает использование библиотеки Intel Threading Building Blocks, если у Вас она на компьютере установлена, можете включить эту опцию (однако стоит заметить, что Cmake включает некоторые опции сам, если на компьютере обнаружено необходимое ПО). WITH_CUDA включает использование CUDA для работы с GPU (на компьютере должен быть установлен CUDA). CMAKE_BUILD_TYPE может иметь два состояния, Debug и Release, выберете тип сборки, какой Вам необходим.

После того, как Вы определитесь со всеми опциями, жмем снова кнопку Configure. После того, как Cmake закончит, жмем кнопку Generate. Если все прошло без ошибок, теперь дело стоит за командной строкой. Итак, открываем командную строку и переходим в папку build. Пишем в командной строке mingw32-make и жмем Enter. Должно получиться примерно такое:

image

Сборка OpenCV началась, теперь надо подождать… Можете пока сходить попить чаю или посмотреть, как хакнуть время.

Если на экране командной строки нет никаких ошибок, и сборка дошла до 100%, то можно написать команду mingw32-make install.

mingw32-make install на картинке
image

Когда установка OpenCV будет закончена, в папке build или в папке install в папке build должны появиться все необходимые файлы.

Папка install
image

В папке include будут размещены все заголовочные .hpp и .h файлы, которые вы будете подключать в своем коде. Далее в папке lib или в моем случае opencv-3.2.0\build\install\x64\mingw\staticlib находятся все библиотеки OpenCV. В моем случае это статичные библиотеки .a. Также здесь должен быть файл, в котором можно посмотреть на порядок подключения этих библиотек, например, файл OpenCVModules.cmake. Если его открыть, можно найти там следующее:

Содержание файла OpenCVModules
foreach(_expectedTarget zlib libtiff libjpeg libwebp libjasper libpng IlmImf opencv_core opencv_flann opencv_imgproc opencv_ml opencv_photo opencv_reg opencv_surface_matching opencv_video libprotobuf opencv_dnn opencv_fuzzy opencv_imgcodecs opencv_shape opencv_videoio opencv_highgui opencv_objdetect opencv_plot opencv_superres opencv_xobjdetect opencv_xphoto opencv_bgsegm opencv_bioinspired opencv_dpm opencv_face opencv_features2d opencv_line_descriptor opencv_saliency opencv_text opencv_calib3d opencv_ccalib opencv_datasets opencv_rgbd opencv_stereo opencv_tracking opencv_videostab opencv_xfeatures2d opencv_ximgproc opencv_aruco opencv_optflow opencv_phase_unwrapping opencv_stitching opencv_structured_light)
  list(APPEND _expectedTargets ${_expectedTarget})
  if(NOT TARGET ${_expectedTarget})
    list(APPEND _targetsNotDefined ${_expectedTarget})
  endif()
  if(TARGET ${_expectedTarget})
    list(APPEND _targetsDefined ${_expectedTarget})
  endif()
endforeach()


Видите zlib libtiff libjpeg libwebp и т.д., это библиотеки, только тут они перечислены в правильном порядке. Если Вы их подключите не в том порядке, в котором их будет проверять компилятор, то возникнут ошибки, но об этом позже.

В директории opencv-3.2.0\build\install\x64\mingw\bin находятся программы для обучения каскада HAAR'a, которые могут пригодиться в будущем, чтобы обучить детектор OpenCV на интересующие Вас объекты, а тут opencv-3.2.0\build\install\etc\haarcascades находятся уже обученные каскады.

Code::Blocks
image Кажется, я говорил, что тру специалист может кодить в блокноте, но пока мы остановимся на среде разработки Code::Blocks. Это свободная кроссплатформенная среда разработки, т.е. Вы сможете пользоваться средой разработки как под Windows, так и под Linux. В данной статье подключение OpenCV будет именно в этой среде разработки. Если Вы еще не знакомы с данной средой для программирования, для Вас есть немного информации под спойлером.

Подробнее про Code Blocks
Скачайте последнюю версию, можно со встроенным компилятором MinGW, для этого скачайте по ссылкам codeblocks-16.01mingw-setup.exe тут. После установки Code::Blocks попробуйте создать тестовый проект. Для этого выполняем действия в такой последовательности: File -> New -> Project..., выбираем Console Application и жмем Go, выбираем компилятор C++ или C, пишем имя проекта, нажимаем Finish. Чтобы посмотреть файл main программы, нажимаем слева на крестик возле надписи Sources внутри окна Management в закладке Projects. Выбрав файл main, можно посмотреть его содержимое, там должно быть что-то вроде этого (для языка C++):

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

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

image

Проблемы с Code::Blocks

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

Ваша программа в диспетчере задач
image

Также бывает, что после подключения заголовочных файлов Code::Blocks начинает жутко тормозить. Эту проблему можно решить, убрав галочку в пункте Update parser when typing (on save otherwise) в настройках среды разработки (Settings → Editor… → Code completion).

Где находится Update parser when typing (on save otherwise) в картинках
image

Подключение OpenCV в Code Blocks

И вот настал долгожданный момент. OpenCV можно подключить как к конкретному проекту, так и в глобальных настройках среды программирования Code Blocks, чтобы потом не возиться с настройками для каждого проекта с OpenCV в отдельности. Оба варианта реализуются почти одинаково. Итак, сначала подключим библиотеки. Хочу напомнить, что, если Вы собрали OpenCV с использованием динамических библиотек, то файлы с расширением dll (которые Вы должны найти где-то в папке с собранной библиотекой) нужно переместить или в папку с Вашей программой (кинуть их в папку с проектом Code Blocks) или скопировать их в папку операционной системы system32. Хотя по идее все должно работать, если эти файлы будут находиться в одном из путей, прописанных в PATH. В противном случае Ваша программа скомпилируется, но при запуске выдаст ошибку. В моем случае OpenCV собрана с использованием статических библиотек.

Итак, сначала подключим библиотеки. Заходим в настройки компилятора (Settings → Compiler… → Global Compiler Settings → Linker Settings) и добавляем туда все файлы библиотек (в моем случае эти файлы находятся тут opencv-3.2.0\opencv-3.2.0\build\install\x64\mingw\staticlib). Далее идем в настройки Search directories и во вкладке Compiler и Linker прописываем пути до папок с заголовочными файлами OpenCV. В моем случае эти пути такие: D:\YAR\_repoz\opencv-3.2.0\opencv-3.2.0\build\install\include (обязательно!), D:\YAR\_repoz\opencv-3.2.0\opencv-3.2.0\build\install\include\opencv2 и D:\YAR\_repoz\opencv-3.2.0\opencv-3.2.0\build\install\include\opencv для удобства подключение заголовочных файлов (чтобы вместо #include «opencv2\cv.hpp» писать сразу #include <cv.h>);

Как подключить OpenCV в картинках
image

Для OpenCV версии 2.0 на данном этапе (скорее всего) всё было бы уже готово. Однако для версии 3.1 и 3.2 при попытке скомпилировать программу появится ошибка. Попробуйте запустить эту программу:

Код тестовой программы
#include <iostream>
#include <cv.h>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "math.h"

using namespace std;
// изображение для тестирования
// 640 пикселей в ширину и 480 в высоту
// 3 канала (цветное изображение)
cv::Mat inputImage(cv::Size(640,480), CV_8UC3);

int main()
{
    cout << "Hello world!" << endl;
    double t = 0.0;
    while(1) {
        unsigned long offsetImage = 0; // позиция в массиве данных изображения
        // зададим цвет
        unsigned char colorR = 255;
        unsigned char colorG = 255;
        unsigned char colorB = 255;
        for (short x = 0; x < inputImage.cols; x++) {
            // для всех столбцов
            for (short y = 0; y < inputImage.rows; y++) {
                // и для всех строк...
                // зададим цвет пикселя (B G R)
                inputImage.data[offsetImage] = colorB;
                inputImage.data[offsetImage + 1] = colorG;
                inputImage.data[offsetImage + 2] = colorR;
                // перейдем на следующий пиксель
                offsetImage += 3;
            }
        }
        // напечатаем текст со случайным цветом символов
        cv::putText(inputImage,"Hello world!",
                    cv::Point(180 + 120 * sin(3.1415*t),240 + 120 * cos(3.1415*t)),
                    CV_FONT_HERSHEY_SIMPLEX,2.0,
                    cv::Scalar(rand() % 256, rand() % 256, rand() % 256));
        t+=0.08;
        // покажем картинку
        cv::imshow("test", inputImage);
        // подождем 200 мс
        char symbol = cv::waitKey(200);
        if (symbol == 'b' || symbol == 'B') {
            // если была нажата кнопка B
            // то выйдем из цикла
            break;
        }
    }
    // освободим память
    inputImage.release();
    return 0;
}


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

image

Это означает, что техническое зрение — очень сложное направление, и зря Вы решили этим заняться. В мире есть много других профессий, где не надо разбираться в программировании и, тем более, в техническом зрении. В области IT уже все давно придумали за Вас, и нет смысла пытаться что-то сделать самому, и, уж тем более, лезть в стартапы. Осталось лишь принять тот факт, что Вы обречены остаться всего лишь потребителем высоких технологий до конца своих дней… Шучу, конечно!

Ошибки во время компиляции программы с библиотекой OpenCV

Итак, разберемся в ошибках.

undefined reference to `GOMP_parallel'

libopencv_core320.a(parallel.cpp.obj):parallel.cpp:
undefined reference to `GOMP_parallel'

Из лога ошибки видно, что проблема кроется в файле libopencv_core320 библиотеки OpenCV, компилятор не знает, что такое GOMP_parallel. Подобные ошибки обычно означают то, что некая библиотека не была подключена. В данном случае эта библиотека OpenMP, о которой я говорил в начале статьи, когда писал про компилятор GCC. Подключим её и посмотрим дальше. О том, как подключить OpenMP в проект, Вы можете прочитать тут.

Так выглядит подключение OpenMP для библиотек OpenCV
image

Теперь при попытке скомпилировать могут снова возникнуть ошибки, например, такие:

image

Важная информация из лога ошибки

libopencv_highgui320.a(window_w32.cpp.obj):window_w32.cpp
undefined reference to `__imp_GdiFlush'|

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

Добавление библиотеки GDI
image

Еще одна ошибка, наверное, самая важная.

image

В логах видно, что имеет место быть какая-то библиотека Imf, например, undefined reference to Imf::Chromaticities::Chromaticities. Однако эта библиотека уже есть в составе OpenCV, да и к тому же мы её уже подключили!

image

Дело в том, что компилятор проверяет библиотеки в среде Windows, начиная с конца того списка библиотек, которые мы добавили. И как видно на картинке, файл libIlmImf.a находится в начале, и в итоге компилятор находит сначала библиотеку, в которой используются функции из файла libIlmImf.a, а затем находит файл libIlmImf.a, но уже поздно — он уже сообщил, что есть ошибка. Этот вопрос разрешается просто — нужно привести наш список библиотечных файлов в правильный порядок. Делается это кнопками «вверх» и «вниз», которые я отметил на картинке.

Кнопки
image

Порядок подключения библиотек можно найти в файлах .cmake в папке с библиотеками OpenCV, об этом я уже писал в данной статье выше. Приведу порядок подключения для OpenCV 3.2

Порядок подключения библиотек OpenCV
Так порядок подключения выглядит в Code Blocks:

image
А вот список, который в Code Blocks придется заполнять снизу вверх.

zlib
libtiff
libjpeg
libwebp
libjasper
libpng
IlmImf
opencv_core
opencv_flann
opencv_imgproc
opencv_ml
opencv_photo
opencv_reg
opencv_surface_matching
opencv_video
libprotobuf
opencv_dnn
opencv_fuzzy
opencv_imgcodecs
opencv_shape
opencv_videoio
opencv_highgui
opencv_objdetect
opencv_plot
opencv_superres
opencv_xobjdetect
opencv_xphoto
opencv_bgsegm
opencv_bioinspired
opencv_dpm
opencv_face
opencv_features2d
opencv_line_descriptor
opencv_saliency
opencv_text
opencv_calib3d
opencv_ccalib
opencv_datasets
opencv_rgbd
opencv_stereo
opencv_tracking
opencv_videostab
opencv_xfeatures2d
opencv_ximgproc
opencv_aruco
opencv_optflow
opencv_phase_unwrapping
opencv_stitching
opencv_structured_light


Еще одна возможная ошибка:

libopencv_highgui320.a(window_w32.cpp.obj):window_w32.c
undefined reference to `__imp_GetSaveFileNameA'

Она разрешается добавлением библиотеки Comdlg32. Для этого просто добавьте Comdlg32 в Linker Settnigs.

Подключение библиотеки Comdlg32
image

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

image

Update
Уже после написания данной статьи я обнаружил еще пару ошибок типа undefined reference to. Ниже приведены списки ошибок и библиотеки, которые необходимо добавить чтобы исправить ситуацию.

Отсутствие подключенной библиотеки Ole32 вызывает следующие ошибки:
undefined reference to `__imp_CoTaskMemFree'
undefined reference to `__imp_CoCreateInstance'
undefined reference to `__imp_CoCreateInstance'

Отсутствие подключенной библиотеки OleAut32 вызывает следующую ошибку:
undefined reference to `__imp_OleCreatePropertyFrame'

Отсутствие подключенной библиотеки uuid вызывает следующие ошибки:
undefined reference to `IID_IPersistStream'
undefined reference to `IID_IUnknown'
undefined reference to `IID_ISpecifyPropertyPages'
undefined reference to `IID_IPropertyBag'

Отсутствие подключенной библиотеки Vfw32 или Avifil32 вызывает следующие ошибки:
undefined reference to `AVIStreamRelease'
undefined reference to `AVIFileRelease'
undefined reference to `AVIFileOpenA'
undefined reference to `AVIFileCreateStreamA'
undefined reference to `AVISaveOptions'
undefined reference to `AVIMakeCompressedStream'
undefined reference to `AVIStreamSetFormat'
undefined reference to `AVIStreamWrite'


Не забудьте подключить их в своем Code::Blocks!
image

Update: не работает чтение avi файла
Если при использовании cv::VideoCapture возникли проблемы, а именно OpenCV не хочет открывать видео файлы, то вам просто необходимо скопировать в папку со своей программой dll библиотеку opencv_ffmpeg (в моем случае она называется opencv_ffmpeg320_64.dll, версия opencv 3.2, находилась тут: opencv-3.2.0\build\install\x64\mingw\bin).

Заключение

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

Не открывать
image
Tags:
Hubs:
+16
Comments 21
Comments Comments 21

Articles