본문 바로가기

언어/OpenCV

Visual Studio 2017, Python 3용으로 OpenCV 3.4.2 빌드 하기 (opencv_contrib 포함)

출처: http://webnautes.tistory.com/1036


OpenCV's extra modules( opencv_contrib )을 포함하여 OpenCV 3.4.2 라이브러리를 Visual Studio 2017와 Python 3.7에서 사용하기 위해 컴파일한 과정을 다루고 있습니다.


윈도우즈용으로 미리 빌드된 OpenCV 라이브러리에는 extra 모듈(opencv_contrib)이 빠져있습니다.

SURF, SIFT(xfeatures2d) 등의 OpenCV 모듈을 사용하려면 https://github.com/opencv/opencv_contrib에 있는 소스 코드를  포함시켜서 다시 컴파일 해주어야 합니다.


빌드 환경은 다음과 같습니다.


  • Windows 10 Pro 64bit

  • Visual Studio Community 2017

  • Python 3.7

  • OpenCV 3.4.2


오류나 잘못된 점이 발견되면 알려주세요..



1. CMake 설정으로 Visual Studio 솔루션 생성

   1.1. CMake 설치

   1.2. OpenCV 소스코드 다운로드

   1.3. Eigen 라이브러리 다운로드

   1.4. 파이썬 설치

   1.5. CMake로 OpenCV 빌드 옵션 설정

   1.6. Visual Studio 솔루션 생성 및 빌드


2. 빌드된 OpenCV 라이브러리 테스트

   

3. 참고한 곳





2016. 9. 6    최초 작성

2018. 1. 29  OpenCV 3.4 반영

2018. 7. 10 OpenCV 3.4.2 반영

                   C++ / Python용 라이브러리 한번에 컴파일해서 사용하는 방법 추가




1. CMake 설정으로 Visual Studio 솔루션 생성

1.1. CMake 설치

1. https://cmake.org/download 에서 윈도우용 CMake를 다운로드 받아 설치합니다.  


글 작성 시점에서 최근 릴리즈된 버전(Latest Release)은 3.11.4 입니다.

바이너리로 배포되는 x64 설치 파일을 다운로드 받습니다.




2. GUI 환경에서 진행하기 위해 Create CMake Desktop Icon을 체크하는 것 외에는 옵션 변경 없이 설치를 진행합니다.





1.2. OpenCV 소스코드 다운로드


임시 폴더(여기선 C:\opencv-source)를 만들고 아래 두 곳에서 소스 코드를 다운로드 받아 압축을 풀어 복사해줍니다.

https://github.com/opencv/opencv/releases




https://github.com/opencv/opencv_contrib/releases




현재 C:\opencv-source 폴더에 다음 2 개의 폴더가 존재합니다.





1.3. Eigen 라이브러리 다운로드

Eigen 라이브러리를 OpenCV에서는 선형대수, 매트릭스, 벡터 연산등을 빠르게 처리하는데 사용합니다.



http://eigen.tuxfamily.org 에서 stable 버전을 다운로드 받았습니다.




압축을 풀은 후, 폴더 이름을 간단하게 바꾸어서 C:\opencv-source에 복사해둡니다.  





1.4. Python 3 및 numpy 설치  


아래 포스팅을 참고하여 Python 3을 설치합니다.



Windows에 Python 설치하는 방법

http://webnautes.tistory.com/1202




명령 프롬프트에서 다음 명령으로 numpy를 설치합니다.


pip3 install numpy


C:\Users\webnautes>pip3 install numpy
Collecting numpy
 Downloading https://files.pythonhosted.org/packages/94/80/c49b01d8632f58aef25fbe9a05be56339b7bb94b1eefd4f5d8c087d002b5/numpy-1.14.5-cp37-none-win_amd64.whl (13.4MB)
   100% |████████████████████████████████| 13.4MB 1.1MB/s
Installing collected packages: numpy
Successfully installed numpy-1.14.5

C:\Users\webnautes>




1.5. CMake로 OpenCV 빌드 옵션 설정


1. cmake-gui를 실행한 후..




2. cmake-gui를 사용하여 OpenCV 컴파일 설정을 해주려면 다음 2가지를 설정해줘야 합니다.

주의할 점은 아래처럼 윈도우에서 사용하는 \ 대신에 /로 바꾸어서 경로를 입력해야합니다.


Where is the source code
컴파일할 OpenCV 소스 코드의 위치입니다. Extra 모듈(opencv_contrib)위치는 나중에 옵션으로 추가해줍니다.

C:/opencv-source/opencv-3.4.2


Where to build the binaries
cmake를 실행시 결과물과 Visual Studio로 컴파일시 결과물이 저장되는 위치를 다음처럼 지정해줘야 합니다.
빌드된 최종 결과물들을 배포를 위해 한곳에 모아주는(설치) 위치는 나중에 옵션으로 추가해줍니다.

C:/opencv-source/build  



앞에서 설명한대로 OpenCV 소스 위치와 빌드 결과물이 저장될 위치를 입력하고 Configure 버튼을 클릭합니다.

입력란 옆에 보이는 Browse 버튼을 클릭하여 선택해도 됩니다.




컴파일 된 결과물이 저장될 위치에 해당되는 폴더가 생성되어 있지 않는 경우에는 새로 생성할지 물어봅니다. Yes를 클릭합니다.




3. OpenCV 소스코드를 컴파일할 때, 사용할 컴파일러를 선택하고 Finish 버튼을 클릭합니다.

포스팅에서는 Visual Studio 15 2017 Win64를 선택하고 있습니다.


이후 과정에서 선택한 컴파일러를 위한 프로젝트를 생성하기 위해 필요한 작업입니다.



4. 바로 cmake가 실행되며 아래쪽에 진행결과를 보여줍니다.

에러 없이 완료되면 마지막 줄에  Configuring done이 출력됩니다.


옵션 변경 후 Configure 버튼을 클릭하면 cmake가 다시 실행되며 새로 추가된 옵션이 있을 경우 빨간색 배경 위에 표시해줍니다.





진행하다가 문제 생겼을 경우 컴파일된 결과물이 저장될 위치(C:/opencv-source/build)로 지정된 경로의 폴더 및 파일을 지워주세요..


그리고 cmake-gui를 실행하여 메뉴에서 File > Delete cache를 선택한 후,  다시 2번부터 다시 진행하면 됩니다.




하단에 있는 로그창에서 우분투처럼 실행결과를 확인할 수 있습니다.



5. Search 검색란에 python을 입력하면 Python 관련 옵션들만 보입니다.

캡처화면에는 Python 3.7 관련 경로가 입력되어 있습니다. 별문제 없는 한 cmake에서 configire 버튼 클릭 전에 설치해둔 python과 numpy 관련 경로들이 자동으로 감지됩니다.  





6. 최소 cmake 실행 결과 cpu 관련 테스트를 통해 다음과 같이 최적화 옵션이 자동으로 입력됩니다.

( 최적화를 위한 글 https://github.com/opencv/opencv/wiki/CPU-optimizations-build-options )




성능 향상 관련 다음 옵션들이 디폴트로 선택되어 있습니다.






7. EIGEN_INCLUDE_PATH 옵션에 다운받아둔 EIGEN 경로를 입력합니다.


C:/opencv-source/eigen




8. 라이브러리 빌드 시간 단축을 위해 BUILD_PREF_TESTS, BUILD__TESTS 체크 해제합니다.





9. Extra 모듈(opencv_contrib)의 위치를 설정해줍니다.


C:/opencv-source/opencv_contrib-3.4.2/modules





10. OPENCV_ENABLE_NONFREE를 체크합니다.



컴파일시 C:\opencv-source\opencv_contrib-3.4.2\modules\xfeatures2d\include\opencv2\xfeatures2d.hpp 대신에 C:\opencv-source\opencv_contrib-3.4.2\modules\xfeatures2d\include\opencv2\xfeatures2d\nonfree.hpp를 사용하게 됩니다.




11. 빌드 결과물 최종 설치 위치를 C:/opencv-3.4.2/build로 지정해줍니다.

기존에 사용중인 폴더가 아닌지 확인해보세요


INSTALL_C_EXAMPLES와 INSTALL_PYTHON_EXAMPLES옵션을 체크하여 예제 파일들도 위에 지정한 경로로 복사되도록 합니다.  





12. 사용하지 않는 다음 옵션들을 체크 해제합니다.

NVidia 그래픽카드를 사용하지 않는 경우 CUDA관련 옵션을 제거합니다.


BUILD_DOCS, BUILD_JAVA, BUILD_PACKAGE, BUILD_opencv_ts

WITH_1394, WITH_CUDA, WITH_CUBLAS, WITH_CUFFT, WITH_NVCUVID, WITH_GSTREAMER,

WITH_LAPACK, WITH_MATLAB, WITH_VTK




13. 변경한 옵션들을 적용하기 위해서  Configure 버튼을 클릭해줍니다.




14. 새로 추가된 옵션들이 붉은색으로 표시됩니다. 여기에선 이 부분에 대한 추가 설정안하고 진행합니다.


앞에서 추가한 opencv_contrib 모듈 경로에 의해서 인식된 Extra 모듈을 빌드할지 여부를 결정하는 옵션들이 보입니다.



그외에 추가로 필요한 라이브러리들을 위한 옵션들이 보입니다.





15. BUILD_opencv_word 옵션을 체크합니다. OpenCV 바이너리 배포판처럼 World 모듈  파일 하나만 링크해도 되게 파일을 생성해줍니다.





16.  다시 변경한 옵션들을 적용하기 위해서  Configure 버튼을 클릭해줍니다.




17. 최종 설정 완료된 결과입니다.




General configuration for OpenCV 3.4.2 =====================================
 Version control:               unknown

 Extra modules:
   Location (extra):            C:/opencv-source/opencv_contrib-3.4.2/modules
   Version control (extra):     unknown

 Platform:
   Timestamp:                   2018-07-10T07:29:20Z
   Host:                        Windows 10.0.17134 AMD64
   CMake:                       3.11.4
   CMake generator:             Visual Studio 15 2017 Win64
   CMake build tool:            C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/MSBuild.exe
   MSVC:                        1914

 CPU/HW features:
   Baseline:                    SSE SSE2 SSE3
     requested:                 SSE3
   Dispatched code generation:  SSE4_1 SSE4_2 FP16 AVX AVX2
     requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
     SSE4_1 (3 files):          + SSSE3 SSE4_1
     SSE4_2 (1 files):          + SSSE3 SSE4_1 POPCNT SSE4_2
     FP16 (1 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
     AVX (5 files):             + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
     AVX2 (9 files):            + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2

 C/C++:
   Built as dynamic libs?:      YES
   C++11:                       YES
   C++ Compiler:                C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.14.26428/bin/Hostx86/x64/cl.exe  (ver 19.14.26431.0)
   C++ flags (Release):         /DWIN32 /D_WINDOWS /W4 /GR /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi      /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /MP4 /MD /O2 /Ob2 /DNDEBUG
   C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4 /GR /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi      /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589 /MP4 /MDd /Zi /Ob0 /Od /RTC1
   C Compiler:                  C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.14.26428/bin/Hostx86/x64/cl.exe
   C flags (Release):           /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi        /MP4 /MD /O2 /Ob2 /DNDEBUG
   C flags (Debug):             /DWIN32 /D_WINDOWS /W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi        /MP4 /MDd /Zi /Ob0 /Od /RTC1
   Linker flags (Release):      /machine:x64 /INCREMENTAL:NO
   Linker flags (Debug):        /machine:x64 /debug /INCREMENTAL
   ccache:                      NO
   Precompiled headers:         NO
   Extra dependencies:
   3rdparty dependencies:

python3 모듈도 빌드된 모듈에 포함되어 있습니다.
 OpenCV modules:
   To be built:                 aruco bgsegm bioinspired calib3d ccalib core datasets dnn dnn_objdetect dpm face features2d flann fuzzy hfs highgui img_hash imgcodecs imgproc java_bindings_generator line_descriptor ml objdetect optflow phase_unwrapping photo plot python3 python_bindings_generator reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking video videoio videostab world xfeatures2d ximgproc xobjdetect xphoto
   Disabled:                    js
   Disabled by dependency:      -
   Unavailable:                 cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv freetype hdf java matlab ovis python2 python2 sfm ts viz
   Applications:                apps
   Documentation:               NO
   Non-free algorithms:         YES

 Windows RT support:            NO

 GUI:
   Win32 UI:                    YES

 Media I/O:
   ZLib:                        build (ver 1.2.11)
   JPEG:                        build-libjpeg-turbo (ver 1.5.3-62)
   WEBP:                        build (ver encoder: 0x020e)
   PNG:                         build (ver 1.6.34)
   TIFF:                        build (ver 42 - 4.0.9)
   JPEG 2000:                   build (ver 1.900.1)
   OpenEXR:                     build (ver 1.7.1)
   HDR:                         YES
   SUNRASTER:                   YES
   PXM:                         YES

 Video I/O:
   Video for Windows:           YES
   FFMPEG:                      YES (prebuilt binaries)
     avcodec:                   YES (ver 57.107.100)
     avformat:                  YES (ver 57.83.100)
     avutil:                    YES (ver 55.78.100)
     swscale:                   YES (ver 4.8.100)
     avresample:                YES (ver 3.7.0)
   DirectShow:                  YES
   Media Foundation:            YES

 Parallel framework:            Concurrency

 Trace:                         YES (with Intel ITT)

 Other third-party libraries:
   Intel IPP:                   2017.0.3 [2017.0.3]
          at:           C:/opencv-source/build/3rdparty/ippicv/ippicv_win
   Intel IPP IW:                sources (2017.0.3)
             at:     C:/opencv-source/build/3rdparty/ippicv/ippiw_win
   Eigen:                       YES (ver 3.3.4)
   Custom HAL:                  NO
   Protobuf:                    build (3.5.1)

 OpenCL:                        YES (no extra features)
   Include path:                C:/opencv-source/opencv-3.4.2/3rdparty/include/opencl/1.2
   Link libraries:              Dynamic load

설치되어 있는 파이썬3 관련 경로들이 자동으로 감지됩니다.
 Python 3:
   Interpreter:                 C:/Users/webnautes/AppData/Local/Programs/Python/Python37/python.exe (ver 3.7)
   Libraries:                   C:/Users/webnautes/AppData/Local/Programs/Python/Python37/libs/python37.lib (ver 3.7.0)
   numpy:                       C:/Users/webnautes/AppData/Local/Programs/Python/Python37/lib/site-packages/numpy/core/include (ver 1.14.5)
   packages path:               C:/Users/webnautes/AppData/Local/Programs/Python/Python37/Lib/site-packages

 Python (for build):            C:/Users/webnautes/AppData/Local/Programs/Python/Python37/python.exe

최종 컴파일 결과물이 복사되는 경로입니다.
 Install to:                    C:/opencv-3.4.2/build
-----------------------------------------------------------------

Configuring done





1.6. Visual Studio 솔루션 생성 및 빌드

1. Generate 버튼을 클릭하면 Generating done 메시지가 출력되면서 Open Project 버튼이 활성화됩니다.





2. cmake-gui의 Open Project 버튼을 클릭하거나 C:\opencv-source\build에 생성되어 있는 OpenCV.sln을 더블클릭하여 컴파일 진행을 합니다.


OpenCV 솔루션에 35개의 프로젝트가 포함되어 있습니다.

앞에서 선택한 옵션따라  프로젝트 개수는 다를 수 있습니다.





3. 툴바에서 솔루션 구성을 Release로 변경합니다.





4. 솔루션 탐색기 CMakeTargets 하위 항목인,  INSTALL 위에서 마우스 우클릭하고 메뉴에서 빌드를 선택합니다. 빌드 및 설치가 이어서 진행됩니다.



문제 없으면 다음과 같은 메시지가 보입니다.





5. 완료되면 툴바에서 솔루션 구성을 Debug로 변경하고 4번을 반복합니다.


실패가 하나 보이는데




다음처럼 디버그용 python 라이브러리 파일이 없어서 발생합니다.

C++ 디버그용 라이브러리를 사용하는데에는 문제 없지만 파이썬 디버그용 라이브러리를 생성되지 않은 상태입니다.   


25>LINK : fatal error LNK1104: 'python37_d.lib' 파일을 열 수 없습니다.
25>"opencv_python3.vcxproj" 프로젝트를 빌드했습니다. - 실패




6. 빌드 완료 후, 확인된 빌드된 주요 OpenCV 라이브러리 파일들의 설치 위치입니다.



OpenCV 헤더파일(.hpp, .h)
C:\opencv-3.4.2\build\include

Visual Studio 2017용 OpenCV Debug/Release 라이브러리 파일(.lib)
C:\opencv-3.4.2\build\x64\vc15\lib

Visual Studio 2017용 OpenCV Debug/Release 동적 연결 라이브러리 파일(.dll)
C:\opencv-3.4.2\build\x64\vc15\bin

haarcascades, lbpcascades XML 파일

C:\opencv-3.4.2\build\etc


OpenCV 예제 코드

C:\opencv-3.4.2\build\samples





예제 코드는 복사가 안되는 경우에는 다음 위치에서 찾을 수 있습니다.


C:\opencv-source\opencv-3.4.2\samples

C:\opencv-source\opencv_contrib-3.4.2\module에 모듈별로 samples, tutorials 폴더 존재



2. 빌드된 OpenCV 라이브러리 테스트


2-1. C++용 OpenCV 라이브러리 테스트는  포스팅을 참고하여 진행하면 됩니다.


Visual Studio 2017에서 OpenCV 3.4.2를 사용하는 방법

http://webnautes.tistory.com/1132




2-2. Python용 OpenCV 라이브러리 테스트하기 전에 추가 작업이 필요합니다.


동적(Shared) 라이브러리로 컴파일 했기 때문에 파이썬 라이브러리인 cv2.pyd가 참조하는  DLL 파일을 Python 폴더로 복사해주어야 제대로 동작합니다.




2-3. 포스팅대로 진행했다면 C:\opencv-3.4.2\build\x64\vc15\bin 경로에 생성된 다음 세 개의 파일을 복사합니다.


  • opencv_ffmpeg342_64.dll

  • opencv_img_hash342.dll

  • opencv_world342.dll





2-4. 파이썬용 OpenCV 라이브러리인 cv2.pyd 파일이 복사되어 있는 위치에 복사해줍니다.

1.5장 17번에서 확인한 cmake 실행결과를 보면 위치를 알 수 있습니다.


포스팅 대로 따라했다면 다음 위치입니다. 경로에서 webnautes 부분은 로그인 사용자 이름입니다.


packages path:               C:/Users/webnautes/AppData/Local/Programs/Python/Python37/Lib/site-packages





2-5. 명령 프롬프트에서 다음 명령으로 Python용 얼굴 인식 코드를 동작시켜 봅니다.

카메라 영상에서 검출된 얼굴에 초록색 사각형, 얼굴 영역에서 검출된 눈 위치에 파란색 사각형을 볼 수 있습니다.


python c:\opencv-3.4.2\build\samples\python\facedetect.py --cascade c:\opencv-3.4.2\build\etc\haarcascades\haarcascade_frontalface_alt.xml  --nested-cascade c:\opencv-3.4.2\build\etc\haarcascades\haarcascade_eye_tree_eyeglasses.xml





3. 참고한 곳


[1] https://docs.opencv.org/3.4.2/d3/d52/tutorial_windows_install.html


[2] https://alliance.seas.upenn.edu/~cis700ii/dynamic/techinfo/2015/09/04/compiling-and-benchmarking-opencv-3-0/


[3] https://github.com/kyamagu/mexopencv/wiki/Installation-%28Windows%2C-MATLAB%2C-OpenCV-3%29


[4] http://jamesbowley.co.uk/build-opencv-v3-2-with-cuda-8-0-and-intel-mkltbb/



적지 못한 참고 사이트들도 있습니다.