OpenCV 설치 및 CMake GPU+TBB+IPP 빌드(컴파일)하기

프로그래밍/opencv 2013. 10. 4. 18:02

(2021.07.03) 최신 버전 opencv 빌드 관련해서는 본 글보다는 최근 새로 작성한 글을 참고하시기 바랍니다.

 --> [프로그래밍] - OpenCV +CUDA 직접 빌드하기 (Windows/Linux 종합)

 

-------------------

OpenCV 설치 및 빌드(build)에 대한 간략 튜토리얼입니다.

 

윈도우즈(windows) 운영체제 환경에서의 설치를 대상으로 하며, cmake를 이용하여 gpu (cuda), tbb, ipp 를 사용하도록 opencv를 다시 build (compile)하는 방법을 설명합니다.

 

기본적으로 외부 dll 라이브러리를 자신의 visual c++ 프로젝트에 가져다 사용하는 방법은 알고 있다는 전제하에 설명합니다 (include 포함시키고, lib 파일들 포함시키는 것 등).

 

 

OpenCV 설치하기

 

1. OpenCV 다운로드

http://opencv.org/downloads.html에서 자신이 필요한 opencv 버전을 다운로드 받는다. 이 글에서는 현재의 가장 최신 버전인 OpenCV 2.4.6 (윈도우즈 버전)를 예로써 사용한다.

 

2. OpenCV 설치

다운받은 OpenCV-xxx.exe 파일을 더블클릭하여 적당한 곳에 압축을 풀면 설치가 완료된다. 별도의 추가적인 setup 없이 압축을 푸는 것만으로 설치가 완료된다.

 

3. OpenCV 사용

설치된 OpenCV 라이브러리를 사용하기 위해 필요한 include, lib, dll 파일들은 다음 위치에 존재한다 (단, OpenCV를 설치한 루트 폴더 경로를 OPENCV_ROOT라고 표기할 경우)

  • 헤더 파일들: OPENCV_ROOT\build\include
  • lib 파일들: OPENCV_ROOT\build\x86\vc9\lib (32비트 시스템 visual studio 2008인 경우)
  • dll 파일들: OPENCV_ROOT\build\x86\vc9\bin (32비트 시스템 visual studio 2008인 경우)

단, lib, dll 파일들은 개발환경이 32비트 시스템인지 (x86), 64비트 시스템(x64)인지에 따라서 그리고, visual studio 버전에 따라서 (visual studio 2008은 vc9, 2010은 vc10, 2012는 vc11) 종류별로 모두 있기 때문에 자신의 개발환경에 맞추어 적절한 것을 사용한다. 예를 들어, 64비트 시스템용 visual studio 2010에서 사용하고자 한다면 OPENCV_ROOT\build\x64\vc10\lib, bin에 있는 파일들을 사용한다. 보통은 32비트 버전을 사용하면 32비트, 64비트 시스템 관계없이 모두 사용할 수 있으니 32비트(x86)용을 사용하면 된다.

 

 

CMake를 이용하여 OpenCV를 새로 빌드하기

 

OpenCV를 설치하면 기본적으로 미리 build된 dll파일들이 제공되지만, 기본 제공되는 dll들에는 gpu나 실행속도 향상을 위한 tbb, ipp와 같은 외부 라이브러리들이 포함되어 있지 않다.

 

따라서, OpenCV에서 지원하는 외부 라이브러리들을 같이 사용하고 싶으면 CMake를 이용하여 OpenCV를 새로 빌드해야 한다.

 

(먼저 CMake를 이용하여 OpenCV를 새로 빌드하는 기본적인 과정을 설명한 후, GPU, TBB, IPP를 연동하는 방법을 설명합니다)

 

1. CMake 다운로드하기

http://www.cmake.org/cmake/resources/software.html에서 CMake의 자신의 시스템에 맞는 binary distribution을 다운로드 받는다 (예: cmake-2.8.11.2-win32-x86.exe)

 

2. CMake 설치하기

다운로드 받은 파일을 실행하면 일반적인 프로그램 설치 과정을 통해 CMake가 설치된다.

 

 

3. CMake 실행 및 설정하기

CMake를 설치하면 윈도우즈 시작버튼 프로그램 그룹에 cmake 폴더가 생성되니 잘 찾아서 CMake (cmake-gui)를 실행한다: 시작버튼>프로그램>CMake 2.8>CMake(cmake-gui)

 

 

'Where is the source code'에 설치한 opencv의 루트(root) 폴더 위치를, 'Where to build the binaries'에 새로 build할 opencv를 저장할 폴더 경로명을 넣어준다. 새로 build할 opencv용 폴더는 아무데나 원하는 곳에 새로 하나 만들어 주면 된다. 여기서는 opencv 루트 밑에 mybuild라는 이름으로 새 폴더를 하나 만들었다.

 

이후 configure 버튼을 눌러준다.

 

그러면 아래 그림과 같이 사용할 개발환경을 물어보는데 자신의 개발환경에 맞게 설정해 준후 finish 버튼을 누른다 (아래 예에서는 visual studio 2008을 선택).

 

 

 

그러면 아래 그림과 같이 opencv build 구성을 선택적으로 설정할 수 있는 화면이 나타난다.

 

 

 

이제 불필요한 구성요소는 없애고 필요한 요소들만 체크한 후 다시 configure 버튼을 누른다. (참고로 제가 사용하는 기본 구성은 아래와 같습니다)

 

 

 

CMake 설정을 통해 build할 OpenCV의 구성요소 및 빌드 옵션을 선택할 수 있을 뿐만 아니라 OpenCV에서 사용할 외부 라이브러리(CUDE, TBB, IPP, EIGEN, OpenCL 등)도 선택할 수 있다. 물론 외부 라이브러리를 연계하여 빌드하려면 해당 라이브러리는 별도로 다운로드하여 설치해 주어야 한다. CMake 설정 요소중 몇 가지만 설명하면 다음과 같다.

  • BUILD_EXAMPLES: opencv 예제 샘플코드들에 대한 실행파일을 컴파일할지 여부
  • BUILD_PACKAGE: 새로 빌드한 opencv 결과 파일들 전체를 하나의 패키지 형태의 파일로 묶을지 여부 (이걸 하면 무지막지하게 빌드 시간이 오래 걸리니 절대로 하면 안됨)
  • BUILD_SHARED_LIBS: dll 버전으로 빌드할지 static lib 버전으로 빌드할지 여부 (dll 버전으로 빌드할 경우 체크, static lib로 빌드할 경우 체크해제)
  • BUILD_WITH_STATIC_CRT: 콘솔 입출력, 메모리 관리 등의 CRT(C RunTime library) 모듈을 static으로 포함하여 빌드할지 여부 (이걸 포함시키면 visual c++에서 사용하는 CRT와 엄청난 충돌 메시지를 발생시키므로 체크해제)
  • 나머지는 외부 라이브러리를 추가하는 것이므로 본인이 필요한 기능이 있으면 체크해서 빌드 (글 뒷부분 TBB, IPP, GPU 설정 방법 참조)

 

CMake 설정을 모두 마친 후에는 Generate 버튼을 눌러서 위의 설정이 반영된 Visual C++ 프로젝트를 생성한다 (generate 버튼을 누르면 'where to build binaries' 에 입력한 폴더에 OpenCV라는 이름의 visual c++ 프로젝트가 생성됨).

 

=> TBB, IPP, GPU(CUDA) 등을 사용하고자 할 때에는 여기서 'generate' 버튼을 누르면 안되고 필요한 관련 설정을 모두 마친후에 generate 버튼을 누릅니다.

 

4. OpenCV 빌드

프로젝트가 생성된 폴더로 이동하여 생성된 visual c++ 프로젝트 파일(OpenCV.sln)을 열고 Visual C++의 Build Solution (F7)을 이용하여 OpenCV를 빌드한다 (debug, release 모두). 그러면 해당 폴더의 bin\에 dll파일들이, lib\에 lib 파일들이 생성된다. 이제 이렇게 새로 생성된 dll, lib 파일들이 자신이 직접 빌드한 OpenCV 라이브러리인 셈이다. 헤더파일(include)들은 원래 OpenCV 설치하면서 깔렸던 파일들을 그대로 이용하면 된다.

 

 

OpenCV + TBB 설정하기

 

1. TBB(Intel Threading Building Blocks) 다운로드 및 설치

TBB는 병렬처리를 통해 프로그램의 실행속도를 빠르게 해 주는 라이브러리로서 OpenCV에서 TBB를 설정한 경우와 그렇지 않은 경우의 속도 차이는 엄청나다.

 

먼저, https://www.threadingbuildingblocks.org/download에서 TBB 최신 버전을 다운로드 받는다. 소소코드는 다운받을 필요 없으며 자신의 운영체제에 맞는 binary 버전만 다운로드 받으면 된다.

 

다운받은 TBB 파일(예: tbb42_20130725oss_win.zip)을 적당한 곳에 압축을 풀면 설치 완료이다 (OpenCV처럼 별도 설치과정 없이 그냥 압축만 풀면 설치 완료이다).

 

2. CMake에서 TBB 설정하기

먼저 CMake에서 WITH_TBB를 체크하고 Configure 버튼을 누른다.

 

 

 

그러면 TBB_INCLUDE_DIRS라는 새로운 항목이 생기면서 빨간색으로 하일라이트된다.

 

 

 

이곳에 좀전에 다운받아 설치한 TBB의 include 폴더 위치를 넣어준 후 Configure 버튼을 다시 누른다.

 

 

 

그러면 다음과 같이 TBB_LIB_DIR, TBB_STDDEF_PATH가 맞는지 확인해 달라는 화면이 나타나는데 값을 바꿀 필요는 없으며 특별한 이상 없으면 그냥 다시 한번 Configure 버튼만 눌러주면 된다.

 

 

그림을 잘 보면 Use TBB:가 처음에는 NO이었다가 YES (ver 4.2 interface 7000)로 바뀐 것을 알 수 있다. 이게 YES로 바뀌었다는 건 설정이 잘 끝났다는 것을 의미한다.

 

이상으로 TBB 설정은 완료이다.

 

이후 Generate 버튼을 누르면 TBB가 활성화된 OpenCV 프로젝트가 생성된다.

 

단, TBB를 연동하여 OpenCV를 빌드한 경우에는 이후 OpenCV를 사용한 프로그램을 실행시키기 위해 반드시 tbb.dll (릴리즈버전), tbb_debug.dll (디버그버전) 파일이 같이 있어야 한다. tbb.dll, tbb_debug.dll 파일의 위치는 TBB를 설치한 폴더 위치를 TBB_ROOT라 했을 때 TBB_ROOT\bin\ia32\vc9 (32비트 시스템에서 visual studio 2008을 사용할 경우)이다. 또는 만일 자신의 개발환경이 64비트 시스템 visual studio 2010이라면 dll 위치는 TBB_ROOT\bin\intel64\vc10 이다.

 

 

OpenCV + IPP 설정하기

 

1. IPP(Intel Integrated Performance Primitives) 다운로드 및 설치

IPP는 인텔 CPU 칩에 최적화된 연산 라이브러리로 이걸 사용하면 OpenCV 처리 속도가 조금 향상된다 (TBB와 함께 사용할 수 있다).

 

먼저. http://software.intel.com/en-us/intel-ipp에서 IPP를 유료로 구매하거나 또는 무료 30일 평가판을 다운로드 받는다. 30일 평가판을 다운로드 받아도 OpenCV와 연계하여 사용하는 데에는 기간제한 없이 사용할 수 있다.

 

 

몇 가지 기본정보를 입력해 주면 이메일로 다운로드 링크를 보내준다.

 

2. CMake에서 IPP 설정하기

다운받은 IPP를 설치한 후에 CMake에서 WITH_IPP를 체크하고 Configure 버튼을 누른다.

 

 

 

그러면 IPP_H_PATH라는 항목이 나타나는데 이곳에 설치된 IPP의 include 폴더 경로를 넣어준 후 Configure 버튼을 다시한번 눌러준다. 만일 설치된 IPP의 루트 폴더 위치를 IPP_ROOT (ComposerXE-20XX 라는 이름으로 설치됨)라 하면 입력해줘야 할 해당 위치는 IPP_ROOT\ipp\include 이다.

 

 

위 그림과 같이 Use IPP가 NO에서 IPP 버전 이름으로 바뀌면 성공이다.

 

이상으로 IPP 설정은 완료이다.

 

설치된 IPP의 IPP_ROOT\lib\ia32\ 에 가보면 IPP 라이브러리가 xxx.lib, xxx_l.lib, xxx_t.lib 과 같이 동일한 이름의 3가지 버전으로 제공됨을 볼 수 있는데 첨자가 붙지 않은 xxx.lib는 동적 라이브러리(dynamic lib, dll)용 lib, 첨자가 붙은 xxx_l.lib, xxx_t.lib는 모두 정적 라이브러리(static lib)용 lib이다 (_l과 _t의 차이는 _l은 단일 쓰레드용, _t는 멀티 쓰레드용).

 

이중 OpenCV에서 사용하는 버전은 xxx_l.lib 로 ippvm_l.lib, ippcc_l.lib, ippcv_l.lib, ippi_l.lib, ipps_l.lib, ippcore_l.lib 이렇게 총 6개의 파일만 사용된다. 즉, OpenCV에서는 IPP를 항상 static 버전(single thread 버전)으로 링크해서 빌드하기 때문에 이후 OpenCV 응용프로그램을 실행할 때 IPP의 dll 파일들을 필요로 하지 않는다.

 

 

OpenCV + CUDA 설정하기

 

1. CUDA 다운로드 및 설치

OpenCV에서 GPU를 사용하기 위해서는 CUDA를 설치해야 한다. CUDA는 nVidia 계열의 그래픽 카드를 위한 GPU 프로그래밍 툴킷이다. 따라서 nVidia 계열이 아닌 그래픽 카드인 경우에는 동작하지 않음을 주의해야 한다 (다른 그래픽 카드는 현재 OpenCV에서 지원하고 있지 않다).

 

OpenCV에서 GPU를 사용하는 방식은 TBB나 IPP를 사용하는 방식과는 큰 차이가 하나 있다. TBB나 IPP의 경우에는 opencv 함수의 내부 구현에 숨겨져 있어서 opencv의 사용자 입장에서는 TBB, IPP 사용 여부 관계없이 동일한 코딩을 하면 된다. 하지만 GPU의 경우에는 클래스 및 함수들을 GPU 버전으로 별도 구현하고 cv::gpu::라는 namespace로 묶어 놓았다. 따라서, gpu 버전의 구현을 사용하려면 앞에 gpu가 붙은 클래스 명과 함수를 사용해야 한다 (예: cv::gpu::HOGDescriptor hog;).

 

참고로, OpenCV의 모든 기능이 GPU로 구현되어 있는 것은 아니며 현재는 일부 모듈들만 GPU로 구현되어 제공되고 있으며 계속적으로 GPU 버전의 구현이 추가되고 있다.

 

먼저, https://developer.nvidia.com/cuda-downloads에서 자신의 개발환경에 맞는 CUDA 툴킷을 다운받아 설치한다. (예: cuda_5.5.20_winvista_win7_win8_general_32.exe)

 

2. CMake에서 CUDA 설정하기

CUDA를 설치한 후 CMake에서 WITH_CUDA, WITH_CUBLAS, WITH_CUFFT 등을 체크한다 (WITH_CUBLAS, WITH_CUFFT는 선택사항).

 

 

 

또한 CUDA_SDK_ROOT_DIR과 CUDA_TOOLKIT_ROOT_DIR에 CUDA가 설치된 루트 디렉토리 위치 (예: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5)를 설정해 준다.

 

 

 

이후 Configure 버튼을 다시 누르면 아래 그림과 같이 붉은색 항목들이 나타나면서 추가적인 옵션 선택이 가능해진다. 필요한 경우 CUDA_FAST_MATH 등을 체크해 준다.

 

 

이후 Configure 버튼을 다시 한번 더 누르면 CUDA 설정이 완료된다 (Use Cuda가 YES로 바뀌었음을 확인).

 

by 다크 프로그래머