차근차근/OpenCV

물체 모델 데이터베이스 만들기 예제소스 수정하기

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

첨부파일 (1)

http://blog.naver.com/action713/220059764181

저기 예제 소스를 실행 시켜보고자 한다.

 

1>------ 모두 다시 빌드 시작: 프로젝트: opencv2010, 구성: Debug Win32 ------
1>빌드 시작: 2014-07-22 오후 2:57:24
1>_PrepareForClean:
1>  "Debug\opencv2010.lastbuildstate" 파일을 삭제하고 있습니다.
1>InitializeBuildStatus:
1>  "Debug\opencv2010.unsuccessfulbuild"에 연결(touching)하고 있습니다.
1>ClCompile:
1>  test.cpp
1>  surftest.cpp
1>  stdafx.cpp
1>  modelDB.cpp
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(6): fatal error C1083: 포함 파일을 열 수 없습니다. 'dirent.h': No such file or directory
1>  코드를 생성하고 있습니다...
1>
1>빌드하지 못했습니다.
1>
1>경과 시간: 00:00:02.54
========== 모두 다시 빌드: 성공 0, 실패 1, 생략 0 ==========

 

 

에러 1.

fatal error C1083: 포함 파일을 열 수 없습니다. 'dirent.h': No such file or directory

http://palux.tistory.com/entry/fatal-error-C1083-%ED%8F%AC%ED%95%A8-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%97%B4-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4-stdafxh

http://msdn.microsoft.com/ko-kr/library/et4zwx34.aspx

http://tb.chan.je/253

 

 

 나의 해결 방법

다운 받은 dirent.h를 원하는 파일에 넣는다.

그리고 이렇게 바꿔서 적는다.

# include "opencv\dirent.h"

" "이건 사용자가 임의로 만든 include파일이란 뜻?

그리고 그 파일은 opencv라는 폴더 안에 있다~ 

 

 

 

1>------ 빌드 시작: 프로젝트: opencv2010, 구성: Debug Win32 ------
1>빌드 시작: 2014-07-22 오후 3:17:11
1>InitializeBuildStatus:
1>  "Debug\opencv2010.unsuccessfulbuild"에 연결(touching)하고 있습니다.
1>ClCompile:
1>  modelDB.cpp
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(30): error C2065: 'SURF_PARAM' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(31): error C2296: '&' : 왼쪽 피연산자 형식으로 'CvSeq **'을(를) 사용할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(31): error C2297: '&' : 오른쪽 피연산자 형식으로 'CvSeq *'을(를) 사용할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(31): error C2660: 'cvExtractSURF' : 함수는 5개의 매개 변수를 사용하지 않습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(43): error C2065: 'objId' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(45): error C2065: 'objId' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(45): warning C4129: ' ' : 문자 이스케이프 시퀀스를 인식할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(47): error C2065: 'objId' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(47): warning C4129: ' ' : 문자 이스케이프 시퀀스를 인식할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(49): error C2065: 'kp' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(49): error C2227: '->laplacian' 왼쪽은 클래스/구조체/공용 구조체/제네릭 형식을 가리켜야 합니다.
1>          ''unknown-type'' 형식입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(50): warning C4129: ' ' : 문자 이스케이프 시퀀스를 인식할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(52): error C2065: 'i' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(53): error C2065: 'd' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(53): error C2065: 'DIM' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(53): error C2065: 'd' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(53): error C2059: 구문 오류 : ')'
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(53): error C2143: 구문 오류 : ';'이(가) '{' 앞에 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(54): error C2065: 'd' : 선언되지 않은 식별자입니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(54): warning C4129: ' ' : 문자 이스케이프 시퀀스를 인식할 수 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(58): error C2059: 구문 오류 : 'return'
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(59): error C2059: 구문 오류 : '}'
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(59): error C2143: 구문 오류 : ';'이(가) '}' 앞에 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(59): error C2059: 구문 오류 : '}'
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(60): error C2143: 구문 오류 : ';'이(가) '{' 앞에 없습니다.
1>c:\uk1\vb2010\opencv2010\opencv2010\modeldb.cpp(60): error C2447: '{' : 함수 헤더가 없습니다. 이전 스타일의 형식 목록입니까?
1>
1>빌드하지 못했습니다.
1>
1>경과 시간: 00:00:01.84
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========

 

 

에러 1.

error C2296: '&' : 왼쪽 피연산자 형식으로 'CvSeq **'을(를) 사용할 수 없습니다.
error C2297: '&' : 오른쪽 피연산자 형식으로 'CvSeq *'을(를) 사용할 수 없습니다.

 

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

cvExtractSURF (img, 0 , & imageKeypoints , & imageDescriptors, storage, params); return 0 ; 이렇게 


 

에러 2.

warning C4129: ' ' : 문자 이스케이프 시퀀스를 인식할 수 없습니다.

http://msdn.microsoft.com/ko-kr/library/ew69e79d.aspx 

objFile << objId << " \ t " << filename << endl; 을

 

objFile << objId << " \\t " << filename << endl; 이렇게

 

 

 

에러 3.

 

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

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

objId , i ,d라는 변수가 대문자도 있고 소문자도 있어서 소문자로 통일

 

혹은 주석처리 되어 있던 선언들을 주석 풀었음

대소문자 일치안하는 것 일치시키고

띄어쓰기 잘못되어있는것 제대로함.

 

 

그리고 하나 남음/

error C3861: 'snprintf': 식별자를 찾을 수 없습니다.

http://blog.naver.com/netgarng88?Redirect=Log&logNo=20176314495

 

windows8에서 개발할떄

error C3861: 'snprintf': 식별자를 찾을 수 없습니다.

 

이런 에러가 발생했는데

원인은 타 버전과 호환성을 위해 바꼈다고 한다.

snprintf 말고 _snprintf로 쓰면 됨

stdio.h에 있는 대부분의 함수에  ' _ ' 를 넣어주면 해결된다.

 


 

# include <opencv\cv.h>
# include <opencv\highgui.h>
# include <iostream>
# include <fstream>
# include <sys/types.h>
# include <stdio.h>
# include "opencv\dirent.h"

using  namespace std;
const char * IMAGE_DIR = " caltech101_10 " ;
 const char * OBJ_FILE = "object.txt" ;        
 // 물체 ID 저장 파일
 const char * DESC_FILE = "description.txt" ; 
 // 특징 량 저장 파일
 const double SURF_PARAM = 400 ;  
 // SURF 매개 변수
 const int DIM = 128 ;            
 // SURF 특징 량의 차원 수
 /**
 * SURF 특징 량을 추출하는 *
 * @ param [in] filename 이미지 파일 이름
 * @ param [out] imageKeypoints 키 포인트 (출력에 대한 참조로 전달)
 * @ param [out] imageDescriptors 각 키 포인트 SURF 특징 량 (출력에 대한 참조로 전달)
 * @ param [out] storage Memory Storage (출력에 대한 참조로 전달) *
 * @ return 성공하면 0, 실패하면 1
 */
 int extractSURF ( char * filename, CvSeq * & imageKeypoints, CvSeq * & imageDescriptors, CvMemStorage * & storage) {
 // 그레이 스케일 이미지를로드
    IplImage * img = cvLoadImage (filename, CV_LOAD_IMAGE_GRAYSCALE);
 if (img == NULL ) {
        cerr << "cannot load image file :" << filename << endl;
         return 1 ;
    }
    storage = cvCreateMemStorage ( 0 );
    CvSURFParams params = cvSURFParams (SURF_PARAM, 1 );
    cvExtractSURF (img, 0 , & imageKeypoints , & imageDescriptors, storage, params);
 return 0 ;
} /**
  * 물체 모델을 파일에 저장 *
  * @ param [in] objId 개체 ID
  * @ param [in] filename 이미지 파일 이름
  * @ param [in] imageKeypoints 키포인트
  * @ param [in] imageDescriptors 각 키포인트의 특징 량
  * @ param [in] objFile 물체 ID 파일 핸들러
  * @ param [in] descFile 특징 량 파일 핸들러 *
  * @ return 성공하면 0, 실패하면 1
  */
 int saveFile ( int objId, char * filename, CvSeq * imageKeypoints, CvSeq * imageDescriptors, ofstream & objFile, ofstream & descFile) {
    cout << objId << " " << filename << " " << imageDescriptors-> total << endl;
 // 물체 ID 파일에 등록
    objFile << objId << "\\t" << filename << endl;
 // 개체 ID, 라플라시안 128 개의 숫자를 탭으로 구분 된 출력
 for ( int i = 0 ; i <imageDescriptors-> total; i ++) {  
 // 각 키포인트의 특징 량에 대해
 // 개체 ID
        descFile << objId << "\\t" ;

 // 특징점의 라플라시안 (SURF 특징 량은 벡터를 비교할 때 사용)
  const CvSURFPoint * kp = ( const CvSURFPoint *) cvGetSeqElem (imageKeypoints, i);
         int laplacian = kp ->laplacian;
        descFile << laplacian << "\\t" ;

 // 128 차원 벡터
  const float * descriptor = ( const float *) cvGetSeqElem (imageDescriptors, i) ;
         for ( int d = 0 ; d <DIM; d++) {
            descFile << descriptor [d] << "\\t" ;
        }
        descFile << endl;
    }
 return 0 ;
}
int main ( int argc, char ** argv ) {
     int ret;
  // 물체 ID 파일을 열
    ofstream objFile(OBJ_FILE);
    if (objFile.fail()) {
        cerr << "cannot open file: " << OBJ_FILE << endl;
        return 1;
    }
 // 특징 양 파일을 열
    ofstream descFile (DESC_FILE);
 if (descFile.fail ()) {
        cerr << "cannot open file :" << DESC_FILE << endl;
         return 1 ;
    }
 // IMAGE_DIR 이미지 파일 이름을 주사
 DIR * dp = opendir (IMAGE_DIR);
     if (dp == NULL ) {
        cerr << "cannot open directory :" << IMAGE_DIR << endl;
         return 1 ;
    }
  int objId = 0 ;  
  // 개체 ID
  struct dirent * entry;
     while ( 1 ) {
        entry = readdir (dp);
  if (entry == NULL ) {
             break ;
        }
  //와 .. 무시
      if (strncmp(entry->d_name, ".", 1) == 0 || strncmp(entry->d_name, "..", 2) == 0) {
             continue ;
        }
  char *filename = entry->d_name;
 
  // SURF 추출
  char buf[1024];
        _snprintf(buf, sizeof buf, "%s/%s", IMAGE_DIR, filename);
        CvSeq *imageKeypoints = 0;
        CvSeq *imageDescriptors = 0;
        CvMemStorage *storage = 0;
        ret = extractSURF(buf, imageKeypoints, imageDescriptors, storage);
        if (ret != 0) {
            cerr << "cannot extract surf description" << endl;
            return 1;
        }
  // 파일에 출력
        ret = saveFile (objId, filename, imageKeypoints, imageDescriptors, objFile, descFile);
  if (ret != 0 ) {
            cerr << "cannot save surf description" << endl;
             return 1 ;
        } // 뒤처리
    cvClearSeq(imageKeypoints);
        cvClearSeq(imageDescriptors);
        cvReleaseMemStorage(&storage);

        objId++;

    }

    objFile.close ();
    descFile.close ();
    closedir (dp);

 return 0 ;
}


반응형