http://blog.naver.com/eotls4387/30033016323

vector는 배열과 비슷한데, 사이즈를 자유자재로 바꿀 수 있고, 정렬도 가능

vector를 사용하기 위해 아래가 필수..

#include <vector>
using namespace std; // 요걸 반드시 써줘야함..

Posted by 우주여행가
,
간혹 c로 작성된 소스의 특정 함수내에서 어떤 변수가 어떤 값을 갖는지 궁금할 때가 있다.

어떻게 확인하느냐는 스타일 나름인데.. 난 디버깅보다는 Afxmessagebox() 사용을 선호한다. 
(breakpoint 잡기의 귀차니즘으로..)

하지만 cpp가 아닌 c로 작성된 소스에서는 Afxmessagebox()를 쓸 수 없으므로

Messagebox()를 사용하면 된다.

MessageBox를 사용하기 위해서는

#include <windows.h> 를 추가

int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)


첫번째 인수 hWnd는 메시지 박스를 소유한 윈도우, 이 윈도우의 중앙에 메시지 박스가 나타난다.
특별한 이유 없다면 NULL을 쓰면 된다.

두번째 인수 lpText : 출력할 문자열

세번째 인수 lpCaption : 메시지박스의 이름 (아무거나 해도 무방)

네번째 인수 uType : 아이콘, 버튼 등을 선택 , MB_OK 로 하면 OK버튼이 나온다... 

헉.. 근데..MB.... OK ??????????


중요한것은 두번째 인수인데..


예를 들어 MFC 기반의 c++ 이라면 


double v 의 값을 알고 싶다면..


CString chk;

chk.Format("v = %lf", v);

AfxMessageBox(chk)를 통해 v의 값을 알아낼 수 있다.



MessageBox의 경우라면..


char *gcvt(double value, int ndec, char *buf); 이 함수를 이용하면 된다.

 첫번째 인자는 변환할 double형 값입니다.
두번째 인자는 전체 몇자리를 문자열로 바꿀것인가를 지정합니다.
세번째는 바꾼 문자열이 저장될 버퍼입니다.
리턴값은 buf로 주어진 버퍼의 포인터입니다.

출처 : 

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68359592&qb=TFBDVFNUUiBkb3VibGU=&enc=utf8&section=kin&rank=2&search_sort=0&spq=0&pid=gnHU/doi5U4ssuvk4c4sss--153210&sid=TP5SvPNL-kwAADRVEI4



char buf[256];
gcvt(v, 10, buf);

MessageBox (NULL, buf, "title", MB_OK);


이런식..




Posted by 우주여행가
,
CWinAppEx VS2008 Sp1설치 후 
MFC project를 생성하면 Wizard가 생성하는 code중 약간 바뀐 부분이 있습니다.

App는 CWinAppEx(기존에는 CWinApp를 상속)를 상속받고
stdafx.h에 #include <afxcontrolbars.h>가 추가됩니다.

그런데 문제는 VS2008 sp1에서 생성한 project를
VS2008 sp1이 설치되지 않은 computer에서 compile할 경우
Error가 발생한다는 점입니다.
stxafx.h에 afxcontrolbars.h를 찾을 수 없어 Compile Error가 발생합니다.

이 때는 간단히 수정할 수 있습니다.
1. CWinAppEx를 CWinApp로 고치고
2. #include <afxcontrolbars.h>를 삭제해줍니다.

그런데 의문이 드는 것은
MSDN에서 CWinAppEx를 찾아보니 afxwinappex.h를 필요로 하고 있습니다.
왜 VS2008가 afxcontrolbars.h를 include했는지 궁금하네요

한번 찾아봐야겠네요

Posted by 우주여행가
,
Rob Hess의 SIFT open source를 보다가..

kdtree.c 에

함수 static struct kd_node* explore_to_leaf( struct kd_node* kd_node, struct feature* feat,
struct min_pq* min_pq )

에서 오류를 발견하였다.

이 함수에 아래와 같은 라인이 있는데..
if( minpq_insert( min_pq, unexpl, ABS( kv - feat->descr[ki] ) ) ) 

여기서 Rob Hess가 사용하고 있는 utils.h에서 ABS의 정의는 

#ifndef ABS
#define ABS(x) ( ( x < 0 )? -x : x )
#endif

사실 올바른 정의는 

#ifndef ABS
#define ABS(x) ( ( x < 0 )? -1*(x) : x )
#endif

이다.


이런식으로 정의를 안했기에..

ABS( kv - feat->descr[ki]) 에서 
kv - feat->descr[ki] 가 음수일경우

-kv + feat->descr[ki] 로 양수값으로 key가 들어가지 않고

-kv - feat->descr[ki] 로 음수의 key값이 들어간다. 

ABS의 정의를 고치던..


ABS( kv - feat->descr[ki] )를  ABS( (kv - feat->descr[ki]) )

로 고쳐야한다..

사실 BBF의 NN 탐색회수가 KDTREE_BBF_MAX_NN_CHKS = 200 으로 default 값으로 
define 되어있어서 영상에 feature points가 많지 않다면 성능에 크게 지장은 없다.

하지만 minimizing priority queue에서 key (항상 양수) 값을 기준으로 정렬하는데,

여기 음수인 key값이 들어간다면 BBF를 이용한 matching 과정에서 

실제로 가깝지 않은 node들이 가깝다고 판단되어 탐색하게 되는 비효율성이 발생하게 된다.

이 경우, KDTREE_BBF_MAX_NN_CHKS  를 낮게 설정하였거나

영상의 전체 feature points 갯수가 충분히 많다면 성능에 큰 영향을 끼칠 수도 있다.


- Rob Hess의 답장



- Update된 SIFT


- Change log
12/7일 ABS() bug 고쳤다고..


Posted by 우주여행가
,
Dialog 형식의 프로그램 기준으로

CXXXXXXApp::Initlnstance(() 내부에

AfxInitRichEdit2();

이 함수를 추가해주면 해결된다.
Posted by 우주여행가
,
Tip] gdi+ error, about min, max | OpenCV 2.x
2009.10.22 00:09

2.0 설치하고 기존 프로젝트를 빌드하는중 gdi+ 관련 에러가 나는데....

 

1>c:\program files\microsoft sdks\windows\v6.1\include\gdiplustypes.h(470) : error C3861: 'min': identifier not found
1>c:\program files\microsoft sdks\windows\v6.1\include\gdiplustypes.h(471) : error C3861: 'min': identifier not found

 

기존

#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <GdiPlus.h>

 

 

가 아래 내려와 있으면 min, max 매크로를 openCV 것으로 대체해서 에러가 나더군요.

 

그래서

#include <GdiPlus.h>

#include <cv.h>
#include <highgui.h>
#include <cxcore.h>

 

이런식으로 뒤집으면 됩니다. -_-a

 

너무 간단한거라 -_-;;


출처 : 오픈cv 네이버 카페

Posted by 우주여행가
,
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

c소스를 추가 시켰더니 이런 에러가 뜬다..

c소스 상단에 #include "stdafx.h" 를 추가했더니 또 cpp에서만 쓸 수 있는 거라 뭐라뭐라..

그래서 그냥 깔끔하게 아래와 같이 함 

빌드 시 에러

"~~~ fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?"

VC++외의 컴파일러에서 빌드하였거나 다른 스타일(obj c같은 경우?)로 작성된 라이브러리를 링크하면 위와 같은 건방지고 친절한(?) 에러가 발생하는 경우가 있다.

빠른 빌드를 위한 PCH (precompiled header)가 없어서 난다는데,

안내문대로 "stdafx.h"를 include 해주거나

project property -> Configuration Properties -> C/C++ -> Precompiled headers -> Create/Use Precompiled header 를
Not Using Precompiled Headers로 바꿔주면 된다.
(그전에는 아마 Use Precompiled Header (/Yu) 로 되어있을 것이다.)

Posted by 우주여행가
,

c소스를 추가시켜서 빌드했더니 자꾸 

error LNK2001: unresolved external symbol  가 떠서 extern C를 썼더니 해결



[c, c++]extern "C" 에 관하여...
출처:http://jimbo73.egloos.com

extern "C"에 대하여 알아보자.

컴파일러는 링커가 링킹작업시 오브젝트간 함수 이용 및 위치를 파악할 수 있도록, 컴파일시 사용된 함수에 관련한 정보를 오브젝트 파일에 기록하며, 이러한 정보를 linkage라고 한다.

그런데 C 와 C++을 혼합하여 사용 시, 함수이용에 문제가 발생할수 있는데, 이는 두 언어간의 linkage방식이 틀리는데 기인한다.

linkage이란 컴파일 시 함수이름 앞 또는 뒤에 '_' 등의 심볼을 덧붙이는 것을 말하는것으로, C 와 C++은 컴파일시 오브젝트 파일에 함수명, 변수명등에 심볼을 기록하는 방식이 다르다.

C에서는 함수의 이름이 유일하기 때문에(즉 overloading을 지원하지 않기때문에) 함수 앞에 '_' 등의 심볼만을 붙이면 된다. 하지만 C++에서는 overloading을 지원하기 때문에 같은 이름의 함수를 여러개 가질 수 있으므로, 이에 따라 함수를 구분하기 위해서는, 함수이름만으로 구분할 수 없게된다. 그러므로 인자의 개수와 데이터형에 대한 정보까지 넣게되어(이러한 방식을 mangled name이라한다.), linkage 정보가 상이하게 된다.

그러므로 C와 C++ 을 혼합하는 프로그램에서는, link시 함수명을 각각의 방식으로 찾을 수 있도록 C인지, C++인지를 명시해주어야 하며, 이때 extern "C" 는 linkage에 대한 지시자 역할을 한다.

extern "C"는 C++의 linkage방식을 사용하지 않고, C의 linkage방식을 사용하라고 컴파일러에게 알려주는 역할을 한다.

#ifdef __cplusplus
extern "C" {
#endif

int func1();
int func2();

#ifdef __cplusplus
}
#endif 
Posted by 우주여행가
,


[OpenCV 질문] BYTE 로 오는 이미지를 Iplimage로 바꾸기
[출처] BYTE 로 오는 이미지를 Iplimage로 바꾸기 (OpenCV KOREA 대한민국 최고의 컴퓨터비젼 커뮤니티) |작성자 정훈
 
 
http://cafe.naver.com/opencv/7140  
 
안녕하세요 ^^

들어와서 가끔씩 모르는거만 찾아보다가 오늘 처음 글적는게 또 질문이 되네요

다른게 아니고 현재 BYTE형식의 이미지를 받아와서 Iplimage로 변환을 하려고 하는데요. 막히네요

영상을 캡쳐해서 이미지는 BYTE value[640*480*3]으로 넘기구요. 이걸 가지고 작업을 하려고 하는데

Iplimage 형식으로 변환을 해야 작업이 진행되는데 변환할수 있는 함수나 참고 할만한게 있으면 조언좀 부탁드리겠습니다.

질문을 하면서도 횡설수설 한거 같네요 ;; 양해 부탁드립니다.

고수님들의 조언좀 부탁드려요

 작성자의 카페글 더보기

 
 김대진
2008/11/03 11:13

cvCreateImage(...);
cvSetImageDate(...);

하면 됩니다...

 정훈

자답 : Iplimage* srcImg = cvCreateImageHeader(cvSize(640, 480), IPL_DEPTH_8U, 3);
cvSetImageData(srcImg, (BYTE)BufferImg, WIDTHBYTES(640*IPL_DEPTH_8U*3));
cvFlip(srcImg, NULL, 0);
srcImg->origin = 0;
이렇게 하니 되네요 ^^ 답변 주신분 감사합니다.


네이버 opencv 카페에서 구한대로 해봤더니.. 계속 cvReleaseImage에서 에러가 났다..


밑에 참고 링크를 뒤져보니.. 이 경우엔 cvReleaseImage 대신 cvReleaseImageHeader를 써야 한단다.


예를 들어


IplImage *cloth_save = cvCreateImageHeader(cvSize(100,100),IPL_DEPTH_8U,3);

cvSetImageData(cloth_save,cimg,WIDTHBYTES(100*IPL_DEPTH_8U*3));

cvFlip(cloth_save,NULL,0);

cloth_save->origin = 0;

cvSaveImage(clothname,cloth_save);

cvReleaseImageHeader(&cloth_save);

delete[] cimg;

 


참고 :

http://opencv-users.1802565.n2.nabble.com/c-cvReleaseImage-td2415881.html



최종적으로 내가 쓴 코드..

참고로 내가 사용한 BYTE 어레이는 이미지가 순서대로 되어있고 (즉 뒤집혀서 들어온걸 보정해준 것) 이고 ,

 RGB 순서로 들어있었다..


IplImage *cloth_save = cvCreateImageHeader(cvSize(fd.wck[j],fd.hck[j]),IPL_DEPTH_8U,3);

cvSetImageData(cloth_save,fd.detected_clothRGBk[j],WIDTHBYTES(fd.wck[j]*IPL_DEPTH_8U*3));

cloth_save->widthStep = fd.wck[j]*3;

// 영상 width 가 4의 배수가 아닌 경우 제대로 되지 않아서 수정해줌..

cvSetImageData(cloth_save,fd.detected_clothRGBk[j],cloth_save->widthStep);

cvCvtColor(cloth_save,cloth_save,CV_RGB2BGR);

cvSaveImage(clothname,cloth_save);

cvReleaseImageHeader(&cloth_save);

Posted by 우주여행가
,

유용하게 써먹었던 기능...

행렬을 통채로 txt로 저장시키기.. 

>> save u2_mapping_16_3.txt a -ascii

아쉽게도.. int형으로는 안되는듯...

그냥 엑셀로 옮겨서 서식을 숫자로 바꾸면 int형으로 볼 수있긴 하다....



MATLAB관련 주요명령 및 행렬 입력 방법

http://blog.naver.com/yaho1524/60088402143



Posted by 우주여행가
,