Создание и запуск примера HelloWorld в OpenCV может показаться трудным, особенно когда почти не работает руководство. Если вы некоторое время назад безуспешно пытались построить OpenCV, здесь вы найдете пошаговое руководство по созданию OpenCV 3.X и способ избавься от разочарования.

Здесь мы исправим следующую ошибку, которая возникает при выполнении некоторых программ OpenCV: Это приложение не запускалось, потому что оно не могло найти или загрузить плагин платформы Qt «windows» в «». Переустановка приложения может решить проблему.

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
    if( argc != 2)
    {
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }
    Mat image;
    image = imread(argv[1], IMREAD_COLOR); // Read the file
    if( image.empty() ) // Check for invalid input
    {
        cout << "Could not open or find the image" << std::endl ;
        return -1;
    }
    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
    imshow( "Display window", image ); // Show our image inside it.
    waitKey(0); // Wait for a keystroke in the window
    return 0;
}

Подготовка окружающей среды

ШАГ 0) Загрузите и установите компилятор C ++, устанавливающий пакеты Visual C ++ для Visual Studio 2017.

ШАГ 1) Загрузите CMake

Не забудьте добавить CMake в PATH во время установки (это не обязательно, но я рекомендую это, возможно, когда-нибудь вам понадобится написать консольные скрипты, использующие CMake). Я буду использовать двоичный дистрибутив CMake для Win32-x86. Скачать отсюда

ШАГ 2) Создайте каталог для загрузки пакета с исходным кодом OpenCV

ШАГ 3) Загрузите исходный код OpenCV из репозитория git.

Сборка QT

ШАГ 4) Загрузите зависимости для сборки и используйте модуль Highgui

В приведенном выше коде hello world мы видим включение для opencv2 / highgui, это модуль OpenCV (как opencv2 / core) действительно полезен для создания окон, отображения изображений (highhui отвечает за cv::namedWindow, cv::imgRead методы) в окнах и других полезных графических интерфейсах. Особенности. Этот модуль построен поверх QT, поэтому нам нужно скачать и собрать библиотеку QT.

Перейдите на главную страницу QT, затем щелкните Автономные установщики Qt ›Пакеты исходного кода и другие выпуски› Для пользователей Windows в виде одного zip-файла (626 МБ) .

ШАГ 5) Распакуйте его в красивый каталог с коротким именем, например D:/OpenCV/dep/qt/

ШАГ 6) Запустите командную строку Visual Studio

затем перейдите в извлеченный каталог. В моем случае

$> d:
$> cd D:\opencv-master\dep\qt-everywhere-opensource-src-5.9.1

ШАГ 8) настройте сборку QT

QT имеет много модулей, но для использования OpenCV Highgui нам просто нужно скомпилировать модуль qtbase, поэтому давайте настроим нашу сборку QT перед компиляцией с использованием Developer Command Prompt for VisualStudio.

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

> configure -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns

ШАГ 9) Выберите редакцию OpenSource QT

Затем примите предложение лицензии, набрав y, и войдите.

При возникновении ошибки конфигурации: запустите nmake confclean и снова запустите configure.

ШАГ 10) Соберите QT

Введите следующую команду для компиляции модуля qtbase.

> nmake

ШАГ 11) Установите переменные среды QT

Установите переменную среды с именем QTDIR, указывающую на вашу извлеченную папку QT.

setx -m QTDIR D:\opencv-master\dep\qt-everywhere-opensource-src-5.9.1

Установите другую переменную среды с именем QT_QPA_PLATFORM_PLUGIN_PATHpointing в папку qt\qtbase\plugins.

Когда вы выполняете программу OpenCV, которая использует некоторый метод highgui (namedWindow, showImage) и переменная среды QT_QPA_PLATFORM_PLUGIN_PATH не определена, вы получаете сообщение об ошибке: Это приложение не смогло выполнить start, потому что ему не удалось найти или загрузить подключаемый модуль платформы Qt «windows» в «». Эту проблему может решить переустановка приложения.

setx -m QT_QPA_PLATFORM_PLUGIN_PATH D:\opencv-master\dep\qt-everywhere-opensource-src-5.9.1\qtbase\plugins

Если вы не хотите использовать подсказку Visual Studio, вы также можете щелкнуть правой кнопкой мыши мой компьютер ›расширенная конфигурация системы› переменные среды, а в разделе «системные переменные» (не пользовательские переменные) нажмите «Создать» и установите соответствующие имя QTDIR и QT_QPA_PLATFORM_PLUGIN_PATH, указывающее на ваш извлеченный каталог QT и папку qtbase plugins.

ШАГ 12) Установите папку qtbase/bin в path

щелкните правой кнопкой мыши мой компьютер ›расширенная конфигурация системы› переменные средысистемные переменные› Путь

Сборка OpenCV

ШАГ 13) Настройка CMake для создания решения Visual Studio

Для некоторых пакетов CMake может не найти все необходимые файлы или каталоги. В этом случае CMake выдаст ошибку в своем окне вывода (расположенном в нижней части графического интерфейса пользователя) и установит для своих значений поля NOTFOUND константы.

А пока давайте проигнорируем это и сосредоточимся на установке флажка Сгруппированы под выбранным двоичным каталогом.

ШАГ 14) Снова настраиваем CMake для сборки решения Visual Studio!

Теперь вы должны увидеть список сгруппированных параметров, как показано ниже.

Ниже приводится базовая конфигурация CMake для генерации основных зависимостей, необходимых в коде hello world.

Также обратите внимание, что следующая конфигурация OpenCV сможет читать только изображения в формате .bmp.

Отметьте только следующие параметры: То, что здесь не упомянуто, следует снять (просто измените упомянутые группы).

WITH:
	WITH_QT

ENABLE:
	ENABLE_PRECOMPILED_HEADERS
	ENABLE_SOLUTION_FOLDERS

BUILD:	
	BUILD_opencv_core
	BUILD_ZLIB
	BUILD_opencv_highgui
	BUILD_opencv_imgcodecs
	BUILD_opencv_imgproc

Затем перейдите в папку build\vs_15_2017 и откройте OpenCV.sln, чтобы скомпилировать решение. (извините, мой vs2017 на испанском)

ШАГ 15) Группировка зависимостей вручную

Теперь, когда мы скомпилировали все необходимые модули OpenCV для запуска нашего приложения hello world, давайте поместим все зависимости в уникальный симпатичный каталог.

Я буду использовать C:\Users\user\Dropbox\AdditionalLibraries\OpenCV, там я создам папку для включений с именем include и папку для статических библиотек с именем lib.

В нашу include вставим следующие папки

  • D:\opencv-master\build\vs_15_2017\opencv2
  • D:\opencv-master\include\opencv2
  • D:\opencv-master\modules\core\include\opencv2
  • D:\opencv-master\modules\highgui\include\opencv2
  • D:\opencv-master\modules\imgcodecs\include\opencv2
  • D:\opencv-master\modules\imgproc\include\opencv2

В нашу lib папку вставим папку D:\opencv-master\build\vs_15_2017\lib\Debug.

В нашу папку lib я создам папку с именем 3rdParty и вставлю внутри папку, расположенную по адресу: D:\opencv-master\build\vs_15_2017\3rdparty\lib\Debug

Структура папок и файлов должна выглядеть примерно так:

- OpenCV\  // $(OPENCV_DIR)
	- include\  // $(OPENCV_DIR)include
		- opencv2\
			+ core\
			+ highgui\
			+ imgcodecs\
			+ imgproc\
			core.hpp
			cvconfig.hpp
			highgui.hpp
			imgcodecs.hpp
			imgproc.hpp
			opencv.hpp
			opencv_modules.hpp
	- lib\  // $(OPENCV_DIR)lib
		- Debug\  // $(OPENCV_DIR)lib\Debug
			opencv_core331d.lib
			opencv_core331d.pdb
			opencv_highgui331d.lib
			opencv_highgui331d.pdb
			opencv_imgcodecs331d.lib
			opencv_imgcodecs331d.pdb
			opencv_imgproc331d.lib
			opencv_imgproc331d.pdb
		- 3rdParty\
			- Debug\ // $(OPENCV_DIR)lib\3rdParty\Debug
				zlibd.lib
				zlibd.pdb

ШАГ 16) Создайте переменную среды OPENCV_DIR

Теперь давайте расскажем нашему решению Visual Studio, где находятся наши зависимости OpenCV. Рекомендуется создать переменную среды, указывающую на папку, в которой мы сгруппировали нашу библиотеку и включили файлы. в cmd напишите:

> setx -m OPENCV_DIR C:\Users\user\Dropbox\AdditionalLibraries\OpenCV

ШАГ 17) Создайте лист свойств opencv_debug в VisualStudio

Вы можете включить property manager переход к View > Other Windows > Property Manager, а затем создать лист свойств для режима отладки под названием opencv_debug

ШАГ 18) Настройте страницу свойств opencv_debug

Перейдите в каталоги VC ++ и добавьте путь к каталогам OpenCV include и lib, используя ранее созданную переменную среды OPENCV_DIR.

VC++ Directories
	Include Directories
		$(OPENCV_DIR)include
	Library Directories
		$(OPENCV_DIR)lib\Debug
		$(OPENCV_DIR)lib\3rdParty\Debug
		$(QTDIR)\qtbase\lib

Теперь укажите linker, какие библиотеки могутlink во время компиляции.

Далее следует точный список библиотек, которые необходимо связать для запуска программы hello world OpenCV.

Вы сможете читать только .bmp изображений, для большей функциональности прочтите ШАГ 19.

opencv_core331d.lib
opencv_highgui331d.lib
opencv_imgcodecs331d.lib
opencv_imgproc331d.lib
zlibd.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Testd.lib
Qt5Widgetsd.lib

ШАГ 19) Больше функциональности

Чтобы получить квази-полную сборку OpenCV, вы можете сгенерировать следующее решение OpenCV:

Скачайте зависимости: и вставьте их в свою opencv/dep созданную папку. Eigen (Eigen 3.3.4) OpenEXR openexr-2.2.1.tar.gz

Отметьте только следующие параметры: То, что здесь не упомянуто, следует снять (просто измените указанные группы).

WITH:
	WITH_1394
	WITH_DIRECTX
	WITH_DSSHOW
	WITH_EIGEN
	WITH_GSTREAMER
	WITH_IPP
	WITH_ITT
	WITH_JASPER
	WITH_JPEG
	WITH_LAPACK
	WITH_OPENEXR
	WITH_OPENMP
	WITH_PNG		
	WITH_QT
	WITH_TIFF

ENABLE:
	ENABLE_PRECOMPILED_HEADERS
	ENABLE_SOLUTION_FOLDERS
	
BUILD:	
	BUILD_IPP_IW
	BUILD_ITT
	BUILD_JASPER
	BUILD_JPEG
	BUILD_OPENEXR
	BUILD_PNG
	BUILD_TIFF
	BUILD_ZLIB
	BUILD_opencv_apps
	BUILD_opencv_calib3d
	BUILD_opencv_core
	BUILD_opencv_features2d
	BUILD_opencv_flann
	BUILD_opencv_highgui
	BUILD_opencv_imgcodecs
	BUILD_opencv_imgproc
	BUILD_opencv_ml
	BUILD_opencv_objdetect
	BUILD_opencv_photo
	BUILD_opencv_shape
	BUILD_opencv_stitching
	BUILD_opencv_superres
	BUILD_opencv_ts
	BUILD_opencv_video
	BUILD_opencv_videoio
	BUILD_opencv_videostab

ВЫВОД

Мы изучили, как сделать крошечную и почти полную компиляцию OpenCV для статических библиотек, что позволяет вам контролировать размер конечных двоичных файлов. В будущих руководствах мы должны попытаться установить новый OpenCV 4.x, который включает в себя множество удивительных функций, а также мы узнаем, как напрямую интегрировать программы OpenCV с известными игровыми движками, такими как Unity.

ОБЩИЕ ОШИБКИ:

  1. У вас установлено несколько Visual Studio: если у вас проблемы с типом.
No CMAKE_C_COMPILER could be found.
No CMAKE_CXX_COMPILER could be found.

И вы уверены, что у вас есть компиляторы c / cpp, тогда вам стоит прочитать этот великолепный ответ на StackOverflow.

В моем случае у меня были установлены Visual Studio 14 2015 и Visual Studio 15 2017, поэтому, когда я изменил генератор CMake с VS2015 на VS2017, проблема была решена.

2. Не могу прочитать данные драйвера Intel ICD OpenGL: Эта ошибка связана с графическими драйверами для встроенной видеокарты, в моем случае мне нужно перейти на более старую версию установленных драйверов.

Мой исходный установленный драйвер был: DELL 21.20.16.4550, Моя встроенная видеокарта - Intel HD Graphics 530.

ДОПОЛНИТЕЛЬНЫЕ УПРАЖНЕНИЯ:

Дайте мне знать ваши ответы и идеи в поле для комментариев.

  • Не могли бы вы понять, как создавать библиотеки релизов OpenCV?
  • Наша текущая сборка QT может быть достаточной для сборки OpenCV x64?
  • Используйте проект INSTALL, чтобы не находить вручную все сгенерированные двоичные файлы и их файлы заголовков.