현재 진행중에 있는 프로젝트에서 CString -> wchar_t 으로 변환하여 스트링을 복사해야하는 상황을 맞이하게 되었다.

 

이리저리 찾아보다가, 한 블로그에서 그 실마리를 찾았는데,

 

참조(네이버블로그) : http://blog.naver.com/skywood1?Redirect=Log&logNo=100129022023

 

바로 위에 링크를 건 블로그에서 그 해답을 찾을 수 있었다.

 

 

 

 

size_t mbstowcs(

wchar_t *wcstr,        //Output

const char *mbstr,    //Input

size_t Count            //Size

);

 

해답은 바로 이 함수인데, 멀티바이트 스트링(MBS)을 와이드 캐릭터 스트링(WCS)으로 변경해주는 함수이다.

 

참조(MSDN) : http://msdn.microsoft.com/ko-kr/library/k1f9b8cy.aspx

 

 

 

 

하지만 나는 Cstring 에서 wchar_t로 변경해야하기때문에, 한번 더 변환을 해줘야했다.

 

CString str="test";
char *text = (char*)((LPCSTR)str); 

 

 

 

 

따라서 결과적으로 CString -> char* -> wchar_t총 3번변경을 해줌으로써 문제를 해결할 수 있었다.

 

CString str="Hand/Finger Tracking and Gesture Recognition";
wchar_t wstr[256] = {};

int nLen = str.GetLength()+1;

mbstowcs(wstr,(char*)((LPCSTR)str), nLen);

 

 

 

 

Posted by Tommy™
,

오랫만에 포스팅입니다.

 

오늘 포스팅 주제는..

 

How to count the FPS (frame per second), 즉 FPS를 어떻게 구할 수 있을까 입니다.

 

제가 제안하는 방식은 clock_t 를 활용하는 방식입니다.

 

먼저 old_time을 구하는데, clock() 함수를 통해 구합니다.

 

그리고 현재 curr_time을 구하는데, 역시 같은 함수를 사용합니다.

 

이때 핵심이 (curr_time - old_time) / 1000 해주는겁니다.

 

1000은 1초를 밀리 세컨드, 그니깐 1000밀리 초로 계산해주는겁니다.

 

이렇게 해주게 되면 1000밀리 초 기준으로 몇 밀리초 인지 나옵니다.

 

나온 결과물을 다시 1 (여기서 말하는 1은 1초를 의미) 로 나누어주게 되면, 결과적으로 1초에 밀리초 단위로 이전 프레임과 현재 프래임사이에 몇번 갱신이 되었는지 구할 수 있습니다.

 

마지막으로 old_time = curr_time 갱신해줍니다.

 

 

 

 

 

이를 소스코드를 통해서 보면..

 

프로그램 시작할때

 

clock_t old_t = clock();    //Old time

 

.

.

.

 

clock_t curr_time = clock();    //Current time

 

clock_t temp_time = (curr_time - old_time) / 1000.0f;    //Calculate to millisecond

 

temp_time /= 1.0f;    //FPS

 

past_t = curr_t;    //Update time

 

 

 

 

 

 

 

Posted by Tommy™
,

MFC에서는 보통 int 형을 받아오는건 쉽다.

 

흔히 GetDlgItemInt() 함수를 통해 ID에 해당하는 값을 얻어올수 있다.

 

하지만 실수형 변수는 어떻게 얻어올 수 있을까??

 

이리저리 검색해보다가 관련정보를 찾게 되었는데,

 

방법은 여러가지가 있었지만, 가장 직관적인 방법은 바로..

 

CString 형으로 만든 변수에 GetDlgItemText()를 통해 얻어와서 atof() 로 변환해주는 방법이었다.

 

가장 직관적이면서 쉽게 적용할 수 있는 방법이다.

 

아래에 간단한 예제소스를 참고하시길..

 

CString m_strResizeVar;

GetDlgItemText(IDC_EDIT_RESIZEVAR, m_strResizeVar);
float m_fResizeVar = atof(m_strResizeVar.GetString());

 

 

Posted by Tommy™
,

역시나 오늘도 작업하다가 알게된 사소하지만 나름? 유익한 정보를 공유하고자 한다.

 

물론 알고 계신분들은 많으실거라 보지만, 난 몰랐기에...

 

일단 기본적으로 웹캠으로 부터 영상을 얻어오면 640X480 사이즈이다.

(예전에는 320X240 이었던 시절이..)

 

하지만,

 

요즘에는 FullHD 화질을 지원하는 웹카메라들이 많다.

 

그중에 나는 Microsoft 사의 LifeCam - Studio 모델을 사용한다.

 

그래서 OpenCV를 활용하여 1080p FullHD 영상을 매프레임 얻어오고자 하는데,

 

아무리해도 640X480 영상밖에 얻어오질 못했다.

 

그래서 구글링 하던 결과..

 

하나의 솔루션을 찾았는데,

 

링크 참조 : http://stackoverflow.com/questions/15768260/get-maximum-resolution-when-capturing-image-data-with-cvqueryframe

 

 

 

m_pCapture = cvCreateCameraCapture(0);

 

후에

 

cvSetCaptureProperty(m_pCapture,CV_CAP_PROP_FRAME_WIDTH,1920);
cvSetCaptureProperty(m_pCapture,CV_CAP_PROP_FRAME_HEIGHT,1080);

 

이렇게 하면 카메라 파라미터를 1920X1080 으로 세팅 해줌으로써 문제없이 FullHD 영상을 매 프레임 캡쳐할 수 있었다.

 

 

Posted by Tommy™
,

 

 

 

 

 

현재 하고 있는 프로젝트에서 cvReleaseCapture() 를 하게 되면 계속 프로그램이 정상적으로 release 되지않고 메모리릭을 발생시키면서 그냥 죽어버린다.

 

도대체 뭐가 문제일까....

 

참고 주소 : http://onbranding.kr/6

 

위 블로그를 통해 그 답을 얻을수 있었는데,

 

인용하면..

 

 

 

 

cvRetrieveFrame 함수나 cvQueryFrame 함수 등을 이용해 카메라에서 프레임을 받아넣은 IplImage 구조체는 따로 Release해주어서는 절대 안된다!!

 

 

 

 

그런데 나는 프레임을 받아넣은 IplImage 구조체를 먼저 cvReleaseImage() 해줬으니 계속 프로그램이 죽을수 밖에 없지 아니한가!

 

즉 할당한 구조체의 메모리를 반환하려는데, 이미 반환해버렸으니 접근자 에러로 인해 프로그램이 뻗는 논리인셈..

 

오늘도 새로운것 하나 알게 되었군 ^^

 

 

 

 

 

Posted by Tommy™
,