요즘 새로운? 프로젝트가 시작 되었습니다.

 

Kinect v2 를 여러대 활용하여 연구? 보다는.. 연구에 활용하기 위한 공부를 시작하고자 하는데, 문제는 Kinect SDK 2.0 은 1개의 PC당 1개의 Kinect v2 만 연결이 되도록 한정 지어놨다는 점입니다.

 

이를 해결할 방법을 찾다가 Freenect2 라는 오픈소스 라이브러리가 있더군요.

 

예전에 초창기 Kinect v1이 나왔을떄 Freenect 에서 해킹을 해서 이를 오픈소스로 유포한걸로 기억하는데, 거기서 다시 Kinect v2를 활용하는 방법을 제공하네요.

 

( 사이트는 여기로: https://github.com/OpenKinect/libfreenect2 )

 

간단히 둘러보니, libusb 를 활용하여 스트리밍 데이터를 받아들이는데, 말그대로 중간에서 Freenect2가 각각의 고유번호 및 USB 통신을 컨트롤 해서 다중 키넥트 환경을 제공 해주는거 같습니다. 그리고 픽업 된 영상은 OpenNI 2.0을 활용하여 결과물을 보여주고 있구요. 기호에 따라 OpenGL, OpenCL, CUDA 등등 기능도 같이 컴파일하여 활용할수있도록 해놓았습니다.

 

하지만 다른 블로거 유한규님 (URL: https://hanquel.postype.com/post/28254 ) 블로그를 보면 아직은 다중 키넥트 환경이 안정적이지는 않다고 하시는거보니 아무래도 한계점은 있는것 같아 보입니다.

 

일단은 저도 기본적인 multi Kinect v2 까지 테스트 해보고 Freenect2 컴파일 방법 및 연결 방법등을 찬찬히 설명 해보겠습니다.

 

Comming soon!

 

 

Posted by Tommy™
,

코딩할때 가장 기본이 되는 유용한 기능중 한가지가 바로 배열이라고 생각합니다.

 

 

배열은 동적 메모리 할당(dynamic memory allocation)정적 할당(static memory allocation)으로 선언할수있습니다.

 

 

또한 정적할당에서도 메모리가 할당이 되는곳이 선언방법에 따라 힙(heap) 영역과 스택(stack) 영역으로 나뉠수 있습니다.

 

 

간단히 이야기 해서 스택은 용량이 1메가바이트 (1MB = 1,000 KB = 1000,000 byte) 정도로 한정이 되어있다고 합니다.

 

 

그래서 지역번수를 선언할때 메모리 할당, 즉 배열 선언을 할때 정적배열의 크기가 너무 커버리면 스택 영역에 있어야 할 지역변수의 공간이 이웃한 다른 영역을 침범하게 되서 메모리 접근 오류가 발생할 수 있습니다.

 

 

결론은 간단히 이야기 해서 전역으로 정적 배열을 선언해버리면, 데이터 영역, 즉 힙 영역으로 메모리가 할당이 되어서 오류가 뜨지않고 사용을 할 수 있습니다.

 

 

오늘 작업하다가 지역함수 내에서 정적 메모리 할당을 했는데, 계속 오류가 뜨길래 찾아보고 찾아보다 그 해결책을 찾은거라 혹시나 해서 다른분들께도 도움이 되지않을까 해서 글 적어봅니다.

 

 

typedef double_double3_[3];

_double3_arrA[640*480];

_double3_arrB[640*480];

_double3_arrC[512*424];

 

 

위와 같이 정적 배열을 생성했는데, 계속 오류가 떠서, 전역으로 옮겨 줬더니 문제 없이 작동 되네요.

 

 

조금 더 자세한, 그리고 디테일한 설명을 원하시면 아래 참조 블로그를 들어가셔서 보시면 더욱 더 이해하시기 편하리라 생각합니다.

 

 

참조:

http://egloos.zum.com/slaveofcod/v/320270

http://inhack.org/wordpress/?p=2932

 

 

Posted by Tommy™
,

 

어제까지만 해도 VS2012를 사용중이었지만, VS2013 부터 사용하고자 하는 라이브러리가 지원이 된다고 하네요.

언제 VS2012 버전 위로 올라가나.. 생각하고는 있었는데, 이때다 싶어서 바로 VS2015를 설치 했습니다.

 

이왕이면 VS2013 보다는 최신버전인 2015가 낫겟다 싶어 결국 VS2015로 갈아 탔네요.

 

하지만 여기서 문제점을 발견했습니다.

 

C++ 프로젝트가 없는거였습니다.

 

그것도 모르고 이리저리 문제점을 해결하려고 살피다 겨우 한개의 블로그를 발견했는데, 여기서 해결책을 발견했습니다. (아래 링크 참조)

 

http://programmerchoo.tistory.com/42

 

여기 블로그에서 말하길, VS2015에서는 따로 C++ 프로젝트를 만들기 위해서는 추가적인 툴을 설치해야 한다고 합니다.

 

아래는 사진과 함께 제가 해결한 방법들을 설명 드릴께요.

 

 

1. 새 프로젝트 만들기 항목에서 Visual C++ 을 선택하면 아래와 같은 창이 나옵니다. (아래 사진을 캡쳐하지 못해서 위에 링크에서 퍼왔습니다.)

 

 

2. 두가지 중에서 Visual C++ 2015 툴 을 선택합니다. (다른거는 XP에서 사용할 뭔가를 더 추가적으로 설치하겠냐고 물어보는건데, 자세히 살펴보지는 않았습니다.) 아래는 진행되고 있는 상태입니다. 대략 10~15분 정도 걸렸네요.

 

 

 

3. 그리고 설치가 다된 모습입니다.

 

 

 

4. 그 다음은 Visual C++ 프로젝트를 만들기 위한 기본 환경을 구성해야 할 차례입니다. [도구] 에 보면 [설정 가져오기 및 내보내기] 항목이 있는데 여기서 이 기본 환경을 설정할 수 있습니다.

 

 

 

 

 

 

5. 이제 C++ 환경이 기본 으로 구성되었습니다. 이제 새 프로젝트 만들기 들어가보시면 아래와 같이 나오는것을 확인 하실 수 있습니다.

 

 

 

 

저도 나름 고생아닌 고생? 을 해서 혹시나 도움 되시는분이 있으리라 생각하면서 글을 작성 해보았습니다.

 

그러면 오늘도 화이팅 합시다!

 

 

 

Posted by Tommy™
,

이번에 윈도우 8.1 에서 윈도우 10 으로 업그레이드를 하게 되었는데, 문제없이 잘 동작하던 프로그램이 갑자기 말썽을 일으켰다. 

 

주 모니터에서는 잘 시뮬레이팅 되는 프로그램이 보조 모니터에서는 계속 이상한 결과를 계속 보여줬는데, 결과적으로 마우스 좌표가 이상하게 들어와서 계속 시뮬레이팅이 이상하게 되었던것이었다.

 

이리저리 알아 본 결과,

 

윈도우 10에 있는 "디스플레이 사용자 지정" 항목에서 "텍스트, 앱 및 다른 항목의 크기를 변경합니다" 부분이 많은 영향을 미치는거 같다.

 

 

주 모니터와 보조 모니터의 확대 % 를 같게 해줘야 같은 결과를 내는데, 두개의 확대 %가 달라서 마우스 좌표값이 다르게 입력 되었던 것이었다.

 

보조 모니터의 크기가 커서 확대를 더 많이 했더니 이러한 예상치 못한 오류를 도출하게 되었는데, 조심해야겠다.

 

혹시나 하는 마음에 다른분들도 문제가 발생 할 수도 있어서 알려드리고자 블로깅을 했습니다.

 

 

 

 

모니터 해상도, 보조 모니터 포함 해상도 및 디스플레이 정보 관련 코드

 

int mx = GetSystemMetrics(SM_CXSCREEN);    //Main monitor resolution - width

int my = GetSystemMetrics(SM_CYSCREEN);    //Main monitor resolution - height

int wx = GetSystemMetrics(SM_CXVIRTUALSCREEN);    //Whole resolution - main + sub monitor - width

int wy = GetSystemMetrics(SM_CYVIRTUALSCREEN);    //Whole resolution - main + sub monitor - height

int sx = wx - mx;    //Sub monitor resolution - width

int sy = wy - my;    //Sub monitor resolution - height

int MonitorCount = GetSystemMetrics(SM_CMONITORS);    //Monitor count

 

 

모니터 정보

 

HMONITOR hMon = MonitorFromWindow(GetSafeHwnd(), MONITOR_DEFAULTTONEAREST);

MONITORINFO monInfo;

ZeroMemory(&monInfo, sizeof(MONITORINFO));

monInfo.cbSize = sizeof(MONITORINFO);

GetMonitorInfo(hMon, &monInfo);

 

 

 

Posted by Tommy™
,

Console 기반으로 openGL 을 구동할때 glut 를 주로 사용합니다. (왜냐면 쉽고, 간편하니깐..^^;;)

 

사용법은 뭐 인터넷에 널리고 널렸으니, 생각할께요.

 

이때 glutMainLoop 를 통해서 종료 이벤트가 들어오기 전까지 계속 루프를 도는데, 여기서 루프를 종료 후, 후처리를 해야 하는 상황이 발생했습니다.

 

그래서 이리저리 알아 본 결과..

 

StackOverflow 사이트에서 답을 찾을 수 있었습니다.

 

http://stackoverflow.com/questions/5033832/what-is-the-nicest-way-to-close-glut

https://www.opengl.org/discussion_boards/showthread.php/136742-Exit-Main-Loop

 

 

 

 

첫번째 링크 타고 들어가셔서 보시면 아시겠지만, 귀찮으신 분들을 위해.. 무튼, 질문이 뭐 였었나면 GLUT를 가장 훌륭하게 닫는 방법이 뭘까? 였습니다.

 

그리고 이런 저런 댓글 중에 "나는 이 함수를 쓴다!" 라고 하면서

 

1
void glutLeaveMainLoop ( void ); 
cs

 

 이 함수를 적어 놨더군요.

 

그래서 이리저리 또 알아 본 결과, 이건 freeGlut 라고 해서 OpenGL을 대체 해서 (혹은 커버해서) 더 사용하기 편하게, 그리고 더 범용적으로 쓰기 위해 만든 라이브러리라고 합니다.

 

http://freeglut.sourceforge.net/

http://freeglut.sourceforge.net/docs/api.php#EventProcessing

 

 

 

아무튼, 여기서 freeGlut를 다운 받아서 CMake로 바이너리 빌드를 해주면, Visual studio 프로젝트 파일이 나옵니다.

 

그리고 해당 프로젝트 파일을 Visual studio 열어서 재빌드 해주면 끝 & 사용 준비 완료

 

아래 소스코드와 같이, 메인루프를 실행하기전에 glut 설정을 해주면 glutLeaveMainLoop() 를 통해 종료 후, 후처리를 할 수가 있습니다.

 

1
2
3
4
    //Post-Process after kill glut's loop
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
    //glut loop
    glutMainLoop();
cs

 

 

 

 

이로써 또 진도를 나가게 되었네요.

 

후담이지만, 매번 MFC로 작업하다가, 콘솔에서 간단히 작업하니깐 엄청 편하네요.

 

간단한 프로젝트는 앞으로 콘솔로 작업을 해야겠습니다. ㅎㅎ

 

 

 

 

기타 참고 한 사이트 :

https://cmake.org/

http://sourceforge.net/p/freeglut/bugs/224/

http://colorscripter.com/

http://colorscripter.com/info

 

 

 

 

 

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

[OpenGL] Frame Rate  (6) 2013.08.03
Posted by Tommy™
,