Данная статья будет полезна
Краткий экскурс по содержанию. Если Вы в первый раз слышите про всё, что написано ниже, то просто читайте и изучайте статью по порядку. Если же Вы что-то уже знаете, можете пропустить данный пункт в статье.
- Как пользоваться командной строкой
Всё про необходимый набор команд для сборки OpenCV.
- Компилятор GCC
Немного о том, как найти нужную Вам сборку GCС и предостережение о возможных ошибках, а также немного про некоторые встроенные в GCC библиотеки для распараллеливания процессов на CPU и GPU.
- Установка компилятора
Вы узнаете, как прописывать переменные среды PATH, и какие проблемы могут возникнуть при установке компилятора.
- CMake
Немного про Cmake.
- OpenCV
Вы узнаете, где скачать, и как подготовить к установке OpenCV, а также немного про саму библиотеку.
- Как пользоваться CMake
Вы узнаете, как настроить компилятор в Cmake и указать пути к библиотеке и к сборке.
- Настраиваем сборку OpenCV в Cmake
Вы узнаете про некоторые опции сборки OpenCV, для настройки его под свои нужды.
- Code::Blocks
Немного о Code::Blocks. Создание примера проекта.
- Проблемы с Code::Blocks
Какие бывают глюки при работе с Code::Blocks.
- Подключение OpenCV в Code Blocks
Вся необходимая и подробная информация, чтобы подключить библиотеку OpenCV к Вашему проекту.
- Ошибки во время компиляции программы с библиотекой OpenCV
Здесь приводится порядок подключения файлов библиотек OpenCV, а также рассматриваются ошибки из-за отсутствия необходимых для работы OpenCV библиотек.
- Заключение
Как пользоваться командной строкой
Если в Linux командная строка является неотъемлемой частью операционной системы, то в Windows она почти никогда не нужна. Однако мы ведь хотим стать тру специалистами и научиться программировать под любое железо в любой ОС, писать программы в блокноте и т.д.? Поэтому начнем с командной строки, хотя она будет нужна нам всего лишь для двух команд — mingw32-make и mingw32-make install, но об этом позже. Если Вы уже в курсе, как пользоваться командной строкой, то можете пропустить данный пункт. В противном случае смотрим под спойлер.
Чтобы перейти на диск D: нужно набрать команду cd /d D:, как на картинке.
Дальше попробуем перейти в папку ( в примере это папка YAR ). Команда cd может нам в этом помочь. В моем случае надо просто набрать cd YAR и нажать клавишу Enter, как на картинке.
Если же нужно вернуться назад, достаточно набрать команду cd .., и Вы окажетесь в предыдущей папке. Также часто удобно использовать клавишу Tab, чтобы командная строка перечисляла имена папок, начинающихся на тот символ, который Вы напечатали после команды cd, как например на этой анимации.
Командная строка показывает лишь две папки на букву 'o', так как в папке YAR есть лишь две такие папки.
Это минимальный набор команд для перемещения в файловой системе, который нам необходимо знать. Запомните их, cd /d <имя диска> перемещает на указанный диск, cd <имя папки> перемещает в указанную папку, а команда cd .. возвращает нас назад.
Компилятор GCC
Существует хороший, бесплатный и открытый компилятор — GCC. Для Windows есть коллекция бесплатных виндоусовских компиляторов для C и C++ — MinGW. Другие компиляторы я не использовал, поэтому в данной статье не затрагиваю.
Итак, компилятор значит GCC, гуглим MinGW, однако не спешите тут же скачивать что попало. Сначала надо уловить пару тонкостей, так как мы же сидим под Windows. Во-первых, если Вы скачаете первое, что попадется под руку, пусть и последнюю сборку компилятора, в дальнейшем Вас может ждать разочарование, когда во время сборки библиотеки OpenCV выскочит ошибка вроде этой:
Обратим внимание на строку: 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, то стоит прочитать об этом под спойлером.
А если пока лень во всё вникать, просто качайте компилятор по ссылке, распакуйте архив, переместите содержимое архива, куда Вам нужно, и следуйте инструкции дальше.
Установка компилятора
После того, как Вы скачаете 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.
Установка Cmake
Cmake полезная штука, это кроcсплатформенная утилита для автоматической сборки программы из исходного кода. Она нам будет нужна, чтобы подготовить OpenCV к сборке. Качаем Cmake, если у Вас 64-разрядная система, качаем архив cmake-3.7.1-win64-x64.zip. Когда архив будет скачен, распакуйте его куда Вам удобнее. Cmake можно пользоваться через GUI. Для этого в папке с Cmake заходим в папку bin и нажимаем cmake-gui.exe. Теперь на время отложим Cmake и займемся OpenCV.
OpenCV
Если Вы читаете данную статью, то скорее всего уже знаете, зачем нужен 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.
Как пользоваться Cmake
В окне Cmake нажимаем Browse Source и выбираем папку, где находятся файлы библиотеки OpenCV. Затем нажимаем Browse Build и выбираем папку build, которую ранее создали внутри папки с библиотекой OpenCV. В итоге должно получиться примерно, как на этой картинке.
Затем нажимаем кнопку Configure, должно появиться окошко, где можно настроить, под что именно Вы хотите собрать библиотеку.
Где написано Specify the generator for this project оставьте без изменений, строка MinGW Makefiles будет говорить о том, что Cmake соберет библиотеку с файлом инструкции для программы make под компиляторы MinGW. О том, что такое Makefiles можно почитать тут, а как этим пользоваться, тут. Впрочем, пока не надо на это распыляться, продолжаем установку OpenCV. Выберите пункт Specify native compilers, затем нажмите кнопку Next.
Дальше в новом окне выбираем компиляторы для языка 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 кнопку Finish и…
Это означает, что библиотека OpenCV слишком сложная для обывателя, и зря мы вообще начали ее устанавливать. Чтобы ею пользоваться, надо сначала получить академические корочки и изучать программирование лет 10-20, и вообще технический прогресс уже слишком далеко ушел, и никакие DIY проекты за ним не угонятся… Короче, бросьте это дело, не для Вас это.
Шучу. Ошибка скорее всего вызвана тем, что Windows не видит dll библиотеки компилятора, несмотря на то, что мы прописали папку bin в PATH. Поэтому идем в папку bin и копируем все dll файлы, а затем вставляем в папку system32, которая находится в папке Windows на диске C:. В моем случае таких dll файлов было много.
Теперь снова жмем кнопку Cmake'a Configure и процесс должен пойти успешно. В конце получим такую вот картину:
Настраиваем сборку OpenCV в Cmake
Как Вы видите, есть много опций. Затронем некоторые важные из них. Начнем с внешних модулей OpenCV. Ищем в Cmake опцию OPENCV_EXTRA_MODULES_PATH (в Cmake есть поиск, в котором удобно искать интересующую Вас опцию) и прописываем там путь до внешних модулей, которые мы скачали отдельным архивом opencv_contrib-master.zip. В моем случае путь выглядит так: D:\YAR\_repoz\opencv_contrib-master\opencv_contrib-master\modules.
Рассмотрим флаги, например, 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. Должно получиться примерно такое:
Сборка OpenCV началась, теперь надо подождать… Можете пока сходить попить чаю или посмотреть, как хакнуть время.
Если на экране командной строки нет никаких ошибок, и сборка дошла до 100%, то можно написать команду mingw32-make install.
Когда установка OpenCV будет закончена, в папке build или в папке install в папке build должны появиться все необходимые файлы.
В папке include будут размещены все заголовочные .hpp и .h файлы, которые вы будете подключать в своем коде. Далее в папке lib или в моем случае opencv-3.2.0\build\install\x64\mingw\staticlib находятся все библиотеки OpenCV. В моем случае это статичные библиотеки .a. Также здесь должен быть файл, в котором можно посмотреть на порядок подключения этих библиотек, например, файл OpenCVModules.cmake. Если его открыть, можно найти там следующее:
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
Кажется, я говорил, что тру специалист может кодить в блокноте, но пока мы остановимся на среде разработки Code::Blocks. Это свободная кроссплатформенная среда разработки, т.е. Вы сможете пользоваться средой разработки как под Windows, так и под Linux. В данной статье подключение OpenCV будет именно в этой среде разработки. Если Вы еще не знакомы с данной средой для программирования, для Вас есть немного информации под спойлером.
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
Наверху в среде разработки есть иконка с желтой шестеренкой, нажмите на нее, чтобы скомпилировать программу. Затем нажмите на иконку, похожую на кнопку Play, и программа запустится. Все вышеперечисленные действия можно посмотреть в виде анимации ниже.
Проблемы с Code::Blocks
Иногда запущенную программу не получается закрыть. Чаще всего это бывает, если сделать завершение работы программы через среду разработки, нажав иконку Abort. В этом случае зайдите в диспетчер задач и посмотрите процессы. Снимите задачу, которая является Вашей программой.
Также бывает, что после подключения заголовочных файлов Code::Blocks начинает жутко тормозить. Эту проблему можно решить, убрав галочку в пункте Update parser when typing (on save otherwise) в настройках среды разработки (Settings > Editor… > Code completion).
Подключение 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 версии 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;
}
После неудачной попытки ее скомпилировать может появится, например, такая ошибка:
Это означает, что техническое зрение — очень сложное направление, и зря Вы решили этим заняться. В мире есть много других профессий, где не надо разбираться в программировании и, тем более, в техническом зрении. В области 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 в проект, Вы можете прочитать тут.
Теперь при попытке скомпилировать могут снова возникнуть ошибки, например, такие:
Важная информация из лога ошибки
libopencv_highgui320.a(window_w32.cpp.obj):window_w32.cpp
undefined reference to `__imp_GdiFlush'|
Из этого лога видно, что проблема в библиотеке GDI, которая позволяет приложениям использовать графику и форматированный текст на мониторе и принтере. Добавим ее точно так же, как предыдущую библиотеку.
Еще одна ошибка, наверное, самая важная.
В логах видно, что имеет место быть какая-то библиотека Imf, например, undefined reference to Imf::Chromaticities::Chromaticities. Однако эта библиотека уже есть в составе OpenCV, да и к тому же мы её уже подключили!
Дело в том, что компилятор проверяет библиотеки в среде Windows, начиная с конца того списка библиотек, которые мы добавили. И как видно на картинке, файл libIlmImf.a находится в начале, и в итоге компилятор находит сначала библиотеку, в которой используются функции из файла libIlmImf.a, а затем находит файл libIlmImf.a, но уже поздно — он уже сообщил, что есть ошибка. Этот вопрос разрешается просто — нужно привести наш список библиотечных файлов в правильный порядок. Делается это кнопками «вверх» и «вниз», которые я отметил на картинке.
Порядок подключения библиотек можно найти в файлах .cmake в папке с библиотеками OpenCV, об этом я уже писал в данной статье выше. Приведу порядок подключения для OpenCV 3.2
А вот список, который в 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.
Теперь, если во время компиляции программы ошибок не возникло, можно запустить программу. Если Вы использовали пример программы из моей статьи, должно получиться что-то вроде этого:
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!
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 для новичка может показаться очень сложным занятием, так как вероятность столкнуться с ошибками велика, а знаний, чтобы понять что к чему еще не так много. Надеюсь, данная статья поможет всем, кто только начинает программировать, и сэкономит Вам пару дней или недель поисков в интернете. И напоследок. Может быть, Вы задаетесь вопросом, сколько же нужно времени, чтобы стать тру специалистом? Ответ на этот вопрос есть под спойлером.
Комментарии (16)
aso
20.01.2017 10:37-1cd /d <имя диска> перемещает на указанный диск
Гхм.
А просто набрать «дэ двоеточие» религия запрещает, да-аа?
BelBES
20.01.2017 10:53-1Хм… а Code::block не умеет работать с проектами исопльзующими CMake?
Тогда бы подключение OpenCV свелось всего лишь к:
find_package(OpenCV REQUIRED) if(NOT OpenCV_FOUND) message(SEND_ERROR "Faild to find Opencv") return() else() include_directories(${Opencv_INCLUDE_DIR}) endif() ... target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
QT Creator, кстати, из коробки умеет работать с cmake'ами, без всякой промежуточной генерации проекта.
Ivan_83
20.01.2017 16:35-1Как же всё уныло под виндой.
Целый пост о том, как собрать опенцв с какими то опциями в базовой поставке.
Ни слова о том какие опции есть, о том что есть ещё opencv_contrib где тоже куча вкусностей лежит, о том что можно повключать всякие eigen3, sse, avx прочие штуковины чтобы оно пахало быстрее.
Что же будет когда понадобится забирать видео с GigE камеры, а для этого нужно будет ещё и aravis либу собрать и поставить?)
Или ещё какую то либу прикрутить, с которой OpenCV умеет дружить.
Как сделать тоже самое под фрёй.
Берём отсюда патч: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=210505
Вливаем его в порты:
cd /usr/ports
svn patch /path/to/patchfile
(скоро это вольют в базу и эти шаги будут не нужны)
cd /usr/ports/graphics/opencv3/
make config-recursive (несколько раз, чтобы точно все опции проставить во всех зависимостях)
make install
минут 5-15 отдохнуть пока качается и собирается
Получаем в итоге что сбилдится: core flann hdf imgproc ml photo reg surface_matching video dnn freetype fuzzy imgcodecs shape videoio highgui objdetect plot superres xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo tracking videostab xfeatures2d ximgproc aruco optflow phase_unwrapping sfm stitching structured_light
Подключение к проекту в CodeLite:
свойства проекта, global settings, там где компиляторы добавляем/ставим: `pkg-config --cflags opencv`
(для си и/или си++)
Ниже для линкера Options: `pkg-config --libs opencv`
Для остальных IDE и систем сборки — как обычно для либ у которых есть pkg-config файл в котором всё уже прописано.
vidyacat
21.01.2017 05:24+1Каждый раз когда я вижу упоминание коде блокс я задаюсь вопросом «зачем они жрут кактус?»
Нет, серьёзно. 2017 год, а вы используете это кривое поделие на гтк. Его по Оно даже на линуксе кривое, какой уж тот виндос.
А ведь есть кутикриэйтор с нативной конфигурацией проектов на симэйке.
Playa
21.01.2017 05:24+2Подключать OpenCV нужно не в глобальных настройках, а настройках проекта, а то он теперь ко всем проектам пристанет.
Psychosynthesis
Ничего не имею против открытого ПО, даже наоборот, но на мой личный взгляд было бы всё же чуть полезнее, если бы вы описывали сей процесс с прицелом на MS Visual Studio.
SvyatoslavMC
Плюсую. Только для Visual Studio описывать особо нечего. Достаточно скачать бинари и указать пути до .h/.lib/.dll файлов и всё заработает.
Psychosynthesis
Ну я просто не знаток конкретно VS, давно хочу на неё переползти с безнадёжно устаревшего Buildera 2007, да всё никак не соберусь, ибо пишу редко и только для себя. Вот и думал может там есть какие премудрости, сразу бы может и перелез бы тут :)
ELEKTRO_YAR
В MS Visual Studio не работаю, т. к. цели у меня другие, поэтому в статье про нее ничего нет. Впрочем, для этой среды есть уже собранная opencv, я думаю в случае с Visual Studio проблем будет меньше.
Effolkronium
Сборка библиотеки не зависит от IDE
Satus
Под студию всё просто:
Psychosynthesis
А версию самой студии какую посоветуете?
Satus
2015 или последнюю 2017 RC.
Effolkronium
Ещё лучше, в своём CMakeLists файле прописать пути, и генерировать уже полностью боевй Солюшн для студии