Kinect for Windows SDK の C++ ラッパーを作りました。Kinect for Windows SDK の C++は割とinterfaceむき出して使うのに手間がかかるので、C#を参考にクラスライブラリを作ってみました。ライブラリファイルとかはまだ作ってないので、頑張ってビルドしてください(一応vc110とvc100コンパイラでの確認をしています)。あとパラメーター関連のテストを作ってないです。
サンプルコード
とりあえずこのライブラリを使うと、どんなコードになるか載せておきます。
カラーカメラ、デプスカメラ、スケルトン、オーディオ、顔検出が利用可能です。未実装機能として、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;
}
}
Kinect for Windows SDK C++ ラッパー
Kinect for Windows SDK の C++ ラッパーです。C#に近い使い方を可能にしています。
環境
- Windows 8 Pro
- Visual Studio 2012 Ultimate
- C++
- OpenCV 2.3.1
免責事項
本ソフトウェアは使用者の責任において利用してください。 このプログラムによって発生したいかなる障害・損害も、作成者は一切責任を負わないものとします。また、本リポジトリは予告なく削除または移動する場合があります。