본문 바로가기

Enginius/Matlab

Use Microsoft Kinect in Matlab (2013~)

1. Kinect driver 설치

 http://www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx 에 들어가서 SDK와 Toolkit을 받고, 설치한다. 밑에 보이는 화면에서 Step 1, Step 2를 따라하면 된다. (물론 밑에 그림 클릭하면 안된다.)

 


 <= 설치가 잘 되었다면 작업 관리자에 요롷게 뜬다. 


2. MATLAB 2013 설치 (?)

MATLAB 2013을 설치한다. 정식으로 사려면 대략 2천만원 정도 하는 것 같다. 하지만 우리에겐 학교 라이센스가 있다! (없다면 어둠의 경로로?) 다만 시간이 엄청 오래걸린다.. 



3. 그러면 일단 다음 링크의 동영상을 보도록 하자. 

 링크http://www.mathworks.co.kr/company/events/conferences/matlab-virtual-conference/2013/proceedings/using-microsoft-kinect-with-matlab-and-simulink.html?sec=whats_new 

 위의 링크는 MATLAB Virtual Conference 2013의 한 동영상이다. 매트랩에서 키넥트를 어떻게 사용하는지에 대한 튜토리얼이라고 생각하면 되겠다. 

 <= 이런 아저씨가 나와서 푸근하게 설명해주신다. 


4. MATLAB 다운로드가 끝날 생각을 안한다.... SNL 코리아를 본다. 

최일구 아저씨! 


5. Matlab 2013 Publish 기능을 사용해서 코드를 분석해보자. 

Contents

Kinect를 사용해보는 코드이다.

clc;
clear all;
close all;
imaqreset; % 카메라 세팅을 초기화

1. 어떤 device가 있나 확인해본다.

imaqhwinfo
ans = 

    InstalledAdaptors: {'gentl'  'gige'  'kinect'  'matrox'  'winvideo'}
        MATLABVersion: '8.1 (R2013a)'
          ToolboxName: 'Image Acquisition Toolbox'
       ToolboxVersion: '4.5 (R2013a)'

2. 키넥트 카메라를 사용한다.

colorVid = videoinput('kinect', 1);
preview(colorVid);
pause();
closepreview(colorVid);

3. 키넥트 depth 카메라를 사용해본다.

depthVid = videoinput('kinect', 2);
preview(depthVid);
pause();
closepreview(depthVid);

4. Snapshot을 한다.

depthImage = getsnapshot(depthVid);
imshow(depthImage, [0 4096]); % 0~4m만 보도록 스케일링을 한다.
fprintf('Maximum distance: %.2f m \n', double(max(max(depthImage)))/1000 );
Maximum distance: 3.98 m 

5. Skeleton을 구해보자.

imaqreset; % 카메라 세팅을 초기화
depthVid = videoinput('kinect', 2); % Depth 카메라를 설정하고
triggerconfig(depthVid, 'manual');
depthVid.FramesPerTrigger = 1;
depthVid.TriggerRepeat = inf;
set( getselectedsource(depthVid), 'TrackingMode', 'Skeleton');

6. Track을 한다.

start(depthVid); figure();
for i = 1:100
    trigger(depthVid);
    % 현재 depthData와 MetaData를 읽어온다.
    [depthMap, ~, depthMetaData] = getdata(depthVid);
    imshow(depthMap, [0 4096]);
    title(sprintf('[%d/%d]', i, 100));
end

7. Skeleton을 보자.

depthMetaData.IsSkeletonTracked 가 skeleton이 검출되었는지 나온다.

if sum(depthMetaData.IsSkeletonTracked)
    % Skeleton이 검출 되었으면
    fprintf('Skeleton detected \n');
    imshow(depthMetaData.SegmentationData);
else
    fprintf('No skeleton detected \n');
end
Skeleton detected 

8. Skeleton을 더 자세히 보자. (depth image와 같이보자.)

skeletonJoints = depthMetaData.JointImageIndices(:, :, depthMetaData.IsSkeletonTracked);
imshow(depthMap, [0 4096]);
% imshow(depthMetaData.SegmentationData);
hold on; plot(skeletonJoints(:, 1), skeletonJoints(:, 2), '*');



9. 실시간으로 Skeleton을 확인해보자.

clc; clear all; close all;
imaqreset; % 카메라 세팅을 초기화

depthVid = videoinput('kinect', 2);
triggerconfig(depthVid, 'manual');
depthVid.FramesPerTrigger = 1;
depthVid.TriggerRepeat = inf;
set( getselectedsource(depthVid), 'TrackingMode', 'Skeleton');

colorVid = videoinput('kinect', 1);
triggerconfig(colorVid, 'manual');
colorVid.FramesPerTrigger = 1;
colorVid.TriggerRepeat = inf;

start(depthVid);
start(colorVid);

himg = figure;
while ishandle(himg)
    trigger(colorVid);
    trigger(depthVid);
    image = getdata(colorVid);
    [depthMap, ~, depthMetaData] = getdata(depthVid);

    nrSkeleton = sum(depthMetaData.IsSkeletonTracked);
    if nrSkeleton > 0
        skeletonJoints = depthMetaData.JointImageIndices(:, :, depthMetaData.IsSkeletonTracked);
        skeletonViewer(skeletonJoints, image, nrSkeleton);
    else
        imshow(image);
    end
end
stop(depthVid);
stop(colorVid); 

6. 여기까지 하면 Kinect의 대부분의 기능을 쓸 수 있게된다.