본문으로 바로가기

Ubuntu 16.04 에서 OpenCV 3.x 설치

category Linux/Ubuntu 2016.11.06 19:43

OpenCV 설치에 들어가보도록 하겠습니다. 


OpenCV는 OS X, Linux, Windows, Android, iOS 어디서든지 사용할 수 있지만 일반적으로 설치하기가 좀 까다로운 Linux에서 설치하는 방법을 포스팅해보도록 하겠습니다.



설치를 위한 준비..

Linux에서 OpenCV를 설치할 때는 일반 프로그램 설치와 달리 미리 준비된 바이너리 파일로 설치하는 것이 아닌 소스 코드를 직접 받아서 컴파일하여 설치하는 것입니다. 따라서 설치를 위해 OpenCV 소스 코드와 컴파일 도구를 준비해야 합니다.


- OpenCV Source Code

- build-essential, CMake, GCC

- NVIDIA CUDA (Optional)


혹시 자신의 노트북이나 PC에 NVIDIA 그래픽을 사용하고 있다면, 드라이버와 동시에 CUDA가 설치되어 있어야 GPU를 이용한 OpenCV 사용이 가능하므로 참고하시기 바랍니다. 이 포스트에서는 CUDA 설치와 드라이버 설치까지 같이 포스팅 될 것입니다.


Linux에서 사용하는 C 컴파일러는 대부분 GCC를 사용하기 때문에 역시 이 포스트에서도 GCC를 사용하여 빌드할 것입니다. 참고로 OpenCV는 gcc 4.9 버전 이상에서 컴파일이 안됩니다. 따라서 이 포스트에서는 gcc 4.9 버전에 맞춰 컴파일을 진행할 것입니다.


그럼 이제 필요한 준비는 모두 끝났으니, 설치에 직접 들어가보도록 하겠습니다.



본격적인 OpenCV 설치

자 먼저 OpenCV 소스 코드를 Github에서 받아 먼저 미리 다운로드 받아 놓도록 하겠습니다.


$ mkdir opencv

먼저 OpenCV 소스 코드를 받아놓을 적당한 이름의 폴더를 하나 생성합니다.

$ cd opencv

해당 폴더에 들어갑니다.


$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib

git 명령어를 이용해 OpenCV 소스 코드와 확장팩을 다운로드 받습니다.


$ sudo apt install git

만약 git이 설치되어 있지 않다면, 위 명령어를 이용해 git을 설치합니다.

이 과정으로 OpenCV 소스 코드가 모두 다운로드 되었습니다.



이제 컴파일 도구와 라이브러리를 설치해보도록 하겠습니다.



$ sudo apt update
$ sudo apt install build-essential checkinstall gcc-4.9 cmake pkg-config yasm libtiff5-dev libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev  libv4l-dev python-dev python-numpy libtbb-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils libopenexr-dev python-tk  libeigen3-dev libx264-dev

두 명령어를 모두 타이핑합니다. 컴파일 도구에는 build-essential, pkg-config가 해당하고 나머지는 모두 OpenCV 영상처리를 위한 라이브러리들입니다. 아마 대부분 익숙한 단어들이나 패키지일 것이라 생각합니다.


$ sudo add-apt-repository ppa:mc3man/gstffmpeg-keep
$ sudo apt update
$ sudo apt install ffmpeg gstreamer0.10-ffmpeg

추가로 설치해야 할 mpeg 라이브러리를 설치합니다.
(반드시 설치해야하는 것은 아니지만 OpenCV Full Package 설치를 위해서는 필요할 수도 있습니다.)

여기서 잠깐, OpenCV에 대한 설치를 일시 중단하겠습니다.



NVIDIA Driver, CUDA 설치 (옵션, 64-bit only)

컴파일 하기 전에, CUDA 연동을 원하시는 분들은 OpenCV 설치 이후, 반드시 이 과정을 거치시기 바랍니다. 그렇지 않으신 분들은 바로, 밑으로 이동하셔서 OpenCV 설치를 계속 진행하시면 됩니다. (CUDA에 대한 별도의 설명은 하지 않겠습니다. 본인이 정말로 알고 쓰시는 분만 읽기를 권장합니다.)


먼저 NVIDIA 드라이버를 설치해보겠습니다.


Linux에서 설치하는 NVIDIA 드라이버는 두 가지의 종류가 있습니다. 하나는 Linux Repository에서 제공하는 NVIDIA 드라이버, 또 하나는 NVIDIA 홈페이지에서 다운로드 받아 사용하는 드라이버로 나뉩니다.


둘 다 설치하는 데는 큰 문제가 없지만, 쉽게 설치하는 방법에는 Repository를 사용해 설치하는 방법을 추천드리고, 자신이 꼭 최신 버전의 드라이버를 써야한다면, 홈페이지에서 다운로드 받아 설치하는 것을 추천합니다.


이 포스트에서는 Repository에서 제공하는 드라이버의 설치로 쓰도록 하겠습니다.


터미널을 실행합니다.


$ sudo apt install nvidia-367 nvidia-367-dev nvidia-prime

이 명령어를 치기 전에, 몇 가지 알려드리자면, nvidia-367에서 367은 드라이버 버전입니다. 여러분이 원하시는 드라이버 버전의 숫자를 입력하셔서 설치하시면 됩니다. dev는 개발용 라이브러리를 포함합니다. 그리고 옆에 있는 nvidia-prime은 NVIDIA Optimus 드라이버 전용이므로 노트북에서 자신이 Optimus를 지원하는 노트북을 사용하시는 경우에만 설치를 권장합니다. 


Non-Optimus, PC NVIDIA Graphic Card에서는 prime을 설치하시면 안됩니다.


설치가 끝났으면 Linux를 재부팅해줍니다.



다음은 CUDA를 설치 해보겠습니다.


CUDA 역시 Repository에서 제공하는 CUDA, NVIDIA 홈페이지에서 제공하는 CUDA가 있지만 여기서, Repository에서 제공하는 CUDA는 설치하지 마시기 바랍니다. 해당 CUDA는 CUDA의 일부만 적재되어 있어 실제 코딩에 대한 필요한 라이브러리가 많이 빠져 있습니다. (cuDNN이나 NVCC 등) CUDA 설치는 반드시 NVIDIA 홈페이지에서 다운로드 받아 설치하기를 권장합니다.


또, CUDA 버전은 자신이 현재 사용하고 있는 NVIDIA 그래픽 카드에 맞춰 설치해야 합니다. 버전 호환에 대한 정보는 NVIDIA 홈페이지에서 확인할 수 있습니다.


저는 CUDA 8.0 버전을 설치해보도록 하겠습니다.


Download NVIDIA CUDA


위 버튼을 클릭하여, NVIDIA CUDA를 다운로드 페이지로 들어갑니다. 페이지에 들어가면, 운영체제는 Linux, 아키텍처는 x86_64, 배포판은 Ubuntu, 버전은 16.04를 누르시고, local 설치본을 다운로드 받으시면 됩니다. 다운로드 용량은 약 1.2GiB입니다.


$ chmod +x cuda_8.0.44_linux.run

설치 파일에 실행 권한을 부여합니다.


$ sudo ./cuda_8.0.44_linux.run

관리자 권한으로 설치 파일을 실행합니다.


계약서 동의문이 나오면, accept를 입력하고 Enter를 누릅니다.


Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 367.48?

(y)es/(n)o/(q)uit: n


--> 우리는 이미 NVIDIA 드라이버를 설치했으므로 n을 누릅니다.


Install the CUDA 8.0 Toolkit?

(y)es/(n)o/(q)uit: y

--> NVIDIA CUDA 8.0 Toolkit을 설치합니다.

Enter Toolkit Location
   [ default is /usr/local/cuda-8.0 ]: 

--> 설치 경로를 지정하라는 메시지입니다. 그냥 Enter를 누르면, default 경로에 설치됩니다.

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y

--> 웬만하면, y를 눌러줍시다. (대부분의 컴파일러들은 보통 위 경로로 CUDA를 찾습니다.)

Install the CUDA 8.0 Samples?
(y)es/(n)o/(q)uit: n

--> 샘플 코드가 필요하시면, y, 그렇지 않으면 n을 누릅시다.

Installing the CUDA Toolkit in /usr/local/cuda-8.0 ...

--> 그럼 이제 CUDA 8.0 Toolkit 설치가 진행됩니다.

여기까지 CUDA Toolkit 설치를 모두 마쳤습니다.


OpenCV 컴파일/설치 (이어서..)

자 이제 OpenCV 컴파일을 위한 모든 준비가 끝났습니다. 이제는 본격적인 OpenCV 컴파일에 들어갈텐데요. 여기서 여러분들이 시간을 조금 길게 잡으셔야 할 것입니다. 컴파일 하는 시간은 여러분들이 사용하는 컴퓨터의 CPU 성능에 따라 다르지만 i7을 사용하는 저도 모든 코어와 쓰레드를 소비하여 최소 1시간 30분이 소요되었습니다. (그보다 적은 코어는 아마 3시간도 넘게 걸리지 않을까... 예상해봅니다.. ^^;)


$ mkdir build

자 빌드를 위해 아까 opencv 폴더에서 build 폴더를 추가로 생성합니다. 해당 폴더에 컴파일한 결과물이 담겨질겁니다.


$ cd build

해당 폴더에 들어갑니다.


$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr -D -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_TBB=ON -D WITH_IPP=OFF -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules  ../

여기서 사용하는 cmake 명령어는 여러분들이 OpenCV를 어떻게 컴파일하고 싶은지를 사용하는 명령어입니다. 우리는 OpenCV 확장 모듈까지 같이 설치할 것입니다. 확장 모듈은 OpenCV 코딩 후 내가 만든 이미지나 영상을 저장하거나 확대하여 볼 수 있도록 만든 확장 기능입니다. 


원래 cmake 명령어는 make 명령을 좀 더 효율적으로 처리하도록 하는 범용 빌드 도구로 OS X, Linux, Windows 모두에서 사용이 가능하다는 장점이 있습니다. 또, CMake는 라이브러리에 따라 개발자가 원하는 컴파일 옵션을 코드로 직접 짤 수 있어서 용이합니다.


여기까지 cmake에 대한 간략한 설명이었고, OpenCV 코드를 컴파일하기 위해 사용할 수 있는 CMake 명령어 옵션은 CMakeLists.txt 파일에서 확인할 수 있으므로 이 포스트에서는 자세히 다루지 않겠습니다.


컴파일 옵션 설정을 모두 끝마쳤으면, 다음은 컴파일에 들어가보도록 하겠습니다.


$ make -j $(nproc)

위 명령어를 치면, 본격적인 컴파일에 들어갑니다. NVCC(CUDA)가 설치되어 있는 경우에는 NVCC 관련 라이브러리까지 모두 컴파일되기 때문에 더 시간이 소요될 수도 있습니다. 그 전에 명령어에 대해 간략히 설명하자면....


$(nproc)는 Linux에서 여러분이 사용하고 있는 프로세서의 코어/쓰레드 갯수를 저장하고 있는 시스템 변수입니다. i7은 8 쓰레드이기 때문에 8개이며, 위 명령어를 칠 경우, 프로세서에 있는 8개의 쓰레드를 모두 사용하여 컴파일하기 때문에 다른 작업을 하게 될 경우, 아마 버벅일 수 있습니다.


여러분들이 컴파일 중에 PC를 사용해야 한다면, 컴파일에 사용할 쓰레드 갯수를 낮춰서 사용하시면 원활하게 다른 작업도 가능하니 이 점 참고하시고 컴파일을 진행하시기 바랍니다.


$ sudo make install

모든 컴파일을 끝마쳤으면..(벌써?..) 컴파일한 바이너리 코드를 관리자 권한과 make 명령어를 이용해 설치합니다.


$ sudo ldconfig

주요 라이브러리에 OpenCV 라이브러리를 등록합니다.


$ pkg-config --modversion opencv

pkg-config 명령어를 이용해 현재 설치된 opencv 라이브러리의 버전을 확인합니다.

3.1.0이라고 나오시면, 정상적으로 설치가 완료된 것입니다.


이제 그럼 예제로 소스 코드를 작성해보고, 컴파일 해보겠습니다.


위 코드는 임의의 이미지를 한 장 불러와서, 그 이미지를 띄워주는 아주 쉬운 예제 코드입니다

컴파일을 한 번 해보겠습니다.


$ g++ -o main main.cpp `pkg-config opencv --cflags --libs`

g++ 명령어를 이용해 컴파일합니다.


키야.. ~_~ 

(출처: 나무위키)


마치며...

처음 설치부터가 빡신(?) OpenCV 설치였습니다. 물론 Linux에서만 설치가 이렇게 조금 어렵습니다.. ;; Windows에서는 설치가 이것보다는 쉬워서 한 편은 다행이지만 Windows에서도 OpenCV 3.x 버전 설치하기는 꽤 고달픈 것으로 압니다.


마지막으로 간단한 오류 조치 방법을 올리고, 이번 포스팅을 마치겠습니다. 성공하신 분들 모두 축하드리고 수고하셨습니다. 




(별첨) 오류 조치

컴파일 도중, GCC 버전이 너무 높아서 오류가 나는 경우.


우분투 리눅스 16.04 버전에서 기본적으로 gcc 5.3 이상의 컴파일러가 설치되다 보니 4.9 버전을 설치해도 해당 버전이 낮아 오류가 발생하는 경우가 있습니다. 이럴 때는 그냥 gcc 5.3 버전을 제거하면 그만이지만, '나는 제거하기 싫다' 는 분들은 update-alternatives 명령어를 통해 gcc 기본 명령어를 4.9 버전으로 바꿔주시면 됩니다.


$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20

gcc와 g++ 모두, 5 버전과 4.9 버전에 대한 설정을 위와 같이 해주도록 합니다.


$ sudo update-alternatives --config gcc 

gcc 명령어에 대한 설정 리스트를 보여줍니다.


저는 Priority의 숫자를 위에 있는 것과 반대로 설정하였습니다. Priority는 그저 우선 순위에 불과한 것이므로 auto mode일 때만 동작합니다. 그러니 별로 중요하지 않으므로 설정이 다르다고 해서 당황하실 필요가 없습니다. 


여기서 본인이 원하시는 버전의 gcc의 번호를 선택하시고 Enter를 누르시면 gcc의 기본 명령어 버전이 바뀌게 됩니다.


gcc의 명령어가 4.9 버전으로 내려갔습니다.


마찬가지로 g++도 똑같이 적용하시고, 다시 컴퍼일 하시면 됩니다.



OpenCV 버전이 2.4.9.1로 나오는 경우

pkg-config 명령어를 이용해봤더니 OpenCV 버전이 3.1.0으로 나오지 않고, 2.4.9.1로 나오고, 소스 코드를 작성했더니 제대로 컴파일이 되지 않는 경우입니다.


우분투 리눅스 16.04 에는 희안하게도 OpenCV 2.4.9.1 버전이 레포지터리에서 제공됩니다. 게다가 이것이 기본으로 설치가 되어 있어서, 설치하는 데 저도 많은 애를 먹었던 부분 중에 하나입니다. (출처: http://webnautes.tistory.com/1030 )


$ sudo apt autoremove opencv-doc opencv-data libopencv-dev libopencv2.4-java libopencv2.4-jni python-opencv libopencv-core2.4 libopencv-gpu2.4 libopencv-ts2.4 libopencv-photo2.4 libopencv-contrib2.4 libopencv-imgproc2.4 libopencv-superres2.4 libopencv-stitching2.4 libopencv-ocl2.4 libopencv-legacy2.4 libopencv-ml2.4 libopencv-video2.4 libopencv-videostab2.4 libopencv-objdetect2.4 libopencv-calib3d2.4 

Python에서 사용되는 OpenCV 제공 라이브러리를 포함하여 모든 2.4.9.1 버전의 라이브러리를 제거합니다.


$ pkg-config --modversion opencv

그리고 다시 버전을 확인해보시면, 정상적으로 3.1.0이 나오고 있음을 확인할 수 있습니다.


comments powered by Disqus

티스토리 툴바