차근차근/OpenCV

SURF 추출 예제 소스 사용하기

예쁜꽃이피었으면 2014. 7. 30. 10:02

http://blog.naver.com/action713/220059761072 이곳의 소스를 실행해 보고자 한다.

 

1>------ 빌드 시작: 프로젝트: opencv2010, 구성: Debug Win32 ------
1>빌드 시작: 2014-07-22 오전 10:06:13
1>InitializeBuildStatus:
1>  "Debug\opencv2010.unsuccessfulbuild"에 연결(touching)하고 있습니다.
1>ClCompile:
1>  surftest.cpp
1>c:\opencv\build\include\opencv2\flann\dist.h : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
1>c:\opencv\build\include\opencv2\flann\dist.h : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
1>c:\opencv\build\include\opencv2\flann\dist.h : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
1>c:\opencv\build\include\opencv2\flann\dist.h : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(6): error C2871: 'Std' : 같은 이름을 가진 네임스페이스가 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(18): error C2065: 'fstream' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(18): error C2146: 구문 오류 : ';'이(가) 'fout' 식별자 앞에 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(18): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(20): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(20): error C2228: '.open' 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다.
1>          ''unknown-type'' 형식입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(20): error C2653: 'ios' : 클래스 또는 네임스페이스 이름이 아닙니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(20): error C2065: 'out' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(21): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(21): error C2228: '.is_open' 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다.
1>          ''unknown-type'' 형식입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(22): error C2065: 'cerr' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(22): error C2065: 'endl' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(27): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(27): error C2137: 문자 상수가 비어 있습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(27): error C2065: 'endl' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(30): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(30): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(30): error C2059: 구문 오류 : ')'
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(30): error C2143: 구문 오류 : ';'이(가) '{' 앞에 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(31): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(32): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(34): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(34): error C2137: 문자 상수가 비어 있습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(34): error C2059: 구문 오류 : '>'
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(34): error C2137: 문자 상수가 비어 있습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(34): error C2137: 문자 상수가 비어 있습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(34): error C2137: 문자 상수가 비어 있습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(36): error C2065: 'j' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(36): error C2065: 'j' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(36): error C2059: 구문 오류 : ')'
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(36): error C2143: 구문 오류 : ';'이(가) '{' 앞에 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(37): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(37): error C2065: 'j' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(37): error C2137: 문자 상수가 비어 있습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(39): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(39): error C2065: 'endl' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(42): error C2065: 'fout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(42): error C2228: '.close' 왼쪽에는 클래스/구조체/공용 구조체가 있어야 합니다.
1>          ''unknown-type'' 형식입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(52): error C2065: 'cerr' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(52): error C2065: 'endl' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(59): error C2065: 'cerr' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(59): error C2065: 'endl' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(69): error C2296: '&' : 왼쪽 피연산자 형식으로 'CvSeq **'을(를) 사용할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(69): error C2297: '&' : 오른쪽 피연산자 형식으로 'CvSeq *'을(를) 사용할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(69): error C2660: 'cvExtractSURF' : 함수는 5개의 매개 변수를 사용하지 않습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(70): error C2065: 'cout' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(70): error C2065: 'endl' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(76): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(76): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(76): error C2059: 구문 오류 : ')'
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(76): error C2143: 구문 오류 : ';'이(가) '{' 앞에 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(77): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(82): error C2065: 'radius' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\surftest.cpp(83): error C2065: 'radius' : 선언되지 않은 식별자입니다.
1>  stdafx.cpp
1>  코드를 생성하고 있습니다...
1>
1>빌드하지 못했습니다.
1>
1>경과 시간: 00:00:01.25
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========

 

 

그런데..온갖 에러가 난다..

잡아가야지..

 

 

에러 1.

1>warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
http://gandus.tistory.com/607 

해결방법

프로젝트 -> 속성 -> 구성속성 -> C/C++ -> 고급 -> 특정 경고 사용 안 함에 "4819" 에러 코드를 입력합니다

 

 

에러 2.

1> error C2871: 'Std' : 같은 이름을 가진 네임스페이스가 없습니다.
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=303012&ref=303012

using namespace std; // 여기다 선언하는게 아닙니다. 이 시점에서는 네임스페이스를 알 수가 없지요

                                 // 헤더에 선언되어 있는데 어떻게 알겠습니까?

#include <iostream>

using namespace std; // 여기다 선언해주셔야죠.

// 아니면 using std::cout; 으로 해줘도 좋고요. 이 경우엔 말이죠

int main()

{

        cout << "Hello, World!\n";

        return 0;

}

 

혹은

#include "stdafx.h" 추가하시고, stdafx.cpp를 먼저 컴파일 해주세요. 프로젝트에서 stdafx.cpp 우클릭 컴파일...

 

찾다보니 내 경우에는 std를 Std라고 써서 에러가 났던 것이다.

=====> 이부분만 수정해도 많은 빨간 줄이 사라졌다.

 

 

 

에러 3.

1>error C2137: 문자 상수가 비어 있습니다.

http://msdn.microsoft.com/ko-kr/library/fhxwbt0t(v=vs.90).aspx

'' 이렇게 되어 있는 부분에서 에러가 났는데

' ' 이런식으로 빈공간을 주거나

"" 큰따옴표로 바꿔줬더니 빨간줄은 사라졌다. 그러나. 맞게 한 것인지는 모르겠다.

 

 

에러 4.

error C2065: 'i' : 선언되지 않은 식별자입니다.
error C2065: 'j' : 선언되지 않은 식별자입니다.

http://cer3214.tistory.com/entry/error-C2065-i-%EC%84%A0%EC%96%B8%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EC%8B%9D%EB%B3%84%EC%9E%90%EC%9E%85%EB%8B%88%EB%8B%A4

[속성] - [구성속성]-[c/c++]-[언어] "for 루프 범위 강제 규칙"을 예 에서 아니오 로 변경

 

나의 경우 아니오를 했어도 에러가 났다..

보니까 선언은 대문자로 변수?는 소문자로 암튼 뒤죽박죽이라 소문자로 통일했더니 사라졌다.

 

 

 

에러 5.

error C2059: 구문 오류 : ')'
for문의 조건문 마지막에 나던 에러인데..

i + + 라고 되어 있어서

다닥다닥 붙여주었다..

 

에러 6.

error C2059: 구문 오류 : '>'

fout << point-> pt.x << "" << point- > pt.y << "" << point-> size << "" << point-> laplacian << "" ;
 이거 에서

fout << point-> pt.x << "" << point-> pt.y << "" << point-> size << "" << point-> laplacian << "" ;
        로 수정..

 

        

 

에러 7.

error C2296: '&' : 왼쪽 피연산자 형식으로 'CvSeq **'을(를) 사용할 수 없습니다.
error C2297: '&' : 오른쪽 피연산자 형식으로 'CvSeq *'을(를) 사용할 수 없습니다.
error C2660: 'cvExtractSURF' : 함수는 5개의 매개 변수를 사용하지 않습니다. 

cvExtractSURF (grayImage, 0 , & imageKeypoints & imageDescriptors, storage, params); 을   

cvExtractSURF (grayImage, 0 , &imageKeypoints , &imageDescriptors, storage, params); 으로 변경
 

 

에러 8.

 error C2065: 'radius' : 선언되지 않은 식별자입니다.

선언은 대문자로

사용할 땐 소문자로 되어있어서

소문자로 통일.

 

 

 

 

 

 

 

 

다 끝난줄 알았는데..빌드해보니..

 

1>------ 빌드 시작: 프로젝트: opencv2010, 구성: Debug Win32 ------
1>빌드 시작: 2014-07-22 오전 10:53:07
1>InitializeBuildStatus:
1>  "Debug\opencv2010.unsuccessfulbuild"에 연결(touching)하고 있습니다.
1>ClCompile:
1>  surftest.cpp
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: _main 외부 기호(참조 위치: ___tmainCRTStartup 함수)에서 확인하지 못했습니다.
1>C:\uk1\vb2010\opencv2010\Debug\opencv2010.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.
1>
1>빌드하지 못했습니다.
1>
1>경과 시간: 00:00:01.97
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========

 

 

Main 이러고 쓰여있어서

main으로 수정.

성공함.

 

이건 혹시나 해서

http://phiru.tistory.com/160

저 에러가 나는 경우는 두 가지라고 함.

1.메인함수의 이름이 다르다

2,환경 설정이 잘못되었다.

1) 만들 떄 콘솔로 만들었다면

[속성] - [c/c++] - [전처리기] - [전처리기 정의]에서 _CONSOLE를 _WINDOWS로 바꾼다.

2)

[속성] - [링커] - [시스템] 하위시스템에서 콘솔로 되어 있으면 WINDOWS로 바꾼다.

 

 

 

 

 

 

 

 

 

 

# include <opencv\cv.h>
# include <opencv\highgui.h>
# include <iostream>
# include <fstream>

using namespace std;
//using  namespace Std; Std라고쓰면 에러
//using std::cout;
const  int DIM_VECTOR = 128 ;  
// 128 차원 벡터

/**
* SURF 정보를 파일에 출력
* @ param [in] filename SURF를 저장할 파일 이름
* @ param [in] imageKeypoints SURF 키포인트 정보
* @ param [in] imageDescriptors SURF 특징 벡터 정보
* @ return 없음
*/


void writeSURF ( const  char * filename, CvSeq * imageKeypoints, CvSeq * imageDescriptors) {
    fstream fout;

    fout.open (filename, ios :: out);
    if (! fout.is_open ()) {
        cerr << "cannot open file :" << filename << endl;
         return ;
    }

    // 첫 번째 행은 키 포인트 수와 특징 량의 차원 수를 기록
    fout << imageKeypoints-> total << "" << DIM_VECTOR << endl;

    // 두 번째 행에서 키포인트 정보와 특징 벡터를 기록
    for ( int i = 0 ; i <imageKeypoints-> total; i ++) {
        CvSURFPoint * point = (CvSURFPoint *) cvGetSeqElem (imageKeypoints, i);
        float * descriptor = ( float *) cvGetSeqElem (imageDescriptors, i);
         // 키 포인트 정보 (X 좌표, Y 좌표, 크기, 라플라시안)를 기록
        fout << point-> pt.x << "" << point-> pt.y << "" << point-> size << "" << point-> laplacian << "" ;
         // 특징 벡터를 기록
        for ( int j = 0 ; j <DIM_VECTOR; j ++) {
            fout << descriptor [j] << "" ;
        }
        fout << endl;
    }

    fout.close ();
}

int main ( int argc, char ** argv) {
     const char* imageFile = argc == 3 ? argv[1] : "image/accordion_image_0001.jpg"; <-폴더위치모름
    const char* surfFile  = argc == 3 ? argv[2] : "image/accordion_image_0001.surf"; <-폴더위치모름

    // SURF 추출 용 이미지를 그레이 스케일로로드
    IplImage * grayImage = cvLoadImage (imageFile, CV_LOAD_IMAGE_GRAYSCALE);
    if (! grayImage) {
        cerr << "cannot find image file :" << imageFile << endl;
         return - 1 ;
    }

    // 키 포인트 그리기 용 색상도로드
    IplImage * colorImage = cvLoadImage (imageFile, CV_LOAD_IMAGE_COLOR);
    if (! colorImage) {
        cerr << "cannot find image file :" << imageFile << endl;
         return - 1 ;
    }

    CvMemStorage * storage = cvCreateMemStorage ( 0 );
    CvSeq * imageKeypoints = 0 ;
    CvSeq * imageDescriptors = 0 ;
    CvSURFParams params = cvSURFParams ( 500 , 1 );

    // 이미지에서 SURF를 가져
    cvExtractSURF (grayImage, 0 , & imageKeypoints, & imageDescriptors, storage, params);
    cout << "Image Descriptors :" << imageDescriptors-> total << endl;

    // SURF를 파일로 출력
    writeSURF (surfFile, imageKeypoints, imageDescriptors);

    // 이미지에 키 포인트를 그리기
    for ( int i = 0 ; i <imageKeypoints-> total; i ++) {
        CvSURFPoint * point = (CvSURFPoint *) cvGetSeqElem (imageKeypoints, i);
        CvPoint center;   // 키포인트의 중심 좌표
        int radius;       // 키포인트의 반경
        center.x = cvRound (point-> pt.x);
        center.y = cvRound (point-> pt.y);
        radius = cvRound (point-> size * 1.2 / 9.0 * 2.0 );
        cvCircle (colorImage, center, radius, cvScalar ( 0 , 255 , 255 ), 1 , 8 , 0 );
    }

    cvNamedWindow ( "SURF" );
    cvShowImage ( "SURF" , colorImage);
    cvWaitKey ( 0 );

    // 뒤처리
    cvReleaseImage (& grayImage);
    cvReleaseImage (& colorImage);
    cvClearSeq (imageKeypoints);
    cvClearSeq (imageDescriptors);
    cvReleaseMemStorage (& storage);
    cvDestroyAllWindows ();

    return  0 ;
}

 

반응형