MS SDKでサポートされている、Kinectの首ふり。
普段使うとき(もちろんPC接続です)に首の方向がズレててパキパキ動かしてるのですが、精神衛生上(たぶんH/W的にも)よくないでの、首ふりアプリを作りました。
MFCで画像を扱う方法を忘れたので、かなりテキトウです^^;
環境
- Windows 7 64bit
- Visual Studio 2010 Premium
- MFC
- MS SDK
- ソース
- exe
- tilt_control.exe
- 一応Releaseビルドしたものもおいておきます。まっさらな環境で動作確認はしてません。とりあえず、Visual Studio 2010のランタイムがないと動かないと思われます。MFCは共有DLLにしてますが、ランタイムだけで動くかはわかりません。
ソース
// 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(); }