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

Natural Software

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

Kinect for Windows SDK の C++ ラッパーを作りました

Kinect for Windows

Kinect for Windows SDKC++ ラッパーを作りました。Kinect for Windows SDKC++は割とinterfaceむき出して使うのに手間がかかるので、C#を参考にクラスライブラリを作ってみました。ライブラリファイルとかはまだ作ってないので、頑張ってビルドしてください(一応vc110とvc100コンパイラでの確認をしています)。あとパラメーター関連のテストを作ってないです。

プロジェクションマッピングとKinectを組み合わせたインタラクションの展示をしました」で使ったものをベースにしているのですが、C#と合わせるために結構入れ替えたので実質スクラッチに近い状態です。

サンプルコード

とりあえずこのライブラリを使うと、どんなコードになるか載せておきます。

カラーカメラ、デプスカメラ、スケルトン、オーディオ、顔検出が利用可能です。未実装機能として、Audio関連のプロパティがあるので、pull request歓迎です。

#include <NaturalSoftware.Kinect\KinectSensor.h>

#include <NaturalSoftware.Kinect.FaceTracking\FaceTracker.h>

#include <opencv2\opencv.hpp>

#include "StreamingWavePlayer.h"

void drawJoint( ns::KinectSensor& kinect, cv::Mat& image, const ns::Joint& joint )

{

if ( joint.TrackingState == NUI_SKELETON_POSITION_NOT_TRACKED ) {

return;

}

INuiCoordinateMapper *pMapping;

kinect->NuiGetCoordinateMapper(&pMapping);

NUI_COLOR_IMAGE_POINT pt;

pMapping->MapSkeletonPointToColorPoint( (Vector4*)&joint.Position,

kinect.ColorImageStream().GetImageType(),

kinect.ColorImageStream().GetResolution(),

&pt );

cv::circle( image, cv::Point( pt.x, pt.y ), 10, cv::Scalar( 0, 255, 0 ), 5 );

}

void main()

{

try {

ns::KinectSensor& kinect = ns::KinectSensor::KinectSensors().Find(

[]( ns::KinectSensor& k ){ return k.Status() == S_OK; } );

kinect.ColorImageStream().Enable( ns::ColorImageFormat::RgbResolution640x480Fps30 );

kinect.DepthImageStream().Enable( ns::DepthImageFormat::Resolution640x480Fps30 );

kinect.DepthImageStream().SetRange( ns::DepthRange::Near );

kinect.SkeletonStream().Enable();

kinect.SkeletonStream().SetTrackingMode( ns::SkeletonTrackingMode::Seated );

kinect.SkeletonStream().EnableTrackingInNearRange( true );

kinect.Start();

kinect.AudioSource().Start();

kinect.AudioSource().SetSystemMode( 4 );

StreamingWavePlayer player;

player.open( &kinect.AudioSource().GetWaveFormat() );

ns::FaceTracking::FaceTracker faceTracker( kinect );

while ( 1 ) {

ns::ColorImageFrame colorFrame = kinect.ColorImageStream().OpenNextFrame();

cv::Mat image( (int)colorFrame.GetHeight(), (int)colorFrame.GetWidth(),

CV_8UC4, (byte*)colorFrame.GetPixelData() );

ns::DepthImageFrame depthFrame = kinect.DepthImageStream().OpenNextFrame();

cv::Mat depthImage( (int)depthFrame.GetHeight(), (int)depthFrame.GetWidth(),

CV_16UC1, (byte*)depthFrame.GetPixelData() );

ns::SkeletonFrame skeletonFrame = kinect.SkeletonStream().OpenNextFrame();

for ( auto skeleton : skeletonFrame.GetSkeletonData() ) {

if ( skeleton.TrackingState() == NUI_SKELETON_TRACKING_STATE::NUI_SKELETON_TRACKED ) {

for ( int i = 0; i < NUI_SKELETON_POSITION_COUNT; ++i ) {

drawJoint( kinect, image, skeleton.GetJoints()[i] );

}

// スケルトンを使用した顔検出

auto faceFrame = faceTracker.Track(

colorFrame, depthFrame, skeleton.GetSkeletonData() );

if ( faceFrame.IsSucceess() ) {

for ( auto pt : faceFrame.Get2DPoints() ) {

cv::circle( image, cv::Point( pt.x, pt.y ), 1, cv::Scalar( 0, 0, 255 ) );

}

}

}

}

cv::imshow( "ColorCamera", image );

cv::imshow( "DepthCamera", depthImage );

int key = cv::waitKey( 10 );

if ( key == 'q' ) {

break;

}

player.output( kinect.AudioSource().Read() );

}

}

catch ( std::exception& ex ) {

std::cout << ex.what() << std::endl;

}

}

環境などはgithubのものを転記しておきます。

Kinect for Windows SDK C++ ラッパー

Kinect for Windows SDKC++ ラッパーです。C#に近い使い方を可能にしています。

環境

未実装機能

  • Audio関連のプロパティ

ライセンス

ライセンスは「MIT ライセンス」とします。

免責事項

本ソフトウェアは使用者の責任において利用してください。 このプログラムによって発生したいかなる障害・損害も、作成者は一切責任を負わないものとします。また、本リポジトリは予告なく削除または移動する場合があります。