방법 자체는 크게 어렵지 않은데 모르는사람이 많고

잘못된 방법으로 설치하는 사람이 많아서 한번 적어본다.

SWAP 영역 만들기

일단 바로 컴파일로 들어가도 좋지만 라즈베리파이의 경우 램이 1GB밖에 안된다는 치명적인 약점이 있다. OpenCV를 컴파일하는데 1.2GB정도의 램이 필요하니 먼저 Swap을 만들어주도록 하자.
(라즈베리 설정할때 swap영역을 만들어준경우 이건 패스해도 된다.)

(다음은 모두 루트권한으로 해줘야한다)

dd if=/dev/zero of=/home/swapfile bs=1024 count=1000000
(한번에 1024바이트씩 1000000번 (1GB) /home/swapfile을 쓴다음 /dev/zero에 마운트 한다는뜻)

mkswap /home/swapfile
(swapfile을 swap영역으로 포맷)

swapon /home/swapfile
(swapfile을 swap으로서 활성화)

이렇게 해주고 top을 보면 5번째줄에 999996KiB크기의 SWAP영역이 생긴걸 볼수있다.

OpenCV 다운로드하기

http://opencv.org/downloads.html 여기서 리눅스 버전의 OpenCV다운로드 주소를 알아내자.

버전은 원하는 버전을 쓰면되고 현재 OpenCV 3.0의 다운로드 주소는 https://github.com/Itseez/opencv/archive/3.0.0.zip 이다.

이제 리눅스에 적당히 폴더를 만들어준뒤 그 폴더속에서 이 파일을 받아주자.

wget https://github.com/Itseez/opencv/archive/3.0.0.zip

다운이 완료된뒤

unzip 3.0.0.zip

해주면 압축이 해제된다.

자신이 설치한 버전에 따라 unzip이 없는경우도 있는데 그경우 알아서 깔아주자. 보통 어느 리눅스버전이던 패키지관리자에서 `unzip`을 설치하면된다.

의존성 패키지 설치하기

OpenCV가 워낙 방대한 프로젝트다 보니깐 일부 기능들은 외부 프로그램에 의존해서 실행이 된다.

[필수] sudo apt-get install build-essential
[요구됨] sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev  libavformat-dev libswscale-dev
[옵션] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

다음중 자신에게 필요하다 여겨지는 패키지만 설치하도록 하자. 간단히 설명하자면

[필수] : 컴파일 진행할려면 있어야함. (보통 기본으로 설치되있음)

[요구됨] : 화면에 표시하던가 비디오 코덱같은 패키지들. OpenCV기능이 전부 실행될려면 필요하나 자신에게 필요없어 보이면 안설치해도됨

[옵션] : OpenCV가 추가로 지원하는 기능들을 활용할때 쓰는것들. 일반적으로 필요없고 라즈베리에겐 해당사항 없는 프로그램도 있다. (tbb같은건 인텔CPU전용인데 실행속도가 엄청 빨라진다.)

OpenCV 컴파일하기

일단 OpenCV는 CMake라는 프로젝트를 이용해 컴파일 방법을 제공한다.

CMake에대해 간단히 소개하자면 GCC에선 "MakeFile"을통해 주로 컴파일하고 비주얼스튜디오는 `솔루션 파일`을통해 컴파일하다보니 하나의 소스를 여러군데에서 쓸때 각각 설정을 해줘야한다는 불편함을 줄이기위해 일단 CMakeProject로 만들어두면 CMake가 GCC던 Visual Studio던 각 컴파일러에 맞게 설정파일을 제공해주는 역할을 한다. 물론 다른 컴파일러 환경도 지원한다. (원래 멀티플랙폼이 목적)

일단 CMake를 설치하자

apt-get install cmake

설치가 완료되면 이제 압축해제되어 나온 폴더속에서

cmake . 을 입력하자.

이런 느낌으로 CMake가 알아서 CMake 프로젝트를 MakeFile 프로젝트로 바꿔줄것이다.
(소요시간 2분정도)

구성이 완료된뒤

이제 대망의 컴파일의 시간이다.

컴파일의 경우 시간이 꽤 오래걸린다.(1시간정도) 그러니 `tmux`나 `screen`같은 TTY 멀티플렉서를 이용하고 딴짓하다 올것을 추천한다. 라즈베리파이가 매우 뜨거워 질테니 라즈베리파이를 환기 잘되는곳에 두는것을 권장한다.

make -j4 를 입력하자.
(j4는 스레드를 4개 만들겠다는뜻. 라즈베리가 쿼드코어니 4개의 스레드를 만들어 모든 코어를 활용하겠다는 의미다. 다른 작업을 병행할거면 j3나 j2를 입력해 코어에 여유를 둘수도 있다.)

다음과 같은 느낌으로 컴파일이 진행된다. (CPU점유율 100%!)

컴파일이 완료된뒤

루트 권한으로
make install
해주면 OpenCV설치가 끝난다.

SWAP영역 해제하기

처음에 설정해둔 SWAP영역은 재부팅하면 자동으로 해제가 되고 /home/swapfile만 삭제하면 용량도 회복할수 있다.

OpenCV 설치 확인하기

적당한 폴더에 CMakeLists.txt파일을 만들고 다음을 입력해준다.

cmake_minimum_required(VERSION 2.8)
project( Test)
find_package( OpenCV REQUIRED )
add_executable( Test Test.cpp )
target_link_libraries( Test ${OpenCV_LIBS} )

그리고 Test.cpp파일을 만들고 적당한 OpenCV코드를 입력해본다.

#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv )
{
    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    }

    Mat image;
    image = imread( argv[1], 1 );

    if ( !image.data )
    {
        printf("No image data \n");
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);

    waitKey(0);

    return 0;
}

이제 cmake .해준뒤 make를 입력해주면 컴파일이 완료되고 Test라는 실행파일이 나오게 된다!

참고로 `cmake .` 은 처음 한번만 해주면된다. `CMakeLists.txt`파일만 변경하지 않았다면 말이다.

후기

사실 라즈베리에 OpenCV설치랍시고 글 올려놓긴 했지만 사실 리눅스 전체에 통용되는 방법이다.

이 글을 보게된다면 라즈베리에서 무언가 하는방법을 찾지 말고 리눅스에서 무언가 하는방법을 먼저찾고 그걸 따라하다 생기는 오류에대해서만 검색해보는게 훨씬 좋은방법이란걸 알아가길 바란다.

오류가 나거나 문제가 생길경우 (설사 해결방법을 알았다 해도) 댓글로 달아주길 바란다.

그 어떤 오류도 자신의 지식을 넓히는데 좋은 계기가 되기에......