|
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://msdn.microsoft.com/ko-kr/library/et4zwx34.aspx
나의 해결 방법
다운 받은 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 ;
}
'차근차근 > OpenCV' 카테고리의 다른 글
SURF 추출 예제 소스 사용하기 (0) | 2014.07.30 |
---|---|
[c] 헤더파일 선언 < > 와 " " 차이 (0) | 2014.07.30 |
비슷한 이미지 검색 시스템을 만들자 (0) | 2014.07.30 |
c++ 이미지 불러오기 경로 설정 (0) | 2014.07.30 |
OpenCV 편하게 사용하기 (팁) (0) | 2014.07.30 |