PTAM/PTAMM 컴파일하기

영상처리 2014. 4. 1. 21:17

이 글은 PTAM과 PTAMM 소스코드를 컴파일하는 방법에 관한 글입니다. PTAM/PTAMM에 대한 이론적인 내용에 대해서는 [영상처리] - PTAM(Parallel Tracking and Mapping)과 PTAMM 글을 참조하기 바랍니다.


PTAM/PTAMM은 이것저것 사용하는 라이브러리가 많고 또 대부분 리눅스 계열의 라이브러리라 윈도우즈 환경에서 컴파일하려면 조금 복잡한 과정을 필요로 합니다 (제가 해보니 PTAM의 경우는 비교적 손쉽게 컴파일이 가능했지만 PTAMM은 libpng 때문에 조금 애를 먹었습니다).



먼저, PTAM과 PTAMM에서 공통으로 필요로 하는 공통 라이브러리 빌드 과정을 설명한 후에, PTAM 과 PTAMM 빌드 방법을 하나씩 설명하도록 하겠습니다 (글에 설명된 순서대로 설치).


저의 컴파일 환경은 Windows 7(32비트 시스템)에서 visual studio 2008(with service pack1)을 이용하였지만 다른 윈도우즈 환경 및 visual studio 버전에서도 큰 차이는 없을 것으로 생각합니다.



1. PTAM/PTAMM 공통 라이브러리 세팅


(1) 소스코드 및 메뉴얼 다운로드


(2) 핵심 라이브러리 다운로드(TooN, libCVD, Gvars3)

  • cvs(라이브러리 다운로드 툴) 설치: http://ftp.gnu.org/non-gnu/cvs/binary/stable/x86-woe/ 에서 cvs 최신버전(cvs-1-11-22.zip) 다운로드 후 압축해제하면 cvs.exe 파일이 생성됨
  • cvs.exe 파일이 존재하는 위치에서 도스 명령창 실행(Shift+마우스우클릭 후 '여기서 명령창 열기' 선택)후 다음 3개의 명령어를 하나씩 입력하여 TooN, libCVD, GVars3를 다운로드

cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/toon co -D "Mon May 11 16:29:26 BST 2009" TooN

cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/libcvd co -D "Mon May 11 16:29:26 BST 2009" libcvd

cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/libcvd co -D "Mon May 11 16:29:26 BST 2009" gvars3

  • 한줄씩 복사한 후 도스창에서 마우스 우클릭 '붙여넣기'를 이용하면 편리함
  • 다운로드가 완료도면 현재 폴더 밑에 TooN, libcvd, gvars3라는 3개의 폴더가 생성됨


(3) 폴더 구조 생성

  • ptam_include, ptam_lib, ptam_bin이라는 이름으로 3개의 폴더를 생성
  • ptam_include: PTAM을 컴파일하기 위해 필요한 라이브러리 헤더 파일들을 저장하기 위한 폴더
  • ptam_lib: PTAM을 컴파일하기 위해 팰요한 lib 파일들을 저장하기 위한 폴더
  • ptam_bin: PTAM을 실행하는데 필요한 dll 파일들을 저장하기 위한 폴더

※ 최종적인 폴더 내용

+---ptam_include

    |   jconfig.h

    |   jerror.h

    |   jmorecfg.h

    |   jpeglib.h

    |   lib3ds.h

    |   png.h

    |   pngconf.h

    |   pthread.h

    |   sched.h

    |   semaphore.h

    |   zconf.h

    |   zlib.h

    +---cvd

        |    (lots of cvd files and directories)

    +---GL

        |    glew.h

        |    glxew.h

        |    wglew.h

    +---gvars3

        |    (lots of gvars3 header files)

    +---opencv

        |    (lots of opencv header files)

    +---opencv2

        |    (lots of opencv files and directories)

    +---PGR

        |    (lots of pgr files and directories)

    +---TooN

        |    (lots of toon files and directories)


+---ptam_lib

    |   FlyCapture2.lib

    |   glew32.lib

    |   gvars3.lib

    |   lib3ds-2_0.lib

    |   libblas.lib

    |   libcvd.lib

    |   libjpeg.lib

    |   liblapack.lib

    |   libpng.lib

    |   opencv_core244.lib

    |   opencv_highgui244.lib

    |   pthreadVCE2.lib

    |   zlib.lib


+---ptam_bin

    |   calibrator_settings.cfg

    |   camera.cfg

    |   CameraCalibrator.exe

    |   FlyCapture2.dll

    |   glew32.dll

    |   lib3ds-2_0.dll

    |   libblas.dll

    |   libgcc_s_dw2-1.dll

    |   libgfortran-3.dll

    |   liblapack.dll

    |   liblapacke.dll

    |   libpng12.dll

    |   opencv_core244.dll

    |   opencv_highgui244.dll

    |   PTAM.exe

    |   PTAMM.exe

    |   pthreadVCE2.dll

    |   settings.cfg

    |   zlib1.dll

    +---ARData


(4) 기타 라이브러리 다운로드 및 설치

- Lapack and BLAS: http://icl.cs.utk.edu/lapack-for-windows/lapack/index.html#lapacke (LAPACKE examples)

  . LAPACKE_examples/lib/ 밑의 *.lib 파일들을 ptam_lib 폴더로 복사

  . LAPACKE_examples/Release/ 밑의 모든 *.dll 파일들을 ptam_bin 폴더로 복사


- pthreads: http://sourceware.org/pthreads-win32/ (pthreads-w32-2-9-1-release.zip)

  . Pre-built.2\include\ 에 있는 *.h 파일들을 ptam_include 폴더에 복사

  . Pre-built.2\lib\x86\ 에 있는 *.lib 파일들을 ptam_lib 폴더에 복사

  . Pre-built.2\dll\x86\ 에 있는 *.dll 파일들을 ptam_bin 폴더에 복사


- GLEW: http://glew.sourceforge.net/ (glew-1.10.0-win32.zip)

  . glew-1.10.0/include/ 밑의 GL 폴더 전체를 ptam_include 밑에 복사 (ptam_include/GL)

  . glew-1.10.0/lib/Release/Win32/ 의 *.lib 파일들을 ptam_lib 폴더에 복사

  . glew-1.10.0/bin/Release/Win32/ 의 *.dll 파일을 ptam_bin 폴더에 복사


- lib3ds: https://code.google.com/p/lib3ds/ (lib3ds-20080909.zip)

  . lib3ds-20080909/의 lib3ds.sln를 열어서 release 모드로 컴파일

  . lib3ds-20080909/release/lib3ds-2_0.lib를 ptam_lib 폴더로 복사

  . lib3ds-20080909/release/lib3ds-2_0.dll을 ptam_bin 폴더로 복사

  . lib3ds-20080909/src/lib3ds.h를 ptam_include 폴더로 복사


- libpng: http://gnuwin32.sourceforge.net/packages/libpng.htm (libpng-1.2.37-setup.exe)

  . libpng-1.2.37-setup.exe 실행하여 libpng 설치

  . GnuWin32/include/ 의 png.h, pngconf.h를 ptam_include 폴더로 복사

  . GnuWin32/lib/의 libpng.lib를 ptam_lib 폴더로 복사

  . GnuWin32/lib/의 *.dll 을 ptam_bin 폴더로 복사 (libpng12.dll, zlib1.dll)


(5) TooN 설치

  • TooN 폴더 전체를 ptam_include 폴더 밑에 복사 (ptam_include/TooN)
  • ptam_include/TooN/internals/config.hh 파일을 열어서 다음 줄을 추가

#define TOON_USE_LAPACK 1


(6) libCVD 컴파일

- libcvd/build/vc2005/에 있는 libcvd.sln 프로젝트 파일 오픈 (자신의 visual studio 버전에 맞게 프로젝트 변환이 발생할 수 있음)

- 빌드 설정을 release로 변경

- config.h 파일을 열어서 CVD_HAVE_PNG가 define되도록 29줄, 33줄을 주석처리

//#if 0  // FIXME: compile libz and libpng

#ifndef CVD_DISABLE_PNG

    #define CVD_HAVE_PNG 1

#endif

//#endif

  • libcvd/pnm_src/ 에 있는 pnc.cc, fits.cc, text.cxx, text_write.cc를 프로젝트에 추가
  • 프로젝트 설정에서 ptam_include 폴더를 include path에 추가
  • opencv/3rdparty/libjpeg/ 에서 *.h 파일들을 ptam_include 폴더에 복사 (jconfig.h, jerror.h, jmorecfg.h, jpeglib.h)
  • opencv/3rdparty/zlib/ 에서 zlib.h 파일을 ptam_include 폴더에 복사 (zlib.h)
  • opencv/3rdparty/zlib/zconf.h.cmakein를 zconf.h로 이름을 변경하여 ptam_include 폴더에 복사
  • ptam_include/zconf.h 파일을 열어서 다음의 두 줄을 주석처리:

//#cmakedefine Z_PREFIX

//#cmakedefine Z_HAVE_UNISTD_H

  • 컴파일에 성공하면,

  . libcvd/lib/ 밑에 생성된 libcvd.lib 파일을 ptam_lib 폴더로 복사

  . libcvd/cvd 폴더 전체를 ptam_include 폴더 밑으로 복사 (ptam_include/cvd)


(7) Gvars3 컴파일

  • gvars3/build/vc2005/에 있는 gvars3.sln 프로젝트 파일 오픈 (자신의 visual studio 버전에 맞게 프로젝트 변환이 발생할 수 있음)
  • 빌드 설정을 release로 변경
  • GUI_Fltk2.h, GUI_Fltk2.cc 2개의 파일을 프로젝트에서 제거
  • gvars3/gvars3/config.h.in 파일을 config.h로 이름 변경후, 파일 내용을 아래와 같이 수정

#ifndef GVARS3_INCLUDE_CONFIG_H

#define GVARS3_INCLUDE_CONFIG_H

#define GVARS3_HAVE_TOON 1

#endif

  • 프로젝트 설정에서 ptam_include 폴더를 include path에 추가
  • 컴파일했을 때, error C2064: term does not evaluate to a function taking 0 arguments 라는 에러가 발생하면 gvars3.h 261번째 줄(template<class T> static T& get(const std::string& name, const T& default_val=DefaultValue<T>::val(), int flags=0);)을 아래와 같이 수정

template<class T> static T& get(const std::string& name, const T& default_val=T(), int flags=0);

  • 컴파일에 성공하면

  . gvars3/lib/ 에 생성된 *.lib를 ptam_lib 폴더로 복사 (gvars3.lib, gvars3-headless.lib)

  . gvars3/gvars3 폴더 전체를 ptam_include 폴더 밑으로 복사 (ptam_include/gvars3)



2. PTAM 컴파일 및 실행


(1) PTAM 컴파일

  • PTAM/Build/Win32/ 폴더의 모든 파일들을 PTAM/ 으로 복사
  • PTAM/ 에서 PTAM.sln 프로젝트 파일 오픈 (자신의 visual studio 버전에 맞게 프로젝트 변환이 발생할 수 있음)
  • 빌드 설정을 release로 변경
  • 프로젝트 설정(CameraCalibrator & PTAM 모두)에서 다음을 수정

   . ptam_include 폴더를 include path에 추가

   . ptam_lib 폴더를 library path에 추가

  • 프로젝트 설정(CameraCalibrator & PTAM 모두)에서 library depenency를 다음과 같이 수정

   . 1394camera.lib 제거

   . blas_win32.lib를 libblas.lib로 이름변경

   . lapack_win32.lib를 liblapack.lib로 이름변경


이후 과정은 영상입력장치에 따라 다음과 같이 달라짐(여기서는 opencv를 이용하여 webcam과 연동하는 경우와 Point Grey 카메라를 이용하는 두 가지 경우에 대해서만 설명)


※ 영상 입력장치 세팅 방법

  • http://ewokrampage.wordpress.com/video-sources/ 에서 자신의 카메라에 맞는 비디오 입력소스를 다운로드
  • 1394 카메라(Unibrain Fire-i): 디폴트로 포함된 VideoSource_Win32_CMU1394.cc 파일을 그대로 사용
  • Web 카메라(OpenCV 인터페이스 이용): VideoSource_Linux_OpenCV.cc 다운로드
  • Point Grey 카메라: VideoSource_Win32_PointGrey.cc 다운로드
  • Web 카메라(direct show 이용): VideoSource_Win32_LibVideoInput.cc 다운로드
  • 다운받은 *.cc 파일로 VideoSource_Win32_CMU1394.cc를 대체: CameraCalibrator 프로젝트와 PTAM 프로젝트 모두에서 VideoSource_Win32_CMU1394.cc를 제거한 후 다운받은 *.cc를 두 프로젝트에 추가


(1-1) OpenCV 인터페이스 사용한 웹캠 이용시 이후 과정

  • VideoSource_Linux_OpenCV.cc를 프로젝트에 추가 (기존 VideoSource_Win32_CMU1394.cc은 제거)
  • VideoSource_Linux_OpenCV.cc의 20번째 줄을 주석처리

//#include <cvd/Linux/v4lbuffer.h>

  • opencv 다운로드 및 설치 (필요시): http://opencv.org/downloads.html
  • opencv/build/include/ 밑의 opencv, opencv2 폴더를 ptam_include 폴더에 복사
  • opencv/build/x86/vc9/lib/ 밑의 opencv_coreXXX.lib, opencv_highguiXXX.lib 를 ptam_lib 폴더에 복사
  • opencv/build/x86/vc9/lib/ 밑의 opencv_coreXXX.dll, opencv_highguiXXX.dll 를 ptam_lib 폴더에 복사
  • 이후 PTAM 컴파일해서 성공하면 OK!!


(1-2) Point Grey 카메라 이용시 이후 과정

  • VideoSource_Win32_PointGrey.cc를 프로젝트에 추가 (기존 VideoSource_Win32_CMU1394.cc은 제거)
  • Point Grey 카메라의 FlyCapture2 라이브러리 설치 (필요시)
  • ptam_include 폴더 밑에 PGR 폴더 생성하고 Point Grey Research/FlyCapture2/include/ 폴더에 있는 파일 전체를 PGR 폴더에 복사
  • Point Grey Research/FlyCapture2/lib/의 FlyCapture2.lib를 ptam_lib 폴더에 복사
  • Point Grey Research/FlyCapture2/bin/의 FlyCapture2.dll을 ptam_bin 폴더에 복사
  • 프로젝트 설정(CameraCalibrator & PTAM 모두) library depenency에 FlyCapture2.lib를 추가
  • 이후 PTAM 컴파일해서 성공하면 OK!!


(2) PTAM 실행

  • 컴파일에 성공하면 PTAM/release/의 PTAM.exe와 CameraCalibrator.exe를 ptam_bin 폴더에 복사
  • PTAM/ 밑의 calibrator_settings.cfg, settings.cfg 두 파일을 ptam_bin 폴더에 복사
  • 캘리브레이션 패턴 인쇄: PTAM/calib_pattern.pdf 파일
  • 카메라 캘리브레이션: CameraCalibrator.exe를 실행하여 캘리브레이션 수행 (카메라의 자동초점 기능을 끄고 할 것)
  • PTAM.exe 실행



3. PTAMM 컴파일 및 실행


PTAM의 경우와 거의 유사하지만 조금씩 다른 부분이 있으니 내용을 주의깊게 읽어보기 바랍니다.


(1) PTAMM 컴파일

  • PTAMM/Build/Win32/ 폴더의 모든 파일들을 PTAMM/ 으로 복사
  • PTAMM/ 에서 PTAMM.sln 프로젝트 파일 오픈 (자신의 visual studio 버전에 맞게 프로젝트 변환이 발생할 수 있음, PTAMM.sln이 마우스 더블클릭으로 열리지 않을 경우에는 visual studio를 먼저 실행시킨 후에 프로젝트 오픈)
  • 빌드 설정을 release로 변경
  • 프로젝트 설정(CameraCalibrator & PTAMM 모두)에서 다음을 수정

   . ptam_include 폴더를 include path에 추가

   . ptam_lib 폴더를 library path에 추가

  • 프로젝트 설정(CameraCalibrator & PTAMM 모두)에서 library depenency를 다음과 같이 수정

   . 1394camera.lib 제거

   . blas_win32_MT.lib를 libblas.lib로 이름변경

   . jpeg.lib를 libjpeg.lib로 이름변경

   . lapack_win32_MT.lib를 liblapack.lib로 이름변경

   . zlib.lib 추가

  • opencv/build/x86/vc9/staticlib/에서 zlib.lib, libjpeg.lib를 ptam_lib 폴더에 복사 (자신의 visual studio 버전에 맞게 적절한 파일을 찾아서 복사)


이후 과정은 PTAM 경우처럼 영상입력장치에 따라 다음과 같이 달라짐:


(1-1) OpenCV 인터페이스 사용한 웹캠 이용시 이후 과정

  • VideoSource_Linux_OpenCV.cc를 프로젝트에 추가 (기존 VideoSource_Win32_CMU1394.cc은 제거)
  • VideoSource_Linux_OpenCV.cc의 20번째 줄을 주석처리

//#include <cvd/Linux/v4lbuffer.h>

  • VideoSource_Linux_OpenCV.cc의 30번째 줄에 using namespace PTAMM;을 추가

using namespace PTAMM;

  • opencv 다운로드 및 설치 (필요시): http://opencv.org/downloads.html
  • opencv/build/include/ 밑의 opencv, opencv2 폴더를 ptam_include 폴더에 복사
  • opencv/build/x86/vc9/lib/ 밑의 opencv_coreXXX.lib, opencv_highguiXXX.lib 를 ptam_lib 폴더에 복사
  • opencv/build/x86/vc9/lib/ 밑의 opencv_coreXXX.dll, opencv_highguiXXX.dll 를 ptam_lib 폴더에 복사
  • 이후 PTAMM 컴파일해서 성공하면 OK!!


(1-2) Point Grey 카메라 이용시 이후 과정

  • VideoSource_Win32_PointGrey.cc를 프로젝트에 추가 (기존 VideoSource_Win32_CMU1394.cc은 제거)
  • VideoSource_Win32_PointGrey.cc의 18번째 줄에 using namespace PTAMM;을 추가

using namespace PTAMM;

  • Point Grey 카메라의 FlyCapture2 라이브러리 설치 (필요시)
  • ptam_include 폴더 밑에 PGR 폴더 생성하고 Point Grey Research/FlyCapture2/include/ 폴더에 있는 파일 전체를 PGR 폴더에 복사
  • Point Grey Research/FlyCapture2/lib/의 FlyCapture2.lib를 ptam_lib 폴더에 복사
  • Point Grey Research/FlyCapture2/bin/의 FlyCapture2.dll을 ptam_bin 폴더에 복사
  • 프로젝트 설정(CameraCalibrator & PTAMM 모두) library depenency에 FlyCapture2.lib를 추가
  • 이후 PTAMM 컴파일해서 성공하면 OK!!


(2) PTAMM 실행

  •  컴파일에 성공하면 PTAMM/release/의 PTAMM.exe와 CameraCalibrator.exe를 ptam_bin 폴더에 복사
  • PTAMM/ 밑의 calibrator_settings.cfg, settings.cfg 두 파일을 ptam_bin 폴더에 복사
  • PTAMM/ARData 폴더 전체를 ptam_bin 폴더 밑으로 복사 (ptam_bin/ARData)
  • 캘리브레이션 패턴 인쇄: PTAMM/calib_pattern.pdf 파일
  • 카메라 캘리브레이션: CameraCalibrator.exe를 실행 (카메라의 자동초점 기능을 끄고 할 것, PTAM에서 캘리브레이션한 결과를 그대로 사용해도 됨)
  • PTAMM.exe 실행



4. PTAM/PTAMM용 카메라 캘리브레이션


PTAM에서는 fisheye 카메라 왜곡모델을 사용하기 때문에 흔히 사용하는 polynomial 모델의 카메라 파라미터는 사용할 수 없습니다. 따라서, PTAM에서 제공하는 캘리브레이션 프로그램을 이용해야만 하는데.. 이게 많이 불편합니다. 속도도 너무 느리고 하나라도 이미지를 잘못 획득하면 처음부터 다시 시작해야 합니다. 그래서 편리하게 fisheye 모델 파라미터를 구할 수 있는 프로그램을 직접 구현해 보았습니다 ([개발한 것들] - 카메라 캘리브레이션 프로그램 (DarkCamCalibrator)). 단, 프로그램에서 구한 fx, fy, cx, cy 값을 이미지 해상도로 나눈 후 PTAM/PTAMM에 대입해야 합니다 (fx, cx는 이미지 폭으로 나누고 fy, cy는 이미지 높이로 나눠줘야 함).



5. PTAM/PTAMM 실행파일


혹시 위와 같은 번잡한 컴파일 과정없이 성능 및 동작 여부만 테스트하고자 하는 분들을 위해 제가 컴파일한 PTAM/PTAMM 실행파일을 첨부합니다(실행에 필요한 모든 실행환경 포함). 첨부한 실행파일은 웹캠을 이용한 PTAM, Point Grey 카메라를 이용한 PTAM, 웹캠을 이용한 PTAMM, Point Grey 카메라를 이용한 PTAMM 이렇게 4개 버전입니다.


PTAM_PTAMM.zip



☞ 제가 돌려보니 PTAM, PTAMM 모두 잘 동작합니다. 카메라를 캘리브레이션 할때는 속도가 느리지만 실제 PTAM, PTAMM을 돌릴 때는 실시간으로 동작합니다. 단, PTAMM의 경우 맵을 여러개 사용하는 것은 아직 테스트해보지 못했습니다.


by 다크 프로그래머


'영상처리' 카테고리의 다른 글

영상 특징점(keypoint) 추출방법  (192) 2014.04.10
PTAM(Parallel Tracking and Mapping)과 PTAMM  (10) 2014.03.30
Bag of Words 기법  (53) 2014.02.19