Введение

В данной статье будет описан способ сборки OpenCV из исходников с помощью cmake и Microsoft Visual Studio, и пример запуска своего проекта на cmake. Большая часть статьи является повторением официальной документации

Краткая инструкция
  1. git clone https://github.com/opencv/opencv.git

  2. cmake-gui

  3. configure

  4. Выбор путей и компилятора

  5. Выбор компонент

  6. configure

  7. generate

  8. build all (Debug | Release)

  9. build INSTALL (Debug | Release)

  10. Установить OpenCV_DIR на папку build

  11. Добавить в path для всех пользователей папку build/install/.../bin

Вспомогательное ПО

Для дальнейших действий Вам потребуется:

  • git

  • cmake

  • Microsoft Visual Studio

  • права администратора

  • Около 10Гб свободного места (может больше, в зависимости от задачи)

  • Около 2х часов времени на сборку

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

Установка

  1. Если Вы никогда не пытались ставить OpenCV, пропустите этот шаг. Убедитесь, что у Вас нет следов предыдущей версии OpenCV, в переменнных окружения нет OpenCV_DIR и подобных, а в переменная path не содержит ничего связанного с opencv

  2. Клонировать репозиторий:

    1. Для этого нужно создать папку (недалеко от корня диска), без пробелов и на английском языке.

    2. Открыть в ней консоль или git bash

    3. Прописать git clone.


    В этой статье далее будет использоваться путь С:\OpenCV\opencv

  3. Запустить cmake-gui

    Выбрать папку с клонированным репозиторием и папку, в который будет помещён сконфигурированный проект

    Лирическое отступление: cmake - система управления сборкой проекта. OpenCV - болшой проект, содержащий множество подпроектов, компонент. С помощью cmake мы определяем, какие именно подпроекты нам нужны, каким компилятором их собирать, под какую платформу.

  4. Нажать Configure и выбрать компилятор

  5. Выбрать необходимые компоненты

    Здесь лучше руководствоваться названием компонент, Вашими целями и здравым смыслом. По умолчанию будет предложена наиболее полная рабочая сборка, однако исходя из целей, многие вещи можно исключить. Например, есть блоки компонент, которые отвечают за интеграцию в java и python. Есть блоки компонент, содержащие нейросетевую обработку, они оканчиваются на "nn". Есть компоненты для открытия разных форматов изображений, соответственно, часть из них можно отключть. Однако, компоненты core, highgui, world, imgproc вероятнее всего понадобятся.

    Компоненты без группировки
    Компоненты без группировки
    Компоненты после группировки
    Компоненты после группировки

    .В оригинальной статье есть рекомендации по выбору компонент. Чтобы получить такое отображение, необходимо в cmake-gui поставить галочку grouped. Я отмечу лишь два из них:

    • BUILD_SHARED_LIBS -> включаем сборку динамических библиотек. Особенно нужно, если планируется несколько проектов с OpenCV.

    • BUILD_opencv_world -> объединение всех выбранных компонент в одну библиотеку opencv_world.

  6. Переконфигурировать проект: снова нажимаем Configure

  7. Если ошибок нет, то нажимаем Generate. Если есть, гуглим и играемся с компонентами, пока не исчезнут. После каждого изменения в компонентах - переконфигурируем.

  8. Открываем решение в Visual Studio (рядом с Generate - OpenProject, либо соответствующий sln в папке build)

  9. Выставляем конфигурацию Debug

  10. Собираем всё решение (Ctrl+Shift+B). Запаситесь терпением - у меня на этот шаг ушло около 40 минут.

  11. Выставляем конфигурацию Release и снова собираем всё (ещё 40 минут)

  12. Выделяем проект INSTALL. Через меню в правой кнопке мыши собираем только его. Опять в двух вариантах: Debug и Release. (на этот раз всё быстро)

    Лирическое отступление: По сути этот проект лишь перемещает ранее собранные библиотеки в одну папку с названием install внутри нашей сборки. Это поможет найти все библиотеки в одном месте.

    На этом непосредственно сборка библиотеки OpenCV закончена. Однако для запуска проекта нужно ещё немного подшаманить.

Подготовка к запуску

Создадим проект cmake с помощью Visual Studio. В качестве примера взят проект из того же репозитория. Для работы создайте в папке с проектом любую картинку и назовите её "starry_night.jpg"

CMakeLists.txt
# CMakeList.txt: проект CMake для Project; включите исходный код и определения,
# укажите здесь логику для конкретного проекта.
#
cmake_minimum_required (VERSION 3.8)

# Добавьте источник в исполняемый файл этого проекта.
add_executable (Project "main.cpp" "main.h")

# TODO: Добавьте тесты и целевые объекты, если это необходимо.
find_package(OpenCV REQUIRED)

target_link_libraries(Project ${OpenCV_LIBS})

main.cpp
//! [includes]
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

#include <iostream>

using namespace cv;
//! [includes]

int main()
{
    //! [imread]
    std::string image_path = samples::findFile("starry_night.jpg");
    Mat img = imread(image_path, IMREAD_COLOR);
    //! [imread]

    //! [empty]
    if(img.empty())
    {
        std::cout << "Could not read the image: " << image_path << std::endl;
        return 1;
    }
    //! [empty]

    //! [imshow]
    imshow("Display window", img);
    int k = waitKey(0); // Wait for a keystroke in the window
    //! [imshow]

    return 0;
}

Если сейчас запустить - начего не сработает, cmake не найдёт OpenCV. Чтобы это исправить, нужно завести переменные окружения

  1. Открыть консоль, прописать

setx OpenCV_DIR C:\OpenCV\build

Либо зайти в настройки windows, найти "переменные окружения", и вручную создать переменную OpenCV_DIR, указывающую на папку сборки.

  1. Добавить в переменную path для всех пользователей путь до динамических библиотек dll. Искать их следует внутри папки install, в моём случае это:

    C:\OpenCV\build\install\x64\vc16\bin

    Главная проверка: если открыть bin, в ней вы увидите множество dll, в том числе и opencv_world_4xx.dll, которую потребует компилятор.

После этого проект должен успешно собраться, и Вы увидите свою картинку. Или не увидите, если не положили её рядом к поекту. Но в любом случае, библиотека OpenCV прилинкована, спасибо за внимание!

Комментарии (5)


  1. Xadok
    00.00.0000 00:00
    +2

    Почему не взять пакетник Conan/vcpkg?


    1. MountainGoat
      00.00.0000 00:00

      То же самое сказать хотел. Через vcpkg устанавливается в один клик (и один час) из исходников, и можно свои правки внести в код тоже.


    1. Sazonov
      00.00.0000 00:00

      Вот так и не получилось у меня на винде собрать opencv с помощью vcpkg/clang-cl. Через msvc собирается отлично.


  1. fire64
    00.00.0000 00:00
    +4

    Достаточно редко кому-то нужно вручную компилировать OpenCV, в большинстве своем люди скачивают уже компилированные либы под нужную систему и компилятор.

    Но за статью, спасибо. Она пригодится не только для OpenCV. Основной посыл этой статьи, обучение работы с cmake.


    1. UndefinedRef
      00.00.0000 00:00

      При работе с OpenCV DNN сборка из исходников практически единственный вариант заставить это всё работать с Cuda Toolkit и CuDnn, в особенности с определенными версиями последних.