MFC에서 PCL을 사용하려고 작업하는 중에,

 

다음과 같은 에러가 떴다.

 

...

Warning C4003: 'max' 매크로의 실제 매개 변수가 부족합니다.

error C2589: '(' : '::' 오른쪽에 잘못된 토큰이 있습니다.

error C2988: 템플릿 선언/정의를 인식할 수 없습니다.

error C2059: 구문 오류 : '::'

...

 

도대체 뭐가 문제일까.. 하면서 고민 하던 중,

 

공통점은 max 매크로의 실제 매개 변수가 부족하다 라는 공통된 경고를 깨닫게 되었고,

 

error C2589로 검색을 하던중, 한 블로그에 들어가서 문제점과 해결방법을 알게 되었다.

 

참조 블로그 링크 : http://blog.naver.com/smurfe380/150002451786

 

 

 

 

 

문제점은 바로..

 

std::min() 과 windef.h 파일에 있는 #define min(a,b) (((a) < (b)) ? (a) : (b)) 끼리 서로 충돌하는 에러 였던 것이었다.

 

 

 

 

 

그래서 해결 방법은,

 

문제가 되는 소스코드의 제일 첫 부분(include 하기 전), 아래의 소스코드를 추가해주면 문제는 깔끔히 해결 된다.

 

---------------------------------------------------------------------------------------------------

 

 

#ifdef max

 

#undef max

#undef min

#endif // max

 

---------------------------------------------------------------------------------------------------

 

이렇게 함으로써, max가 충돌되는것을 막음과 동시에, 적절한 min() 함수가 호출되서, 오류들을 말끔히 해결 할 수 있었다.

 

 

Posted by Tommy™
,

OpenGL에서 현재 디스플레이 되고있는 화면의 FPS를 구하고자 할때,

 

여러가지 방법이 있겠지만,

 

난 여기서 참조했다.

 

링크 : http://mycodelog.com/2010/04/16/fps/

 

그리고 밑에는 나의 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
float m_fFrameCount;
float m_fFPS;
DWORD m_dwCurrentTime;
DWORD m_dwPreviousTime;
 
 
 
void CGLDlgMgr::CalculateFPS()
{
 //  Increase frame count
 m_fFrameCount++;
 
 //  Get the number of milliseconds since glutInit called
 //  (or first call to glutGet(GLUT ELAPSED TIME)).
 m_dwCurrentTime = glutGet(GLUT_ELAPSED_TIME);
 
 //  Calculate time passed
 int timeInterval = m_dwCurrentTime - m_dwPreviousTime;
 
 if(timeInterval > 1000)
 {
  //  calculate the number of frames per second
  m_fFPS = m_fFrameCount / (timeInterval / 1000.0f);
 
  //  Set time
  m_dwPreviousTime = m_dwCurrentTime;
 
  //  Reset frame count
  m_fFrameCount = 0;
 }
}
 
cs

 

Posted by Tommy™
,

현재 진행중에 있는 프로젝트에서 Dialog창을 모달리스로 새로 생성을 해야하는데, 포커스가 이동이 안되는것이다.

 

그러다 검색하다보니,

 

방법이 있었다.

 

기존의 모달리스 창 생성할때 Create 부분에 CWnd::GetDesktopWindow() 을 추가해주면 되는것이었다.

 

이렇게 하면 부모 다이얼로그랑 동급의 오더를 가지게 되어 각각의 포커스를 부여할 수가 있는것이었다.

 

m_pMyDlg = new m_pMyDlg;
m_pMyDlg->Create(IDD_MY_DIALOG, CWnd::GetDesktopWindow());

 

참조 : http://blog.naver.com/ice4tea/70015838748

 

 

Posted by Tommy™
,

오늘은 FaceTrackLib 를 활용하여 눈동자를 트래킹하는 프로그램을 제작하였다

 

먼저 FaceTrackLib를 통해 얼굴을 트래킹 하면,

 

해당 vertex의 2차원 위치를 알수가 있다.

 

(참고로 vertex의 총 갯수는 121개이다)

 

여기서, 눈에 해당하는 부분만 따로 추출을 하여 눈에 해당하는 vertex를 추출할 수가 있는데,

 

이를 이용하여 눈동자를 트래킹 하게 되었다.

 

그리고 Translate, Rotate, Scale 값도 함께 라이브러리에서 제공한다.

 

결과물은 아래와 같다.

 

 

 

 

하지만 필요한것은 3차원 좌표..

 

그것도 영상의 사이즈에 depend 하기때문에, 이를 3차원에서의 좌표를추출해야 한다.

 

이제 depth map을 가지고 놀아봐야겠군..

 

 

---------------------------------------------------------------------------------------------------

 

 

[2014. 03. 27 Update]

 

해당 프로젝트 파일을 원하시는 분들이 많아서 자료 함께 첨부합니다.

 

거의 반년 이상 전에 공부하면서 만든 프로젝트 파일이라 시스템 구조가 엉망이라는 점 감안하고 올립니다.

 

뭐 이따구로 코딩해놨어~! 라고 하시면.. 안됩니다 ^^;;

 

환경은 Windows7, VS2010, MFC, C++, KinectSDK 1.7, OpenCV 2.4.2 이렇게 활용했습니다.

 

티스토리 10mb 업로드 용량 제한때문에 분할압축해서 올립니다.

 

궁금하신점은 제 메일로 연락주세요 ^^ (TommyHSM@gmail.com)

 

 

 

 

 

 

KinectFaceTracker(130724_눈영역검색 및 취합, 4가지 버전_소스코드_불필요한부분_수정).vol1.egg

 

KinectFaceTracker(130724_눈영역검색 및 취합, 4가지 버전_소스코드_불필요한부분_수정).vol2.egg

 

 

 

 

 

 

 

'[ Topics ] > Kinect 1.0' 카테고리의 다른 글

[KinectSDK 1.7]FaceTracking Test!  (18) 2013.07.19
Kinect SDK 1.7 coming at March 18  (0) 2013.03.18
Kinect의 IR-Camera 로의 접근  (0) 2013.02.28
Kinect SDK 1.6 맛보기  (0) 2013.02.28
1-inch UniTouch System using Kinect  (0) 2013.01.30
Posted by Tommy™
,

오늘 테스트 결과물은 Kinect SDK 1.7 에서 제공되는 FaceTrackingVisualization 을 뜯어보고, 나만의 프로젝트로 이식하기 까지다.

 

글의 서두이자 테스트하게 된 이유는,

 

연구실의 박사님께서 얼굴을 트래킹하는 프로그램을 하나 부탁하신게 있어 시작하게 되었다.

 

먼저 조사결과, 얼굴을 robust 하게 tracking 할수 있는 방법은 2가지로 줄일수 있는데,

 

1. FaceAPI

 

2. KinectSDK - FaceTrackLib

 

하지만, FaceAPI는 유료이기때문에.. 패스!

 

Kinect SDK 에서 제공하는 SDK는 무료이기 때문에, 이녀석을 뜯어보고 사용하기로 결정했다.

 

 

 

 

 

일단 FaceTrackingVisualization 에서는 크게 2가지로 나누고 있다.

 

1. MultiFace

 

2. SingleFace

 

하지만 나는 얼굴 하나만 트래킹 하면 되기에 싱글을 뜯어보기로 했다.

 

샘플을 돌려보면 알겠지만, 왼편에 원처럼 생긴곳에 트래킹 얼굴을 따라 아바타가 나타나고, 오른편에는 얼굴을 따라 삼각형 메쉬덩어리들이 얼굴위에 뙇! 나타난다.

 

내가 필요한 부분은 삼각형 메쉬 덩어리들이기때문에, eggavatar 부분은 버리고,

 

키넥트로 부터 영상을 받아오는 부분과, 얼굴을 detect 하는부분, 이렇게 찾아본 결과,

 

KinectSensor = 키넥트에서 영상을 받아오는 부분 (순수 키넥트 영상)

 

SingleFace = 키넥트에서 받아온 영상을 처리하여 얼굴을 찾는 부분

 

Visualize = 삼각형 메쉬를 그려주는 부분

 

이렇게 3가지 부분으로 정리되었다.

 

 

 

 

 

그리고 중요한 점!

 

여기서는 Depth 와 Skeleton Tracking 을 통해 머리와 목을 트래킹 하여 얼굴영역을 트래킹 한다는 사실!

 

그리고 Depth 영상의 Resolution은 320 X 240 이라는 사실!

 

(Color 영상은 640 X 480 이다.)

 

마지막으로 GetClosestHint() 함수를 통해 가장 가까운 사람을 Detect 한다는 사실!

 

 

 

 

다음으로

 

영상을 어떻게 출력해줄것인가..??

 

나는 OpenCV를 사용하여 MFC 의 Picture Control 영역에 뿌려주기 위해 작업을 했다.

 

그리고 하면서 알게 된 결과..

 

여기서 영상을 출력해주기 위해 사용하는 영상 포멧은 IFTImage 이고, 4channel 로 이루어져있다는 사실..

 

 

 

 

 

 

이제 필요한 부분과 필요없는 부분을 골라내서 마무리!

 

대충 결과물은 아래와 같다. (이미지와 영상 참조)

 

(이미지는 얼굴영역을 어떻게 잡나 보여주기위해, mesh를 제거하였다.)

 

개발환경 : Window 7, Kinect SDK 1.7, VS 2010, C++, MFC

 

 

 

 

 

 

 

 

 

 

 

결과.

 

트래킹이 잘된다.

 

하지만 문제점이 있는데,

 

어느정도 가까워지면 트래킹이 끊어진다. (아마도 스켈레톤을 하지 못해서 이지 않을까.. 라는 생각 )

 

그리고 한번씩 인식된 부분이 튄다는점인데..

 

뭐 앞으로 마소 에서 개선하겠지??

 

이제, 내부구조를 조금 더 파해쳐보고, 수확이 있으면 다음번 포스팅에 올릴예정이다.

 

 

 

 

Posted by Tommy™
,