세상을 날려버릴 앱을 만들겠어! KINECT


예를 들면 이런거...

모두의 힘이 필요해!ㅋ


Kinect Natrual User Interface(NUI) Image Data Stream KINECT

지난 블로그에서 잠깐 언급했었지만 kinect 는 두가지 형태의 Image Data Stream 을 개발자에게 전달한다. 본 내용은 Kinect SDK Beta2 의 내용을 참고하여 kinect 에서 제공되는 두가지 image data stream 에 대한 내용을 담고자 한다.

- Color Image Data
- Depth Data

Color image data 는 RGB 와 YUV 두가지 형식으로 제공되는데 두가지모두 동일한 camera data 이므로 개발시 개발자가 편한대로 사용하라고 한다. RGB 는 많이 들어봐서 알겠는데 YUV 왠지 좀 생소하다.
YUV는 콤포넌트 비디오 시스템에서 아날로그 휘도신호와 색차신호를 말할 때,
사용하는 약어로서 Y는 휘도신호를 의미하고
U, V는 PAL방식에서 사용되는 2개의 부반송파(subcarrier) 중심축을 뜻하는데,
B-Y, R-Y의 색차신호가 scaling 그리고 filtering되어
U, V축에서의 PAL 부반송파를 변조하는데 사용됩니다.
이런 혼용은 U, V가 컬러 색차신호와 연관되어 있기 때문에 발생하며,
이 두 개가 같은 것은 아닙니다. [ 출처 : 디스플레이 포탈 - 모니터포유(주) ]
정말 무슨말이지 참 어렵다. 아~ 넘 기계적인말이야...
YUV는 밝기(Luminance)인 Y성분과 색상(Chrominance)인 U(Cb)와 V(Cr) 성분으로 구성하여 픽셀을 표현하는 방식으로, 일반적인 RGB 방식에 비하여 작은 대역폭으로 전송이 가능하다. - Ryan 님 블로그-
그리도 Ryan 님이 설명해 주신 말을 들으니 조금 이해가 간다. 이정도는 그냥 그러려니 하면 될것... Application 개발자 입장에서는 단순히 크기의 차이라고 받아들이면 될려나?! (이건 솔직히 잘 모르겠고, 이후 개발을 하다가 몸소 깨우치게 되지 않을까 생각해본다.) 암튼 Color image data 에서 RGB 방식을 사용할지 YUV 형식을 사용할지는 kinect object 에서 ImageType 을 지정만 해주면된다.
Runtime nui = Runtime.Kinects[0];
//An RGB color image from the camera.
nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
//A YUV image from the color camera, converted to RGB32.
nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.ColorYuv);
//A YUV image (YUYV) from the color stream before conversion to RGB32.
nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.ColorYuvRaw);

Depth Data 은 픽셀로 부터 프레임의 직선 거리를 나타낸다. Depth data 의 직선 거리와 사용자의 index 가 포함되어 있고, 거리의 값이 0 이면 너무 멀리 있거나 너무 가까이 있다는 의미라고 한다.
Runtime nui = Runtime.Kinects[0];
//A depth sensor image.
nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Depth);
//An image from the depth camera, combined with an image generated by the skeleton tracking system that labels pixels in the depth map as belonging to specific players.
nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, DepthAndPlayerIndex.);

참고1.
샘플 코드와 SDK 를 보면서 좀 의야한 것이 있는데... Quick Start 에서는 Video 란 명칭을 사용하고 설명하고 있고, 코드 또한 VideoStream 이라는 단어를 사용하는데 SDK 문서에서는 이를 설명할때 Color Image Data 라고 사용하고 있다. VideoStram 도 내부적으로는 단순 이미지의 전달이기 때문에 그런것 같긴 한데, 먼가 용어의 정리가 필요하지 않을까 싶지만, 그냥 납둬도 될것 같다. 암튼 현재 버전은 Beta2 이기 때문에 정식에서는 좀더 개선되겠지 싶다.

참고2.
영어를 한국어로 번역하는것, 특히 기술 문서의 단어 번역에 있어 굉장히 난감할때가 있는데 이 'Natrual User Interface' 가 그런 것중에 하나이다. 번역하면 자연사용자인터페이스 머 이렇게 되나?! 암튼 의미가 좀 이상해질 수 있으므로 앞으로는 NUI 로 걍 쓸련다.


Kinect for Windows SDK Quickstarts 둘러보기[2] KINECT

본 포스트는 Kinect for Windows SDK Quickstarts 를 본인 스스로 리마인드 하기 위한 용도이므로 이미 해당 내용에 대한 지식을 습득한 분이나, 뭐 이따위 블로그를.. .하시는 분들은 Ctrl+W 를 누르시기 바랍니다.



뭐 그렇다. 이미 한번씩 훑어본 내용이긴 하지만 깊이있게 보질 않아서 한번씩 리뷰하며 블로깅을 할 생각이었는데 이게 생각보다 더디네. 암튼... Kinect for Windows SDK Quickstarts 는 아래와 같은내용을 설명한다.

1.Installing & Using Kinect Sensor 
2.Setting Up Dev Environment
3.Camera Fundamentals
4.Working With Depth Data
5.Skeletal Tracking
6.Audio

오늘은 세번째 내용을 리뷰한다.

3.Camera Fundamentals
이 챕터에서는 Depth 와 Video Frame 에 대한 내용을 overview 형식으로 전달한다. (Video Frame 이라고 얘기하지만 사실 Color Image 라고 이해하는게 더 개발자 스러운듯하다) Kinect 로 부터 전달되는 데이터 구조를 설명하고 이를 어떻게 사용 하는지에 대한 예제에 보여준다.


단순히 위의 PPT 만 보면 ImageFrameReadyEventArgs 에서 전달되는 Argument 가 어떤 정보들을 담고 있는지는 알겠는데, 그럼 얘를 어떻게 사용해야 하는가에 대한 의문이 들긴한다. 소스코드를 보면 다음과 같은 코드가 있는데...

void nui_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)
{
    //Use Coding4Fun extension method on ImageFrame class for Depth
    image2.Source = e.ImageFrame.ToBitmapSource();
}

void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
{
    //Manually create BitmapSource for Video
    PlanarImage imageData = e.ImageFrame.Image;
    image1.Source = BitmapSource.Create(imageData.Width, imageData.Height, 96, 96, PixelFormats.Bgr32, null, imageData.Bits, imageData.Width * imageData.BytesPerPixel);
}

이 코드를 보면 '아... Video 와 Depth 를 이미지컨트롤에 저런방법으로 표시해주면 되는구나' 가 끝이다. 두번째 샘플예제를 보더라도 kinect 의 Tilt(쉽게 얘기하면 kinect 의 상하조절) 만 다루기 때문에 '아~ 그런갑다' 가 전부이다. (헌데 이 다음 챕터에서 Depth 데이터 컨트롤하는 방법을 다루기 때문에 이 챕터의 목적은 이게 전부인듯 하다. ^^; )

헌데 이렇게 밖에 생각하지 못하는 이유는 아무래도 내가 그래픽에 대해는 무지하기 때문일 것이고, 무언가 개념이 있고, 이와 비교할 수 있는 다른 지식이 있었더라면 얘기가 달라졌을 것이다. 예를 들면 '오우 키넥트는 굉장히 쉽게 표현이 되네' 라던가 '아~ 역시 이 장비도 구리다' 라던가 WTF 이라던가.. 머 그런...
암튼 여기서 내 무식이 탈로 나는데 ^^;;; 학창시절 DirecX 나 OpenGL 따위 개나줘버려~ 난 그딴 노가다 안할꺼다 라고 외치고 다녔던게 후회스러웠다. 머 이제와서 후회해봐야 소용없으므로 일단패스하고...

일단 이번 챕터를 보고 실행해보면서 SDK 의 문서를 자세히 읽어보게 되었는데, 이 내용은 정확히 이해하고 다시 블로깅 해야하겠다는 생각이 들어 잠시 보류. 아마도 내일쯤 올라가지 않을까 싶다.



WinXP 에서 Win7 단축키 기능 구현하다가... .NET

Window 7 단축키 중에서 내가 단연코 많이 사용하는 키는 Win+방향키 로 윈도우의 크기를 제어하는 것이다.
근래 불행히도 출근하는 업체의 근무환경 표준이 XP 인 관계로 이 기능을 사용하지 못하니 불편해 죽을 지경이다. 여기저기 서치해보다가 걍 만드는게 편할것 같기도 하고 재미있을것 같기도 해서 블로그를 남긴다.

우선 Keyboard hooking 이 필요하겠다. 구현할려고 하다가 왠지 예전에 어디선가 본거 같아서 서치해보니 역시!

(땡큐 StormySpike)

본 클래스는 사용하기도 굉장히 편리하니 적극 추천! 다른 Appication 을 만드는데도 사용하면 좋을듯 하다.
gkh.HookedKeys.Add(Keys.Left);
gkh.HookedKeys.Add(Keys.Right);
gkh.HookedKeys.Add(Keys.Up);
gkh.HookedKeys.Add(Keys.Down);
이렇게만 써주면 된다.

그다음 GetAsyncKeyState 함수를 사용하여 Win 키가 Pressed 상태인지 체크하고 위의 Hooking 클래스에서 윈도우의 크기나 상태를 제어해주는것이 관건. 참고로 윈도우의 상태를 제어하기 위해서는 ShowWindow 함수를, 윈도우의 크기를 제어하기 위해서는 MoveWindow 를 사용하였다. 

풀지못한 이라기 보단 조금 귀찬은 작업은 남겨두었는데 왼쪽 혹은 오른쪽으로 붙어 있는 윈도우를 이전 크기로 되돌리는 기능은 구현하지 않고 그냥 일정한 크기의 윈도우로 센터에 표시되도록 남겨두었다.(예를 들면 왼쪽에 Docking 되어 있는 윈도우를 Win+Right Arrow 입력시 이전 크기의 위도우로 되돌아와야 하는게 원래 Win7 의 그것이었다면 나는 그냥 센터에 일정한 크기로 표시되도록 한 것) 기존 윈도우 핸들값으로 최초의 윈도우 크기를 기억해 놓으면 될것 같으나... 굳이 그래야 하나 싶은 귀찮음에...
아 또 있다. 듀얼 모니터인 경우의 처리. 음... 또 있나?! ^^;;

이게 소스나 작업의 순서를 올리지 못하니 답답하고만... 뭐 별수 없다.
이거참 얼릉 여길 벗어나던지..이런걸만들고 있는 나도 참...


Kinect for Windows SDK Quickstarts 둘러보기[1] KINECT

본 포스트는 Kinect for Windows SDK Quickstarts 를 본인 스스로 리마인드 하기 위한 용도이므로 이미 해당 내용에 대한 지식을 습득한 분이나, 뭐 이따위 블로그를.. .하시는 분들은 Ctrl+F4 를 누르시기 바랍니다.



오랜만에 다시 Kinect 블로깅. Kinect 를 하기로 결심한 결정적 동기 부여가 사라진 관계로 잠시 다른곳에 한눈팔다. 이래선 안되겠다 싶어 다시 블로깅을 한다. 일전에 Quickstart 링크를 올린적이 이미 해당 내용을 보았지만 리마인드 차원에서 다시한번 올린다.

Kinect for Windows SDK Quickstarts 는 아래와 같은내용을 설명한다.

1.Installing & Using Kinect Sensor 
2.Setting Up Dev Environment
3.Camera Fundamentals
4.Working With Depth Data
5.Skeletal Tracking
6.Audio

위의 내용들은 모두 Kinect SDK 를 통한 개발을 설명하고 있다. 샘플 코드와 PPT 자료는 다음링크-Kinect for Windows SDK Quickstarts samples and slides-에서 다운로드 할 수 있다. 이 링크의 첨부파일을 다운로드 후 압축을 해제하면 위와 같은 순서의 폴더가 하위에 생성된것을 확인할 수 있으며, 각 폴더에는 샘플 소스와 PPT 자료가 포함되어 있다.

1. Installing & Using Kinect Sensor
본 세션에서는 Kinect 에 대한 H/W 적인 내용이 주된 설명이다. Kinect 를 구매시 전원케이블이 필요하면 MS Store 에서 판매하고 있다는 애기도 있다.( 이 내용의 자세한 설명은 다음 블로그 에서도 확인할 수 있음) 

2.Setting Up Dev Environment
본 세션에서는 개발환경을 구성하는데 초점이 맞춰져 있다. 이 내용도 일전에 다루었으므로 간단히 패스하려 하다가...
기존 블로그에서 설치하지 않았던 것들이 있어 소개하고자 한다.
위의 항목도 설치하여 미리미리 환경을 구성해야 할것. 추가로 Code4Fun toolkit 의 항목도 샘플 소스에서는 사용하고 있는데 이는 각 세션에 포함된 링크에 이미 포함되어 있지만 다운로드하기를 원한다면 아래 링크에서 확인 할 수 있다. Coding4Fun Kinect Toolkit 이 Toolkit Depth/Skeleton Data 의 확장 메소드를 제공해준다.

이항 항목도 할까 하다... 내용이 길어질 듯 하여 오늘은 여기까지.



1 2 3 4 5 6 7 8 9 10 다음