출처:http://blog.daum.net/goodgodgd/12


이번엔 Qt에서 opencv 설치하는 과정에 대해서 써보도록 하겠습니다.

이미 구글에 검색해보면 여러가지 비슷한 설치방법들이 나오는데요.. 제가 완결판을 만들어보겠습니다.


OpenCV 설치 방법을 간단 요약하자면

1. 다운받아서 설치한다.

2. CMake로 make 파일 만든다. (Qt 관련 설정 필요)

3. 빌드한다.

4. Qt 프로젝트 파일을 수정한다.

5. 코드에 #include <opencv2/opencv.hpp> 추가하고 OpenCV를 맘껏 쓴다.

비주얼 스튜디오를 사용하는 경우에는 직접 빌드할 필요가 없습니다. 이미 비주얼 스튜디오의 컴파일러로 빌드된 파일들을 설치시에 제공하기 때문이죠.

OpenCV코드를 직접 수정하거나 Qt같은 마이너 환경을 쓰는 경우엔 직접 빌드해야 합니다.

CMake는... 저도 아직 잘 모르겠어요. 저도 OpenCV 설치할 때만 CMake를 쓰는지라...ㅎ;;

CMake를 쓰는 이유는 (저도 잘은 모르지만) 비주얼 스튜디오 같은 통합개발환경(IDE) 없이 컴파일러만 가지고 빌드하려면 코드들 사이의 관계를 정의해주는 Makefile 이라는게 필요한데 코드가 많은 복잡한 프로젝트의 경우 Makefile을 직접 작성하기가 지랄맞게 어렵다고해서 그것보다 좀 더 쉬운 문법으로 CMakeLists.txt를 써주면 CMake 프로그램에서 알아서 Makefile을 만들어주겠다.... 는 거라네요. (그럼 애초에 Makefile을 만들기 쉽게하던가..;;)

암튼 OpenCV는 설치시 CMakeLists.txt를 제공하고 그래서 CMake로 빌드할 준비를 해야한다는 겁니다.


이제 본론 갑니다.


일단 OpenCV를 다운받아서 설치를 해야겠죠?

http://opencv.org/downloads.html

그런데 제가 해본 결과 3.0 버전은 Qt로 빌드가 잘 되지 않습니다. 그러니 일단 OpenCV 2.4.9 버전을 설치해주세요.

(3.0으로 Qt 잘 돌리시는 분 있음 댓글로 팁좀 주세요;;;)

저는 이미 구버전이 깔려있어서 헷갈리지 않게 C:\opencv_249 에 설치했습니다.

그리고 CMake도 설치해 주세요.

http://www.cmake.org/download/ 

윈도우라면 Binary distributions에 Windows (Win32 Installer) 이걸로 설치하는게 편할겁니다.


CMake를 실행하기 전에 먼저 시스템 환경변수를 설정해줘야 합니다.

이걸 안하면 아예 Configure부터 막힙니다;;

아래 그림대로 쭉 따라가세요.



저기서 저 Path란 변수에 Qt를 이용한 빌드에 필요한 경로를 추가해줍니다.

C:\Qt\5.3\mingw482_32\bin;C:\Qt\Tools\mingw482_32\bin;C:\Qt\Tools\QtCreator\bin;


처음에 설치 방법 소개했을때 말한 MinGW를 사용하는 것입니다.

절대 Path의 기존 경로들을 지운다거나 그런 실수는 하지 마세요;;; 위 경로를 추가!하는 겁니다.

시스템변수를 설정했으니 이제 CMake를 실행하는 것이... 아니고 일단 컴퓨터를 리부팅 해줘야 수정한 경로가 적용됩니다. Reboot!!


이제 진짜 CMake를 실행해서 다음과 같이 경로를 설정해 봅시다.

Where is the source code: 에는 OpenCV 설치 폴더에 들어있는 sources 폴더의 경로를 적어주면 되고

Where to build the binaries: 에는 빌드할 폴더를 지정합니다. sources 옆에 build라는 폴더는 이미 있기 때문에 다른 폴더 이름을 지정합니다.

Qt debug 모드에서 사용할 바이너리 파일을 만들기 위해 build_qt_debug란 이름을 붙였습니다. Release 모드로 쓸거라면 build_qt_release라고 했겠죠.

근데 debug 모드랑 release 모드랑 빌드를 따로해야 하냐구요? 맞습니다. 어떻게 하냐구요? 뒤에 나옵니다. 왜 그래야 하냐구요? 물론 공용으로 빌드해도 어느정도 돌아가긴 합니다.

그런데 몇가지 기능이 제대로 동작하지 않는것을 보고 저도 디버그 모드로 다시 빌드했습니다.

예를들면 imshow()로 이미지를 새 창에 띄우고 나서 똑같은 window name으로 다른 이미지를 imshow() 했는데 그림이 바뀌지 않더란 말입니다;;;


그리고 Configure를 누릅니다. 빌드 폴더가 없으면 만들겠냐고 물어보는데 당연히 Yes!

그러면 어떤 컴파일러로 OpenCV를 빌드할 것인지 아래와 같이 설정해줍니다.

Qt 설치시 MinGW를 선택하였으므로 Qt에서 설치해준 mingw 컴파일러를 지정합니다.


이제 Finish를 누르면 configure가 진행됩니다. 아까 환경변수를 수정하고 재부팅!까지 해주지 않았다면 여기서 바로 에러뜨고 막힙니다.

Configure가 약간 시간이 걸리는데 끝나고 나면 다음과 같은 화면이 뜹니다. 빨간색이 아니어도 에러만 안뜨면 괜찮습니다.


Configuring done 이라고 뜨지만 끝난것은 아닙니다. 여기가 핵심 비법이라고 할수 있는데요ㅋ

위에 search 창에 qt라고 검색해서 WITH 아래 WITH_QT를 체크해줍니다. WITH 옆에 화살표가 안보인다고 당황하지 마세요!

마음의 눈으로 화살표가 있을만한 왼쪽에 빈 공간을 눌러주면 아래 항목이 나옵니다.


또한 cmake로 검색해서 cmake 아래에 CMAKE_BUILD_TYPE에 Debug라고 씁니다. 그리고 Configure를 몇 번 더 눌러주세요.


Configure 다음은 Generate 입니다. 이건 한번만 실행하면 됩니다. 그럼 이렇게 빌드폴더에 갖가지 파일과 폴더.. 그리고 Makefile이 생겼음을 볼 수 있습니다.


이제 드뎌 진짜!! 빌드를 할 차례입니다.

윈도우키+R 로 "실행"을 실행시키고 cmd라고 쓰고 엔터!치면 콘솔창이 나옵니다. 그리고 아래와 같이 make 합니다.

>c:\opencv_249\opencv\build_qt_degub

>mingw32-make



그럼 한참동안 컴퓨터가 빌드하고 있을겁니다. 10분이상 걸릴테니 잠깐 딴짓을 해도 좋습니다.

그런데 제가 집컴에서는 빌드가 한방에 되는데 회사에서 하면 자꾸 중간에 멈춰서 진행이 안되고 다시 빌드하고 그런 것을 반복해야 했는데 왜 그런지는 모르겠습니다. 잘 되고 있나 한번씩 확인해주세요.

다 되고 나면 이런 화면이 뜰겁니다. 다음은 mingw32-make install 입니다. make install을 하면 빌드된 곳으로 소스코드까지 다 복사가 됩니다.


끝나면 결과는 이렇게...


이제 설치는 끝났습니다. 몇 가지 설정만 더 해주면 사용할 수 있습니다.

초반에 보였던대로 빌드해서 만든 opencv의 dll 파일들을 우리 프로젝트에 링크시킬려면 (즉 opencv를 사용하려면) 위에서 한대로 

시스템 속성 - 환경변수로 들어가서 Path에 다음 경로를 추가해야 합니다.

C:\opencv_249\opencv\build_qt_debug\bin


그리고 역시 재부팅을 해줍니다. 이걸 건너뛰고 프로그램을 실행하면 다음과 같은 메시지를 보며 한참을 머릴 쥐어뜯으며 구글을 헤메이게 될 것입니다.ㅎㅎ 

(절대 경험담 아님;;)


이제 드디어!! Qt를 켜봅시다.

QtOpenCVTest라는 Qt Widgets Application 프로젝트를 만들었습니다.


비주얼 스튜디오에서도 opencv를 사용할 때 프로젝트 속성에서 opencv 경로를 설정해줬듯이 Qt에서는 .pro 파일에서 경로를 지정합니다.

왼쪽 위에 QtOpenCVTest.pro 파일을 열어 다음 경로와  dll 파일들을 추가합니다. 아래 지정한 dll 파일들은 기본적인 것들이고 필요에 따라 빼거나 추가할 수 있습니다.

INCLUDEPATH += C:\opencv_249\opencv\build_qt_debug\install\include


LIBS += C:\opencv_249\opencv\build_qt_debug\bin\libopencv_calib3d249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_contrib249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_core249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_features2d249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_highgui249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_imgproc249d.dll \



반드시 프로젝트 파일을 수정한 후에는 Ctrl+S로 저장을 해줘야 효과가 나타납니다.

그리고 헤더 파일 mainwindow.h 에 opencv 헤더 파일을 인클루드합니다. 이후 예제를 위해 파일다이얼로그 클래스와 문자열 클래스도 추가합니다.

#include <opencv2/opencv.hpp>

#include <QFileDialog>

#include <QString>


이제 OpenCV를 쓸 수 있습니다. 위젯에 버튼하나 추가해서 버튼을 누르면 이미지 하나를 열어서 보여주는 예제를 만들겠습니다.

버튼하나 추가하고 우클릭 - Go to slot - clicked() 선택해서 연결함수를 생성합니다.


void MainWindow::on_pushButton_clicked()
{
    QString qsfileName = QFileDialog::getOpenFileName(this,
        tr("Open Image"), "../", tr("Image Files (*.png *.jpg *.bmp)"));
    cv::Mat image = cv::imread(qsfileName.toStdString());
    cv::imshow("Hello OpenCV", image);

}


파일 다이얼로그를 열어서 파일을 선택하고 그 파일을 열어서 보여주는 간단한 함수입니다. 파일명의 형태를 std::string으로 바꿔주기 위해 .toStdString() 함수가 들어갔습니다.

이제 실행해서 버튼을 누르고 이미지 파일을 열어봅시다. Voila!!


역시 비전 관련 예제는 레나가 나와야 제맛!!

여기까지 잘 따라오셨다면 축하합니다. 하지만 삽질은.. 이제부터 시작이겠죠?

별 내용도 아닌데 캡쳐로 도배를 했더니 페이지수만 많아졌네요;;

저도 이 과정을 완전히 이해한 것은 아니라 수정/태클/지적질 환영합니다.

그럼 다음 삽질때 봐요~

'QT > Examples' 카테고리의 다른 글

QT로 Serial 통신 구현하기 - 1  (0) 2015.04.15
Hello World를 띄우자.  (0) 2015.04.08
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,