OpenCV 3.4.0 소스 코드를 Visual Studio 2017에서 빌드를 하면 특별한 에러 없이 잘 빌드가 됩니다. 그러나 Visual Studio 2013에서 OpenCV 3.4.0 소스 코드를 빌드하면 에러가 발생합니다. 일단 기본적인 빌드 설정은 아래와 같습니다.
Visual Studio 12 2013 x64
BUILD_opencv_python3 선택 해제
BUILD_opencv_world 선택
opencv_contrib 소스 코드 포함
WITH_CUDA 선택 해제
위와 같이 설정한 후 Visual Studio 2013으로 빌드할 때 나오는 에러 메시지 중 일부를 나열하면 다음과 같습니다.
위와 같이 <opencv2/core.hpp> 파일 대신 "../precomp.hpp" 파일을 #include 하는 형태로 변경하면 됩니다.
그러나 darknet_io.cpp 파일을 바꾸더라도 face_alignmentimpl.hpp 파일에서도 비슷한 에러가 발생합니다. face 모듈은 opencv_contrib 쪽 소스에 있고, 여기에는 precomp.hpp 파일이 없으므로 face_alignmentimpl.hpp 파일을 열어서 아래와 같이 수정합니다.
위와 같이 수정하고 빌드하면 opencv_world340.dll 파일을 정상적으로 빌드가 됩니다.
추가로 opencv 샘플 프로젝트를 빌드할 때 dnn 아래쪽 샘플 프로젝트에서도 빌드 에러가 발생합니다. 이때는 torch_enet.cpp 파일에서 에러가 발생하는데요, 이 파일을 열어서 아래와 같이 수정하면 에러가 사라집니다.
위 수정 사항에서 하나는 "opencv2/core/softfloat.hpp" 라고 쓰고 하나는 <opencv2/core/softfloat.hpp> 라고 입력을 했는데요, 어차피 컴파일러가 해석하는 것은 동일하고 다만 주위 소스 코드 형식을 맞쳐준 것이라고 보면 됩니다.
3줄 요약:
darknet_io.cpp 파일에서 #include <opencv2/core.hpp> 문장을 #include "../precomp.hpp" 로 수정.
face_alignmentimpl.hpp 파일에 #include "opencv2/core/softfloat.hpp" 문장 추가
torch_enet.cpp 파일에 #include <opencv2/core/softfloat.hpp> 문장 추가
OpenCV는 Open Source Computer Vision Library이고, 2500개가 넘는 최신 컴퓨터 비전 알고리즘과 머신 러닝 알고리즘을 지원합니다. OpenCV는 BSD 라이선스를 따르고 있기 때문에 학계 연구용이나 상업적인 용도로 자유롭게 사용할 수 있습니다. 2017년 6월 현재, OpenCV 최신 버전은 3.2이고, http://www.opencv.org/ 웹사이트에서 Windows용 설치 버전을 다운받을 수 있습니다. 그러나 OpenCV 3.2 Windows 설치 버전은 Visual Studio 2015 버전으로 빌드되어 있는 DLL, LIB 파일만을 제공하기 때문에 Visual Studio 최신 버전인 Visual Studio 2017에서 사용하려면 소스 코드를 직접 빌드하여 사용하는 것이 좋습니다.
OpenCV를 처음 접하는 분들에게 당부드리는 말씀
OpenCV는 2006년 처음 1.0 버전이 나온 후
2015년에 OpenCV 3.0이 발표되었습니다. 버전이 올라가면서 IplImage 구조체를 사용하는 C언어 인터페이스에서 Mat
클래스를 사용하는 C++ 인터페이스로 발전하였고, 내부적으로 많은 구조적인 변화가 생겼습니다. 그럼에도 아직까지도 OpenCV
1.x 버전의 문법으로 되어 있는 소스 코드가 인터넷에 많이 돌아다니고 있는 현실인데요, 이제 새로 OpenCV를 배우는 분들은
과거의 문법과 구조를 사용하지 마시고 최신 OpenCV 3.x 버전에 맞는 문법을 배우시라고 권해드리고 싶습니다.
OpenCV 라이브러리를 설치하는 과정은 다음 순서를 따릅니다.
Visual Studio 설치하기
CMake 설치하기
OpenCV 소스 코드 다운로드
CMake 프로그램으로 솔루션 파일, 프로젝트 파일 생성하기
Visual Studio에서 OpenCV 빌드하기
OpenCV 설치하기
Visual Studio 설치하기
2017년 현재, Visual Studio 최신 버전은 Visual Studio 2017입니다. https://www.visualstudio.com/ 사이트에 접속하면 Visual Studio 2017 Community Edition을 무료로 다운로드 받아 설치할 수 있습니다. Visual Studio를 설치하는 방법은 자세히 설명하지 않으며, 다만 설치시 "C++를 사용한 데스크톱 개발" 항목은 반드시 선택하여 설치해야 합니다.
CMake 설치하기
CMake 프로그램은 다양한 운영 체제 또는 프로그래밍 개발 환경에 적합한 Make 파일(또는 프로젝트, 솔루션 파일)을 생성하는 유틸리티입니다. 즉, OpenCV 소스 코드로부터 Visual Studio 2017용 솔루션 파일(*.sln)과 프로젝트 파일(*.vcxproj) 파일을 생성해주는 프로그램이라고 생각하시면 됩니다. CMake 프로그램은 https://cmake.org/download/ 사이트에서 다운로드 받을 수 있으며, 3.8.0 이상 버전을 사용하시면 됩니다. CMake 설치는 크게 복잡하지 않으며 자세한 설명은 생략합니다.
OpenCV 소스 코드 다운로드
OpenCV 최신 소스 코드는 https://github.com/opencv/opencv 에서 다운받을 수 있습니다. 다만 이 글에서 사용할 소스 코드는 OpenCV 3.2 버전으로 배포된 소스 코드입니다. OpenCV 3.2 버전의 소스 코드는 OpenCV 3.2 설치 버전에도 들어있지만, 아래 링크에서 순수한 소스 코드만 다운받을 수 있습니다. Windows 환경이니 편리하게 Source code (zip) 파일을 선택하여 다운로드 하시면 됩니다.
이제부터 본격적인 소스 코드 빌드를 위한 작업을 설명합니다. 저는 C 드라이브 아래 opencv 라는 폴더를 만들고, 그 아래에서 소스 코드 압축을 해제하고 빌드 작업을 수행할 것입니다. 그러므로 C:\opencv\ 폴더를 생성하고, 그 아래에 opencv-3.2.0.zip 파일의 압축을 해제합니다. 그러면 C:\opencv\opencv-3.2.0 폴더 아래에 여러 개의 폴더와 파일이 생성됩니다. 그리고 실제 빌드 작업은 C:\opencv\mybuild 라는 이름의 폴더를 만들고, 그 안에서 DLL 파일과 LIB 파일을 생성할 것입니다. 즉, 우선 디렉토리 구조를 아래 그림처럼 생성합니다. (일단 opencv_contrib-3.2.0 폴더는 신경쓰지 않아도 됩니다.)
이제 CMake (cmake-gui) 프로그램을 실행합니다. CMake 프로그램에서 Where is the source code: 에는 C:\opencv\opencv-3.2.0 폴더를 선택하고, Where to build the binaries: 항목은 C:\opencv\mybuild 폴더를 선택합니다. 아래 그림처럼 선택을 하였으면 왼쪽 아래 [Configure] 버튼을 클릭합니다.
[Configure] 버튼을 클릭하면 아래와 같은 창이 나오는데요, 상단의 콤보 박스 항목 중에서 "Visual Studio 15 2017 Win64"를 선택합니다. Visual Studio 2017 버전을 사용할 것이고, 64비트로 컴파일하고 빌드할 것입니다. 만약 사용하고 있는 Windows 운영체제가 아직도 32비트 버전이라면 64비트 버전으로 갈아타는 것을 추천합니다. 그 아래 옵션은 기본값을 그대로 사용하기로 하고 [Finish] 버튼을 클릭합니다.
CMake 프로그램은 현재 PC의 설정을 확인하고, 추가적으로 빌드에 필요한 파일을 인터넷을 통해 다운로드 받습니다. 얼마간의 시간이 흐르면 아래와 같은 그림이 나타납니다. 가운데 영역이 빨간색 배경으로 나온 것이 왠지 살짝 섬뜩한데요, 여기서 OpenCV 빌드를 위한 옵션을 선택할 수 있습니다. 이 과정이 OpenCV를 설치하는 과정 중에서 가장 중요한 부분입니다. 다소 생소해보일수도 있지만 주의깊게 잘 생각해서 옵션을 선택해야 합니다.
참고로 제 PC에서 나타난 Configuration message는 아래와 같습니다.
The CXX compiler identification is MSVC 19.10.25019.0 The C compiler identification is MSVC 19.10.25019.0 Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe -- works Detecting CXX compiler ABI info Detecting CXX compiler ABI info - done Detecting CXX compile features Detecting CXX compile features - done Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.10.25017/bin/HostX86/x64/cl.exe -- works Detecting C compiler ABI info Detecting C compiler ABI info - done Performing Test HAVE_CXX_FSIGNED_CHAR Performing Test HAVE_CXX_FSIGNED_CHAR - Failed Performing Test HAVE_C_FSIGNED_CHAR Performing Test HAVE_C_FSIGNED_CHAR - Failed FP16: Compiler support is available Check if the system is big endian Searching 16 bit integer Looking for sys/types.h Looking for sys/types.h - found Looking for stdint.h Looking for stdint.h - found Looking for stddef.h Looking for stddef.h - found Check size of unsigned short Check size of unsigned short - done Using unsigned short Check if the system is big endian - little endian Looking for fseeko Looking for fseeko - not found Looking for unistd.h Looking for unistd.h - not found Check size of off64_t Check size of off64_t - failed Looking for assert.h Looking for assert.h - found Looking for fcntl.h Looking for fcntl.h - found Looking for io.h Looking for io.h - found Looking for jbg_newlen Looking for jbg_newlen - not found Looking for mmap Looking for mmap - not found Looking for search.h Looking for search.h - found Looking for string.h Looking for string.h - found Looking for unistd.h Looking for unistd.h - not found ICV: Unpacking ippicv_windows_20151201.zip to C:/opencv/mybuild/3rdparty/ippicv... ICV: Package successfully downloaded found IPP (ICV version): 9.0.1 [9.0.1] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win CUDA detected: 8.0 CUDA NVCC target flags: -gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-D_FORCE_INLINES Could not find OpenBLAS include. Turning OpenBLAS_FOUND off Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) Found PythonInterp: C:/ProgramData/Anaconda3/python.exe (found suitable version "3.6", minimum required is "2.7") Found PythonInterp: C:/ProgramData/Anaconda3/python.exe (found suitable version "3.6", minimum required is "3.4") Found PythonLibs: C:/ProgramData/Anaconda3/libs/python36.lib (found suitable exact version "3.6.0") Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) Could NOT find Matlab (missing: MATLAB_MEX_SCRIPT MATLAB_INCLUDE_DIRS MATLAB_ROOT_DIR MATLAB_LIBRARIES MATLAB_LIBRARY_DIRS MATLAB_MEXEXT MATLAB_ARCH MATLAB_BIN) VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file
General configuration for OpenCV 3.2.0 ===================================== Version control: unknown
Video I/O: Video for Windows: YES DC1394 1.x: NO DC1394 2.x: NO FFMPEG: YES (prebuilt binaries) avcodec: YES (ver 57.64.101) avformat: YES (ver 57.56.100) avutil: YES (ver 55.34.100) swscale: YES (ver 4.2.100) avresample: YES (ver 3.1.0) GStreamer: NO OpenNI: NO OpenNI PrimeSensor Modules: NO OpenNI2: NO PvAPI: NO GigEVisionSDK: NO DirectShow: YES Media Foundation: NO XIMEA: NO Intel PerC: NO
Parallel framework: Concurrency
Other third-party libraries: Use IPP: 9.0.1 [9.0.1] at: C:/opencv/mybuild/3rdparty/ippicv/ippicv_win Use IPP Async: NO Use Lapack: NO Use Eigen: NO Use Cuda: YES (ver 8.0) Use OpenCL: YES Use OpenVX: NO Use custom HAL: NO
NVIDIA CUDA Use CUFFT: YES Use CUBLAS: NO USE NVCUVID: NO NVIDIA GPU arch: 20 30 35 37 50 52 60 61 NVIDIA PTX archs: Use fast math: NO
OpenCL: <Dynamic loading of OpenCL library> Include path: C:/opencv/opencv-3.2.0/3rdparty/include/opencl/1.2 Use AMDFFT: NO Use AMDBLAS: NO
Java: ant: NO JNI: NO Java wrappers: NO Java tests: NO
Matlab: Matlab not found or implicitly disabled
Documentation: Doxygen: NO
Tests and samples: Tests: YES Performance tests: YES C/C++ Examples: NO
Install path: C:/opencv/mybuild/install
cvconfig.h is in: C:/opencv/mybuild -----------------------------------------------------------------
Configuring done
저는 기본으로 선택된 옵션 중에서 아래 몇가지 항목을 추가로 설정했습니다.
BUILD_EXAMPLES: 선택
BUILD_opencv_world: 선택
WITH_CUDA: 선택 해제 (VS2017 지원 안함)
WITH_OPENGL: 선택
BUILD_opencv_world 옵션을 선택하면 opencv_core320.dll, opencv_imgproc320.dll, opencv_highgui320.dll 같이 여러 개로 생성되는 DLL 파일들이 하나의 opencv_world320.dll 파일로 합쳐져서 빌드가 됩니다. 그러므로 소스 코드를 작성할 때에도 하나의 opencv_world320.lib 파일만 링크해서 사용하면 되기 때문에 편리합니다. 다만 효율성과 용량의 문제를 고려한다면 BUILD_opencv_world 옵션을 사용하지 않는 것이 좋은 선택일 겁니다.
일단의 선택을 마치면 다시 [Configure] 버튼을 클릭합니다. 그러면 CMake 중앙의 빨간색 배경의 옵션들이 모두 흰색 배경으로 변경됩니다. 이제 [Generate] 버튼을 클릭하면 C:\opencv\mybuild 폴더에 OpenCV.sln 파일이 생성됩니다.
Visual Studio에서 OpenCV 빌드하기
Visual Studio 2017 Community Edition을 실행하여 OpenCV.sln 솔루션 파일을 오픈합니다. 또는 C:\opencv\mybuild 폴더에서 OpenCV.sln 파일을 더블클릭하면 Visual Studio 2017이 실행됩니다. 그러면 아래 그림같은 화면이 나타납니다.
그리고 위에 그림처럼 [빌드] -> [솔루션 빌드] 메뉴 항목을 선택하면 OpenCV 소스 코드를 빌드하기 시작합니다. 이 작업은 PC 사양에 따라 조금 다르겠지만 대략 20분 내외의 시간이 소요됩니다.
빌드 작업이 끝나면 아래 그림의 하단 출력창처럼 빌드: 성공 202, 실패 0, 최신 0, 생략 7 같은 메시지가 나타납니다. 성공 프로젝트 개수는 CMake 옵션을 어떻게 주었느냐에 따라 다를 수 있습니다. 다만 실패 작업이 너무 많이 나타난다면 opencv_world320d.lib 빌드가 잘 되었는지를 확인하고, 문제가 있다면 CMake 작업부터 다시 시도하기 바랍니다.
OpenCV 설치하기
Visual Studio에서 빌드가 정상적으로 완료가 되었다고해서 완전히 끝난 것이 아닙니다. OpenCV를 빌드하면 DLL과 LIB 파일들이 생성되는데, 이 파일들을 한 곳에 모아서 작업하는 것이 좋습니다. 특히 OpenCV에서 사용하는 헤더파일은 C:\opencv\opencv-3.2.0\modules 폴더 아래에 산재해있기 때문에 이 파일들을 정해진 폴더에 옮기는 작업을 수행해야 합니다.
이 작업은 OpenCV 솔루션 중에서 INSTALL이라는 이름의 프로젝트를 이용하여 수행할 수 있습니다. 아래 그림처럼 현재 열려있는 프로젝트 중에서 INSTALL 이라는 이름의 프로젝트를 마우스로 선택하고, 여기서 마우스 오른쪽 버튼을 클릭하여 [빌드] 메뉴를 선택합니다.
위 작업이 완료되면 c:\opencv\mybuild\install\ 폴더 아래에 OpenCV 관련 헤더 파일, DLL 파일, LIB 파일들이 모여지게 됩니다. DLL 파일은 c:\opencv\mybuild\install\x64\vc15\bin\ 폴더로 복사되고, LIB 파일은 c:\opencv\mybuild\install\x64\vc15\lib\ 폴더로 복사됩니다. 헤더 파일은 c:\opencv\mybuild\install\include\ 폴더 아래로 모두 모이게 되는데, 탐색기로 이 위치를 살펴보면 아래와 같습니다.
이제 OpenCV를 Visual Studio에서 Debug 모드로 빌드하는 작업이 완료되었습니다. 이 작업을 이제 Release 모드로도 똑같이 반복합니다. 아래 그림처럼 현재 구성을 Debug 모드에서 Release 모드로 변경하고, 다시 [빌드] -> [솔루션 빌드] 메뉴를 선택합니다. 그리고 빌드가 완료되면 다시 INSTALL 프로젝트를 빌드하면 됩니다.