'OpenCV'에 해당되는 글 13건

  1. 2009.02.16 Rob Hess의 SIFT [1] 1
  2. 2009.01.06 MAC에서 OpenCV를 컴파일 하기
  3. 2009.01.03 XcodeでOpenCV開発
Computer Vision2009. 2. 16. 14:59

Rob HessSIFT


1. 살펴 보기


SIFTScale ... 을 의미하는 것이고...자세한 내용은 다음에 기회되는 대로 정리해서 올리도록 하겠습니다.



인터넷에 찾아보면 여러가지 버전의 구현된 코드를 찾아볼 수 있습니다.

귀찮게도 C로 되어 있는것 보단 MATLAB이나 C#같은 것으로 되어 있어서 상당히 귀찬습니다.


이번에 발견하여 분석한 코드는 Rob Hess의 코드이며, C로 되어 있습니다. 


Rob Hess는 오래곤 주립대학의 컴퓨터 공학과 박사과정 학생으로 컴퓨터 비젼을 전공으로 하고 있습니다.

홈 페이지는 이곳에 있습니다.


http://web.engr.oregonstate.edu/~hess/index.html


홈페이지에 보면 몇가지 알고리듬을 공부하고 올려놓았지만, 가장 관심이 가는것은  SIFT입니다.


최신 버전은 2009년 1월에 1.1.1을 만들었습니다. 이전 버전과 바뀐 부분은


라이브러리를 정적으로 만들 수 있도록 Makefile을 수정한 부분과,

Visual C를 VC2005에서 컴파일 되도록 하였다는 부분

그외에 API들을 수정하여서 버그들을 정리했다고합니다.


소스 코드는 리눅스 버전과 윈도우즈 버전의 코드를 가지고 있고 각각 이 곳에서 받을 수 있습니다.


리눅스 버전 : TAR.GZ

윈도우즈 버전 : ZIP


이 SIFT 버전은 OpenCV 에 기반하고 있으며  RANSAC 은 GNU Scientific Lib에 기반하고 있습니다.

이제 아래 그램을 보면 SIFT가 무엇을 하는 지에 대해서 알 수 있습니다



    

사용자 삽입 이미지 사용자 삽입 이미지

왼쪽의 카드를 오른쪽의 그림 더미에서 찾아내는 것입니다.

아래 그림을 다시 보면


    

사용자 삽입 이미지 사용자 삽입 이미지


이 되어서 원하는 이미지가 있는 위치를 정확하게 찾아 낼 수 있습니다.


1. 코드의 컴파일


컴파일을 할려면 Visual C++에서 먼저 컴파일을 하였습니다.

우선 VC Project 를 로드하여 컴파일을 하면 다음과 같이 에러가 발생합니다.


LINK : fatal error LNK1104: cannot open file 'cvd.lib'


해당 라이브러리를 찾을 수 없다는 의미이고,

이 라이브러리는 opencv debug lib을 의미합니다.



2. OpenCV 설치



2.1 다운로드 및 설치


OpenCV를 다운로드 합니다.


Source Forge에서 다운로드 합니다.

아래 사이트에서 다운 받을 수 있습니다.


http://sourceforge.net/projects/opencvlibrary


여기서 윈도우즈 버전을 다운받아서 설치합니다. 실행 파일로 되어 있으므로 그렇게 어렵지는 않을듯 합니다.

설치 중간에 환경 변수 세팅을 물어보므로, 그때 YES라고 해서 설치를 합니다.


설치가 끝나면 View Documents를 보게 됩니다.


C:\Program Files\OpenCV\docs\index.htm


링크이므로 틈틈히 찾아보면 정보를 얻을 수 있습니다.


2.2 디버깅 라이브러리 만들기



설치된 코드는 실행 코드이다. 개발시에는 디버깅용 코드가 필요하므로 디버깅 버전의 라이브러리를 만드러야 한다.


c:\Program Files\OpenCV\_make


폴더에 가서 opencv.dsw를 클릭합니다.


그러면 버전문제에 대한 문의 다이얼로그가 나타난다. 모두 YES라고 선택하면 된다.

그러면 다음과 같은 창이 나타난다.


사용자 삽입 이미지


그럼 이제 BUILD->Batch Build를 선택하면 다음과 같은 창이 나타난다.


사용자 삽입 이미지


그럼 win32 ReleaseWin 32 Debug를 모두 선태한다.

이후에 Build를 눌러서 라이브러리를 모두 컴파일 한다.



경고도 나타나지만 무시하고 진행하면 컴파일이 완료된다.


2.3 라이브러리 오류 수정


실제로 깨끗하게 완료된것이 아니다.


ompiling...

cvbgfg_acmmm2003.cpp

.\cvbgfg_acmmm2003.cpp(464) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'

        c:\Program Files\OpenCV\cvaux\include\cvaux.h(1301) : see declaration of 'CvFGDStatModel'

.\cvbgfg_acmmm2003.cpp(470) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'

        c:\Program Files\OpenCV\cvaux\include\cvaux.h(1301) : see declaration of 'CvFGDStatModel'

cvbgfg_gaussmix.cpp

.\cvbgfg_gaussmix.cpp(348) : error C2039: 'foreground_regions' : is not a member of 'CvGaussBGModel'

        c:\Program Files\OpenCV\cvaux\include\cvaux.h(1365) : see declaration of 'CvGaussBGModel'

Generating Code...


과 같이 오류가 발생합니다. 이전 버전에도 있던 오류인데 아직도 살아있다는게 놀라울 따름입니다.

하여튼 수정합니다.


cvaux.h : 1159 행 부근을 보면


#define CV_BG_STAT_MODEL_FIELDS()                                                   \

    int             type; /*type of BG model*/                                      \

    CvReleaseBGStatModel release;                                                   \

    CvUpdateBGStatModel update;                                                     \

    IplImage*       background;   /*8UC3 reference background image*/               \

    IplImage*       foreground;   /*8UC1 foreground image*/                         \

    IplImage**      layers;       /*8UC3 reference background image, can be null */ \

    int             layer_count;  /* can be zero */                                 \

    CvMemStorage*   storage;      /*storage for 밼oreground_regions?/              \

    CvSeq*          foreground_regions /*foreground object contours*

/


이 있습니다. 여기서


    CvMemStorage*   storage;      /*storage for 밼oreground_regions?/              \



    CvMemStorage*   storage;      /*storage for 밼oreground_regions*/              \


으로 바꿉니다.


이번에는 잘 진행합니다.


2.4 라이브러리 오류 수정


컴파일 끝에 2개가 컴파일이 안되었다고 나옵니다.

나온것을 보면


   Creating library ..\..\lib/highgui.lib and object ..\..\lib/highgui.exp

cvcap.obj : error LNK2019: unresolved external symbol "struct CvCapture * __cdecl cvCreateCameraCapture_DShow(int)" (?cvCreateCameraCapture_DShow@@YAPAUCvCapture@@H@Z) referenced in function _cvCreateCameraCapture

..\..\bin/highgui110.dll : fatal error LNK1120: 1 unresolved externals

Build log was saved at "file://c:\Program Files\OpenCV\_temp\highgui_Release\BuildLog.htm"

highgui - 2 error(s), 0 warning(s)

------ Build started: Project: highgui, Configuration: Debug Win32 ------

Linking...

   Creating library ..\..\lib/highguid.lib and object ..\..\lib/highguid.exp

cvcap.obj : error LNK2019: unresolved external symbol "struct CvCapture * __cdecl cvCreateCameraCapture_DShow(int)" (?cvCreateCameraCapture_DShow@@YAPAUCvCapture@@H@Z) referenced in function _cvCreateCameraCapture

..\..\bin/highgui110d.dll : fatal error LNK1120: 1 unresolved externals

Build log was saved at "file://c:\Program Files\OpenCV\_temp\highgui_Debug\BuildLog.htm"


으로 되어 있습니다.


이것은 cvcap_dshow.cpp 파일이 highgui project에 포함되어 있지 않아서 생긴 오류이다.

src에 이것을 추가합니다.


사용자 삽입 이미지

위의 그림처럼 추가하면 됩니다.


그래도 오류가 발생하는데 일단 라이브러리를 추가합니다.


C:\Program Files\OpenCV\otherlibs\_graphics\lib


그리고 다시 컴파일을 하면 역쉬 에러가 나옵니다.


cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: void __thiscall videoInput::stopDevice(int)" (?stopDevice@videoInput@@QAEXH@Z) referenced in function "public: virtual void __thiscall CvCaptureCAM_DShow::close(void)" (?close@CvCaptureCAM_DShow@@UAEXXZ)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: bool __thiscall videoInput::isDeviceSetup(int)" (?isDeviceSetup@videoInput@@QAE_NH@Z) referenced in function "public: virtual bool __thiscall CvCaptureCAM_DShow::open(int)" (?open@CvCaptureCAM_DShow@@UAE_NH@Z)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: bool __thiscall videoInput::setupDevice(int)" (?setupDevice@videoInput@@QAE_NH@Z) referenced in function "public: virtual bool __thiscall CvCaptureCAM_DShow::open(int)" (?open@CvCaptureCAM_DShow@@UAE_NH@Z)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: bool __thiscall videoInput::getPixels(int,unsigned char *,bool,bool)" (?getPixels@videoInput@@QAE_NHPAE_N1@Z) referenced in function "public: virtual struct _IplImage * __thiscall CvCaptureCAM_DShow::retrieveFrame(void)" (?retrieveFrame@CvCaptureCAM_DShow@@UAEPAU_IplImage@@XZ)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: int __thiscall videoInput::getHeight(int)" (?getHeight@videoInput@@QAEHH@Z) referenced in function "public: virtual struct _IplImage * __thiscall CvCaptureCAM_DShow::retrieveFrame(void)" (?retrieveFrame@CvCaptureCAM_DShow@@UAEPAU_IplImage@@XZ)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: int __thiscall videoInput::getWidth(int)" (?getWidth@videoInput@@QAEHH@Z) referenced in function "public: virtual struct _IplImage * __thiscall CvCaptureCAM_DShow::retrieveFrame(void)" (?retrieveFrame@CvCaptureCAM_DShow@@UAEPAU_IplImage@@XZ)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: bool __thiscall videoInput::setupDevice(int,int,int)" (?setupDevice@videoInput@@QAE_NHHH@Z) referenced in function "public: virtual bool __thiscall CvCaptureCAM_DShow::setProperty(int,double)" (?setProperty@CvCaptureCAM_DShow@@UAE_NHN@Z)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: static void __cdecl videoInput::setVerbose(bool)" (?setVerbose@videoInput@@SAX_N@Z) referenced in function "public: __thiscall SuppressVideoInputMessages::SuppressVideoInputMessages(void)" (??0SuppressVideoInputMessages@@QAE@XZ)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: __thiscall videoInput::videoInput(void)" (??0videoInput@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'protected: static class videoInput CvCaptureCAM_DShow::VI''(void)" (??__E?VI@CvCaptureCAM_DShow@@1VvideoInput@@A@@YAXXZ)

cvcap_dshow.obj : error LNK2019: unresolved external symbol "public: __thiscall videoInput::~videoInput(void)" (??1videoInput@@QAE@XZ) referenced in function "void __cdecl `dynamic atexit destructor for 'protected: static class videoInput CvCaptureCAM_DShow::VI''(void)" (??__F?VI@CvCaptureCAM_DShow@@1VvideoInput@@A@@YAXXZ)

..\..\bin/highgui110d.dll : fatal error LNK1120: 10 unresolved externals


과 같이 에러가 발생한다.


소스 파일을 찾아서 잘 보면 모두 VIDEO INPUT을 직접 받을때 사용하는 함수들 입니다. 

현시점에서 외부에서 직접 비디오 입력을 받을 일이 없으므로 그냥 넘어가서


_highgui,h파일에서 다음과 같이 수정한다.


#if _MSC_VER >= 1400 && !defined WIN64

#define HAVE_VIDEOINPUT 1

#endif



#if _MSC_VER >= 1400 && !defined WIN64

#ifdef HAVE_VIDEOINPUT

#  undef HAVE_VIDEOINPUT

#endif


//#define HAVE_VIDEOINPUT 1


#endif


으로 수정해서 막아버리고 컴파일 하면.. 잘 됩니다.




3 OpenCV 환경 설정


할때마다 컴파일 환경을 잡아주는 것이 귀찮으므로 일단 전체 환경 설정을 한번 하여줍니다.


3.1 헤더 파일 폴더의 추가


Tools-> Opetions을 선택하여 나타난 다이얼로그 박스에서 Directories 탭을 선택합니다

Tools->Options을 선택하여 나타난 다이얼로그 박스에서 Projects and Solutions 항목의 VC++ Directories를 선택하면 아래와 같은 창이 됩니다.


사용자 삽입 이미지



Platform에 Win 32를 Show Directories에 Includes files를 선택한 후에

새로운 Header File Folder를 선택합니다.


C:\Program Files\OpenCV\_make

C:\Program Files\OpenCV\cv\include

C:\Program Files\OpenCV\cvaux\include

C:\Program Files\OpenCV\cxcore\include

C:\Program Files\OpenCV\ml\include

C:\Program Files\OpenCV\otherlibs\highgui

C:\Program Files\OpenCV\otherlibs\ffopencv

C:\Program Files\OpenCV\otherlibs\_graphics\include


을 모두 설치합니다.



3.2 라이브러리 폴더 추가


이번에는 라이브러리 폴더를 같은 방법으로 추가합니다.


사용자 삽입 이미지


위의 그림과 같이 Library Files를 선택한 뒤에


C:\Program Files\OpenCV\lib


을 추가합니다.


이렇게 하면 준비가 끝났습니다.


4. 다시 컴파일


SIFT를 다시 컴파일 하면 이번엔 잘 된다.


실행하면 다음과 같은 오류가 나타난다.


사용자 삽입 이미지


이것은 환경 변수에 PATH를 다음것을 추가합니다.


C:\Program Files\OpenCV\bin



5. 다시 실행


이제 SIFT를 다시실행한다.

그럼 아래 그림이 나타난다.


사용자 삽입 이미지


이제 정상적으로 컴파일이 되었다.



아래 그림은 약간 수정한 코드로 만든 이미지입니다.

잘 동작하고 있습니다.

사용자 삽입 이미지





'Computer Vision' 카테고리의 다른 글

Rob Hess의 SIFT [3]  (2) 2009.02.23
Rob Hess의 SIFT [2]  (0) 2009.02.18
MAC에서 OpenCV를 컴파일 하기  (0) 2009.01.06
XcodeでOpenCV開発  (0) 2009.01.03
파노라마 구성하기  (0) 2009.01.03
Posted by GUNDAM_IM
Computer Vision2009. 1. 6. 08:53

MAC에서 OpenCV를 컴파일 하기


맥에서 OpenCV를 컴파일 


http://opencv.willowgarage.com/wiki/Mac_OS_X_OpenCV_Port


이 페이지를 참조로 따라가면서 컴파일한다.




1. 시작은 OpenCV의 위키 페이지에서 시작한다.

   

    http://opencv.willowgarage.com/wiki/


   여기에서 올려져 있는 글을 찬찬이 읽어보면 많은 도움이 된다.


2. Learning OpenCV: Computer Vision with the OpenCV Library

  • by Gary Bradski and Adrian Kaehler, O'Reilly Press, October, 2008.
  •    
  •    책으로 잘 나온 것은 오라일리의 책입니다. 사실상 매뉴얼이라고 생각되고요,  OpenCV사이트에서도
  •    매뉴얼 대신으로 추천해주는 책입니다.

3.   다운로드는 SVN으로 한다. 


     http://sourceforge.net/svn/?group_id=22870

 

     페이지에 가면 다운 받을 수 있는 커맨드가 있다. 이것을 이용하여 다운 받는다.


    svn co https://opencvlibrary.svn.sourceforge.net/svnroot/opencvlibrary opencvlibrary


  이 커맨드는 전체를 모두 다운 받는 것이다. 전체라 함은 브랜치라던가 프리베타 버전과 같은 불필요한 부분까지 모두 다운 받은 것을 말합니다.

   처음에는 폴더 구조 가은 것을 잘 모르므로, 그냥 한번 정도는 다운 받아 폴더 구조를 보는 것도 도움이 된다.


   위의 커맨드를 넣으면 OpenCV를 다운 받을 수 있다.


   아래 사이트에서도 다운 받을 수 있다. 


   http://sourceforge.net/project/showfiles.php?group_id=22870


   이 글을 쓰는 현재 시점에서 최신 버전은 1.1pre 버전이다.


   여기서는 후자인 tar파일을 직접 다운받아서 진행한다.


   


4. compile

    일단 다른 폴더에서 빌드를 한다.

    

     mkdir build

     cd build

     ../opencv-1.1.0/configure CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib"



      make


     한참을 컴파일 하고 끝난다.


   sudo make install


      끝나면 위와 같이 인스톨을 한다.

     

5. 테스트 해보기

     

    인스톨이 끝나면 다음과 같이 확인을 해 볼 수 있다.


    샘플용 소스 코드를 다운 받는다. 

    일일이 코딩하기 귀찮으므로 그냥 간단히 다운 받는다. 

    인터넷에서 OpenCV sample을 서치하면 아래 사이트를 발견할 수 있다.


    http://www.netaro.info/techinfo/OpenCV/src/index.html


    여기에 가면 적당한 예제가 있다. 다운 받은 폴더에 가면 ZIP파일로 되어 있고 이것을 압축을 푼다.


    컴파일을 하면 다음과 같은 오류가 발생한다.


GUNDAMMACPRO:edgedetect kevinIm$ make

gcc -c -g -Wall sampleEdge.c

gcc -o simpleedge sampleEdge.o -lhighgui -lopencv

ld: library not found for -lopencv


   Makefile 을 보면 몇가지 잘못된 옵션이 있다. 버전차이라고 생각된다.. 일단 Makefile을 아래와 같이 수정한다.


   gcc -o simpleedge sampleEdge.o -L/usr/local/lib -lhighgui -lcv -lcvaux -lcxcore


   == WAS == 

  LDFLAGS = -lhighgui -lopencv -L/usr/local/lib


   == IS ==

  LDFLAGS = -lhighgui -lcv -lcvaux -lcxcore -L/usr/local/lib


   그리고 컴파일하면 다음과 같이 나온다.


GUNDAMMACPRO:edgedetect kevinIm$ make

gcc -c -g -Wall InteractiveEdgeDetect.c

InteractiveEdgeDetect.c:18: warning: ‘ltval’ defined but not used

InteractiveEdgeDetect.c:19: warning: ‘htval’ defined but not used

gcc -o intedge InteractiveEdgeDetect.o -lhighgui -lcv -lcvaux -lcxcore -L/usr/local/lib


   실행은 간단하게 해본다.

 

아래 그림은 실행한 결과이다. 

윤곽선을 추출하는 예제이다.


사용자 삽입 이미지


사용자 삽입 이미지

'Computer Vision' 카테고리의 다른 글

Rob Hess의 SIFT [3]  (2) 2009.02.23
Rob Hess의 SIFT [2]  (0) 2009.02.18
Rob Hess의 SIFT [1]  (1) 2009.02.16
XcodeでOpenCV開発  (0) 2009.01.03
파노라마 구성하기  (0) 2009.01.03
Posted by GUNDAM_IM
Computer Vision2009. 1. 3. 23:36
이번에 발견한 것은 OpenCV의 개발 환경을 XCODE에 통합하는 것입니다.  요기를참조

일본 사이트이고요.. .일본은 그나마 맥 환경이 우리보다는 좋아서 이런 저런 내용이 많이 있습니다.
일본어를 모르셔도.. .그림만 따라가면 해볼 수 있습니다.

요새는 일본 애니와 망가의 영향으로 일본어는 제 2 외국어가 아니기 땜에, 
큰 부담은 없으리라 생각합니다. 


'Computer Vision' 카테고리의 다른 글

Rob Hess의 SIFT [3]  (2) 2009.02.23
Rob Hess의 SIFT [2]  (0) 2009.02.18
Rob Hess의 SIFT [1]  (1) 2009.02.16
MAC에서 OpenCV를 컴파일 하기  (0) 2009.01.06
파노라마 구성하기  (0) 2009.01.03
Posted by GUNDAM_IM