본문 바로가기

IT/Image Processing

[Linux/Ubuntu][OpenCV - 3.3.0 with contrib] 설치

Issue


1. Ubuntu 17.04 + CUDA + opencv_contribe-3.3.0 + opencv-3.3.0 

Ubuntu 17.04에서 CUDA + opencv_contribe-3.3.0 + opencv-3.3.0 설치시 몇가지 문제가 발생합니다.

해당 이슈는 Ubuntu 17.04의 그래픽 드라이버 설치시 gcc-7, g++-7 버전을 default로 사용하고, NVCC 및 OpenCV는

컴파일시 gcc-7, g++-7버전을 지원못하는 이슈때문에 생기는 문제로 보입니다.


해결방법은 아래의 방법을 순서대로 따라하시면 됩니다.


-  gcc-5와 g++-5를 먼저 설치해줍니다.

sudo apt-get install -y gcc-5 g++-5


- 기존 /usr/bin의 gcc와 g++ 심볼릭 링크를 삭제하고, 아래와 같이 gcc와 g++ 심볼릭 링크를 다시 설정해줍니다.

cd /usr/bin
sudo rm -rf gcc g++
sudo ln -s gcc-5 gcc
sudo ln -s g++-7 g++


- CUDA의 bin 폴더에서 gcc, g++ 심볼릭 링크를 생성해줍니다.

cd /usr/local/cuda/bin
sudo rm -rf gcc g++
sudo ln -s /usr/bin/gcc-5 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-5 /usr/local/cuda/bin/g++


- 기존 build폴더를 지우고, 새로운 build폴더를 만들어서 다시 cmake를 시도합니다.

sudo rm -rf build
mkdir build
cd build

sudo cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D WITH_V4L=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \
-D CUDA_HOST_COMPILER=/usr/bin/gcc-5 \
-DOPENCV_EXTRA_MODULES_PATH=/home/keti/Downloads/opencv_contrib-3.3.0/modules/ \
..


- Make 합니다.

sudo make -j12



Pre-required


터미널을 열고 다음과 같이 명령어를 입력하여 필요한 패키지를 설치해줍니다.


1
2
3
4
5
sudo apt-get install build-essential python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng12-dev 
libtiff5-dev libjasper-dev libdc1394-22-dev v4l2ucp v4l-utils libv4l-dev libopencv-dev checkinstall libjasper-dev 
libavformat-dev libavcodec-dev pkg-config libgtk2.0-dev cmake git libswscale-dev libdc1394-22-dev libgstreamer0.10-dev 
libgstreamer-plugins-base0.10-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev 
libtheora-dev libvorbis-dev libxvidcore-dev x264 qt5-default
cs


Download OpenCV


Link : OpenCV

Link : OpenCV_Contrib



위의 링크되어있는 OpenCV홈페이지에 들어가서 오른쪽 상단에서 위 그림과 같은 다운로드 링크를 찾은 다음에 


Linux용을 다운 받습니다. 


OpenCV는 모든 버젼이 설치방법이 같습니다. 따라서 다른 버전을 설치할 때도, 해당 포스팅을 따라하시면 됩니다.


OpenCV Contrib 설치는 필요하신분만 다운받으시면 됩니다.


Setting Directory hierarchy


저는 OpenCV와 OpenCV contrib를 다운받고 다음과 같이 폴더 위치를 지정하였습니다. 

이번 포스트를 처음 따라오시는 분이면 제가 사용한 방법을 따라하시는게 설치하시는게 더 수월하실 것입니다.


1
2
3
4
5
6
.
├── opencv-3.3.0
├── opencv-3.3.0.zip
├── opencv_contrib-3.3.0
└── opencv_contrib-3.3.0.zip
                                                                         
cs


OpenCV 폴더에 진입해서 build라는 이름의 폴더를 하나 더 만들어줍니다.

1
2
3
4
cd opencv-3.3.0
mkdir build
cd build
                                                                          
cs

CMake


들어간 이후에 다음과 같은 명령어를 통해서 cmake를 합니다. cmake를 실행하게되면, 다음과 같은 화면을 확인 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D WITH_V4L=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \

# 해당 옵션 때문에 에러가 나는 경우가 있습니다.
# 자꾸 에러가 난다 싶으면 해당 옵션을 없애주세요
-D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" \

# OpenCV contrib를 설치 안하실 분은 아래의 명령어를 생략해주시면 됩니다.
-DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib/modules directory> \

<opencv_directory> (ex> 현재 디렉토리가 opencv 안이라면 .을 입력한다.)

cs


이번 포스팅에서 저는 다음과 같이 Cmake를 진행했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D WITH_V4L=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \
-D CUDA_NVCC_FLAGS="-D_FORCE_INLINES"\
-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3.0/modules \
..
 
cs




Cmake가 https protocol 지원이 안되서, OpenCV contrib 설치시 필요한 파일을 설치하지 못할 수도 있습니다.

이러한 내용은 Cmake시  Cmake Summary확인할 수 있으며, 이슈 내용은 아래 링크에서 확인할 수 있습니다.

https://github.com/opencv/opencv_contrib/issues/1301

이런 이슈가 발생한다면 아래와 같이 해결하시면 됩니다.

다음과 같은 명령어를 통해서 해당 파일을 다운로드 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# boostdesc
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_lbgm.i > 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i > 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_064.i > 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_bi.i > 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_hd.i > 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_128.i > 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_256.i >  e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
 
#vgg
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_120.i >  151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_64.i >  7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_80.i >  7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_48.i >  e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
cs


OpenCV 폴더안에 .cache라는 폴더가 있는데, 해당 폴더의 디렉토리는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
opencv-3.3.0
|
├── 3rdparty
├── apps
├── build
├── .cache
├── cmake
├── CMakeLists.txt
├── CONTRIBUTING.md
├── data
├── doc
├── include
├── LICENSE
├── modules
├── platforms
├── README.md
├── samples
└── .tgitconfig
 

cs


.cache 폴더 내부의 xfeatured2d에는 boostdes와 vgg라는 폴더가 있습니다.

vgg와 boostdes 내부 파일을 삭제해주고, 아까 다운받은 파일들을 아래 디렉토리와 같게 복사해서 넣어줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.cache
└───xfeatures2d
    ├───boostdesc
    │       0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
    │       0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
    │       202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
    │       232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
    │       324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
    │       98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
    │       e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
    │
    └───vgg
            151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
            7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
            7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
            e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
cs


Make

CMake가 정상적으로 끝났다면 다음과 같은 명령어로 make를 진행합니다.

명령어는 다음과 같습니다.


1
sudo make
cs


* Make시에 -j 옵션을 주면 더 빠르게 컴파일 할 수 있습니다. CPU 코어를 몇개 쓸거냐라는 옵션인데,

CPU 코어의 수는 아래의 명령어로 확인할 수 있습니다.


cat /proc/cpuinfo | grep processor | wc -l


만약 PC의 코어의 수가 12라고 가정했을 때, j옵션을 준 make명령어는 아래와 같습니다.


sudo make -j12





Install


Make가 정상적으로 끝났다면 다음 명령어를 입력하여, 설치를 진행합니다.


1
sudo make install
cs



Check Installation


설치가 있나면 OpenCV가 정상적으로 설치되어있는지 다음과 같은 명령어로 확인합니다.

다음 보이는 이미지에서와 같이, 해당 OpenCV의 버전이 출력된다면 설치가 잘 진행된 것입니다.


1
pkg-config --modversion opencv
cs



Tutorial : [Get Video Stream from USB WebCam]


이제 OpenCV 설치를 완료하였으니, 다음 코드를 이용해서, OpenCV가 잘 작동하는지 확인하겠습니다.

여기서는 다음고 같이 웹캠으로 부터 영상을 받아오는 코드를 실행하겠습니다.


Camera.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<opencv/cxcore.h>
#include<opencv2/highgui.hpp>
#include<iostream>
 
using namespace std;
using namespace cv;
 
int main(int argc, char** argv){
    
    IplImage* frame = NULL;
    CvCapture* capture = cvCaptureFromCAM(0);
    cvNamedWindow("Camera",1);
 
    while(capture){
        frame = cvQueryFrame(capture);
        
        cvShowImage("Camera",frame);
            if(cvWaitKey(33)>=27){
                break;
            }
    }
    cvReleaseImage(&frame);
    cvReleaseCapture(&capture);
    cvDestroyWindow("Camera");
    return 0;
 
}
 
cs


해당 코드를 모두 입력하였다면, 아래의 명령어를 입력해서 컴파일합니다.

1
g++ -o Camera Camera.cpp `pkg-config opencv --cflags --libs`
cs



컴파일 한 후에는 만들어진 실행파일을 다음과 같은 명령어를 사용하여 실행합니다


1
./Camera
cs


여기서는 이미 Camera.cpp의 내용을 getImage_Sample.cpp으로 작성해두었기에 이를 컴파일하여 사용하였습니다.

여기서 다음과 같이 에러 없이 컴파일이 잘 되었다면, OpenCV설치는 확실하다고 할 수 있습니다

`pkg-config opencv --cflags --libs`를 적을 때 (`) 그레이브와 (')작은따옴표와는 다르니 유의하셔야합니다.

여기서는 (`)그레이브 : [1옆에 있는 (~)을 shift를 누르지 않고 입력하면 된다.] 사용합니다.

만약에 에러가 출력되고 에러 안에 Ippicv를 찾을 수 없다고 나온다면, 위의 압축 풀었던 

OpenCV폴더에 진입한 다음에 다음과 같은 명령어를 입력한 후, 다시 컴파일을 진행하여 확인해보면 됩니다.


1
sudo cp 3rdparty/ippicv/unpack/ippicv_lnx/lib/intel64/libippicv.a /usr/local/lib
cs


해당 명령어는 OpenCV 폴더안에 3rdparty/ippicv/unpack/ippicv_lnx/lib/inel61/libippicv.a라는 파일을 /usr/local/lib로 복사하는 명령어로 OpenCV설치시 ippicv와 관련된 라이브러리가 자동으로 설치가 안되기때문에 인위적으로 압축해제된 폴더에서 리눅스 내부에 설치된 OpenCV 라이브러리가 있는 폴더에 해당 라이브러리 파일을 복사해주는 것입니다.





출처 : http://blog.danggun.net/2121

 : http://thinkpiece.tistory.com/241

 : http://answers.opencv.org/question/84265/compiling-error-with-lippicv/