読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

Kinect for Windows SDK beta で遊んでみた 〜 首ふりアプリ 〜 #shibuya_ni

Kinect


MS SDKでサポートされている、Kinectの首ふり。
普段使うとき(もちろんPC接続です)に首の方向がズレててパキパキ動かしてるのですが、精神衛生上(たぶんH/W的にも)よくないでの、首ふりアプリを作りました。
MFCで画像を扱う方法を忘れたので、かなりテキトウです^^;

環境

ソース

// tilt_controlDlg.cpp : 実装ファイル
//

#include "stdafx.h"
#include "tilt_control.h"
#include "tilt_controlDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Ctilt_controlDlg ダイアログ
Ctilt_controlDlg::Ctilt_controlDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(Ctilt_controlDlg::IDD, pParent)
    , m_angle(0)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

// 略

// Ctilt_controlDlg メッセージ ハンドラー

BOOL Ctilt_controlDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
    //  Framework は、この設定を自動的に行います。
    SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
    SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

    ShowWindow(SW_MINIMIZE);

    // TODO: 初期化をここに追加します。
    try {
        kinect_.Initialize( NUI_INITIALIZE_FLAG_USES_COLOR );
        kinect_.VideoStream().Open( NUI_IMAGE_TYPE::NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION::NUI_IMAGE_RESOLUTION_640x480 );

        m_sliderTilt.SetRange( kinect_.CAMERA_ELEVATION_MINIMUM, kinect_.CAMERA_ELEVATION_MAXIMUM );
        m_angle = kinect_.GetAngle();

        SetTimer( TIMER_ANGLE, 1000, 0 );
        SetTimer( TIMER_UPDATE, 100, 0 );

        UpdateData( FALSE );
    }
    catch ( std::exception& ex ) {
        MessageBox( ex.what() );
        OnCancel();
    }

    return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

// 略

void Ctilt_controlDlg::OnTimer(UINT_PTR nIDEvent)
{
    if ( nIDEvent == TIMER_ANGLE ) {
        UpdateData( TRUE );

        // スクロールバーの上下と正負が逆なので、値を逆にする
        kinect_.SetAngle( -m_angle );
    }
    else if ( nIDEvent == TIMER_UPDATE ) {
        kinect_.WaitAndUpdateAll();
        kinect::nui::VideoFrame videoMD( kinect_.VideoStream() );

        CDC* dc = GetDC();
        CDC MemoryDC;
        MemoryDC.CreateCompatibleDC( dc );

        CBitmap Bitmap;
        Bitmap.CreateCompatibleBitmap( dc , videoMD.Width(), videoMD.Height() );
        CBitmap* pOldBitmap = MemoryDC.SelectObject(&Bitmap);
        Bitmap.SetBitmapBits( videoMD.Pitch() * videoMD.Height(), videoMD.Bits() );

        dc->BitBlt( 0, 0, videoMD.Width(), videoMD.Height(), &MemoryDC, 0, 0, SRCCOPY );

        MemoryDC.SelectObject( pOldBitmap );
        MemoryDC.DeleteDC();
    }

    CDialogEx::OnTimer(nIDEvent);
}


void Ctilt_controlDlg::OnBnClickedOk()
{
    CDialogEx::OnOK();
}


void Ctilt_controlDlg::OnBnClickedCancel()
{
    CDialogEx::OnCancel();
}