質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

受付中

KinectV2 HDFaceでのエラー

uramachine
uramachine

総合スコア0

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

0回答

0評価

0クリップ

3閲覧

投稿2017/10/11 19:44

編集2022/01/12 10:55

###前提・実現したいこと
書籍「kinect for windows sdkプログラミングkinect for windows v2センサー対応版」のサンプルを参考に
KinectV2 HDFaceを使用した顔のモーションキャプチャーのサンプルを試しているのですが、以下の例外メッセージが出てしまいます。原因わかりますでしょうか?
※追加の依存ファイルに「Kinect20.Face.lib」は追加しています。

###発生している問題・エラーメッセージ
t
0x000001f4a9b6bf28 <情報はありません。Kinect20.Face.dll のシンボルが読み込まれていません>
0x000000809d0ff538 {p=0x000001f4a9b6bf28 <情報はありません。Kinect20.Face.dll のシンボルが読み込まれていません> }

Program: ...kinectDev\KinectDev\x64\Debug\KinectDev.exe
File: c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\atlmfc\include\atlcomcli.h
Line: 192

Expression: p==0

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

例外がスローされた箇所
atlcomclu.h
T** operator&() throw()
{
ATLASSERT(p==NULL);
return &p;
}

###該当のソースコード

#include <iostream> #include <sstream> #include <vector> #include <array> #define _USE_MATH_DEFINES #include <cmath> #include <atlbase.h> #include <Windows.h> #include <Kinect.h> #include <Kinect.Face.h> #include <opencv2/opencv.hpp> #define ERROR_CHECK( ret ) \ if( FAILED( ret ) ){ \ std::stringstream ss; \ ss << "failed " #ret " " << std::hex << ret << std::endl; \ throw std::runtime_error( ss.str().c_str() ); \ } class KinectApp { private: CComPtr<IKinectSensor> kinect; CComPtr<IColorFrameReader> colorFrameReader; CComPtr<IBodyFrameReader> bodyFrameReader; CComPtr<ICoordinateMapper> coordinateMapper; std::vector<BYTE> colorBuffer; int colorWidth; int colorHeight; unsigned int colorBytesPerPixel; ColorImageFormat colorFormat = ColorImageFormat::ColorImageFormat_Bgra; cv::Mat colorImage; CComPtr<IHighDefinitionFaceFrameReader> hdFaceFrameReader; CComPtr<IFaceModelBuilder> faceModelBuilder; CComPtr<IFaceAlignment> faceAlignment; CComPtr<IFaceModel> faceModel; std::array<float, FaceShapeDeformations::FaceShapeDeformations_Count> shapeUnits; UINT32 vertexCount; UINT64 trackingId; int trackingCount; bool produced; std::array<cv::Scalar, BODY_COUNT> colors; int font = cv::FONT_HERSHEY_SIMPLEX; public: void initialize() { ERROR_CHECK( GetDefaultKinectSensor( &kinect ) ); ERROR_CHECK( kinect->Open() ); BOOLEAN isOpen; ERROR_CHECK( kinect->get_IsOpen( &isOpen ) ); if( !isOpen ){ throw std::runtime_error( "failed IKinectSensor::get_IsOpen( &isOpen )" ); } ERROR_CHECK( kinect->get_CoordinateMapper( &coordinateMapper ) ); CComPtr<IColorFrameSource> colorFrameSource; ERROR_CHECK( kinect->get_ColorFrameSource( &colorFrameSource ) ); ERROR_CHECK( colorFrameSource->OpenReader( &colorFrameReader ) ); CComPtr<IFrameDescription> colorFrameDescription; ERROR_CHECK( colorFrameSource->CreateFrameDescription( colorFormat, &colorFrameDescription ) ); ERROR_CHECK( colorFrameDescription->get_Width( &colorWidth ) ); ERROR_CHECK( colorFrameDescription->get_Height( &colorHeight ) ); ERROR_CHECK( colorFrameDescription->get_BytesPerPixel( &colorBytesPerPixel ) ); colorBuffer.resize( colorWidth * colorHeight * colorBytesPerPixel ); CComPtr<IBodyFrameSource> bodyFrameSource; ERROR_CHECK( kinect->get_BodyFrameSource( &bodyFrameSource ) ); ERROR_CHECK( bodyFrameSource->OpenReader( &bodyFrameReader ) ); initializeHDFace(); // Lookup Table colors[0] = cv::Scalar( 255, 0, 0 ); colors[1] = cv::Scalar( 0, 255, 0 ); colors[2] = cv::Scalar( 0, 0, 255 ); colors[3] = cv::Scalar( 255, 255, 0 ); colors[4] = cv::Scalar( 255, 0, 255 ); colors[5] = cv::Scalar( 0, 255, 255 ); } void run() { while( 1 ){ update(); draw(); int key = cv::waitKey( 10 ); if( key == VK_ESCAPE ){ cv::destroyAllWindows(); break; } } } private: void initializeHDFace() { CComPtr<IHighDefinitionFaceFrameSource> hdFaceFrameSource; ERROR_CHECK( CreateHighDefinitionFaceFrameSource( kinect, &hdFaceFrameSource ) ); ERROR_CHECK( hdFaceFrameSource->OpenReader( &hdFaceFrameReader ) ); ERROR_CHECK( CreateFaceAlignment( &faceAlignment ) ); ERROR_CHECK( CreateFaceModel( 1.0f, FaceShapeDeformations::FaceShapeDeformations_Count, &shapeUnits[0], &faceModel ) ); ERROR_CHECK( GetFaceModelVertexCount( &vertexCount ) ); FaceModelBuilderAttributes attribures = FaceModelBuilderAttributes::FaceModelBuilderAttributes_None; ERROR_CHECK( hdFaceFrameSource->OpenModelBuilder( attribures, &faceModelBuilder ) ); ERROR_CHECK( faceModelBuilder->BeginFaceDataCollection() ); } void update() { updateColorFrame(); updateBodyFrame(); updateHDFaceFrame(); } void updateColorFrame() { CComPtr<IColorFrame> colorFrame; HRESULT ret = colorFrameReader->AcquireLatestFrame( &colorFrame ); if( FAILED( ret ) ){ return; } ERROR_CHECK( colorFrame->CopyConvertedFrameDataToArray( static_cast<UINT>( colorBuffer.size() ), &colorBuffer[0], colorFormat ) ); colorImage = cv::Mat( colorHeight, colorWidth, CV_8UC4, &colorBuffer[0] ); } void updateBodyFrame() { CComPtr<IBodyFrame> bodyFrame; HRESULT ret = bodyFrameReader->AcquireLatestFrame( &bodyFrame ); if( FAILED( ret ) ){ return; } std::array<CComPtr<IBody>, BODY_COUNT> bodies; ERROR_CHECK( bodyFrame->GetAndRefreshBodyData( BODY_COUNT, &bodies[0] ) ); findClosestBody( bodies ); } inline void findClosestBody( const std::array<CComPtr<IBody>, BODY_COUNT>& bodies ) { float closest = FLT_MAX; for( int count = 0; count < BODY_COUNT; count++ ){ CComPtr<IBody> body = bodies[count]; BOOLEAN tracked; ERROR_CHECK( body->get_IsTracked( &tracked ) ); if( !tracked ){ continue; } std::array<Joint, JointType::JointType_Count> joints; ERROR_CHECK( body->GetJoints( JointType::JointType_Count, &joints[0] ) ); Joint joint = joints[JointType::JointType_Head]; if( joint.TrackingState == TrackingState::TrackingState_NotTracked ){ continue; } CameraSpacePoint point = joint.Position; float distance = std::sqrt( std::pow( point.X, 2 ) + std::pow( point.Y, 2 ) + std::pow( point.Z, 2 ) ); if( closest <= distance ){ continue; } closest = distance; UINT64 id; ERROR_CHECK( body->get_TrackingId( &id ) ); if( trackingId != id ){ trackingId = id; trackingCount = count; produced = false; CComPtr<IHighDefinitionFaceFrameSource> hdFaceFrameSource; ERROR_CHECK( hdFaceFrameReader->get_HighDefinitionFaceFrameSource( &hdFaceFrameSource ) ); ERROR_CHECK( hdFaceFrameSource->put_TrackingId( trackingId ) ); } } } void updateHDFaceFrame() { CComPtr<IHighDefinitionFaceFrame> hdFaceFrame; HRESULT ret = hdFaceFrameReader->AcquireLatestFrame( &hdFaceFrame ); if( FAILED( ret ) ){ return; } BOOLEAN tracked; ERROR_CHECK( hdFaceFrame->get_IsFaceTracked( &tracked ) ); if( !tracked ){ return; } ERROR_CHECK( hdFaceFrame->GetAndRefreshFaceAlignmentResult( faceAlignment ) ); if( faceAlignment != nullptr ){ // Face Modelのフィッティング buildFaceModel(); // 結果を取得、描画 result(); } } inline void buildFaceModel() { if( produced ){ cv::putText( colorImage, "Status : Complete", cv::Point( 50, 50 ), font, 1.0f, colors[trackingCount], 2, CV_AA ); return; } FaceModelBuilderCollectionStatus collection; ERROR_CHECK( faceModelBuilder->get_CollectionStatus( &collection ) ); if( collection ){ // コレクション状態 cv::putText( colorImage, "Status : " + std::to_string( collection ), cv::Point( 50, 50 ), font, 1.0f, colors[trackingCount], 2, CV_AA ); std::string status = status2string( collection ); cv::putText( colorImage, status, cv::Point( 50, 80 ), font, 1.0f, colors[trackingCount], 2, CV_AA ); // キャプチャー状態 FaceModelBuilderCaptureStatus capture; ERROR_CHECK( faceModelBuilder->get_CaptureStatus( &capture ) ); status = status2string( capture ); cv::putText( colorImage, status, cv::Point( 50, 110 ), font, 1.0f, colors[trackingCount], 2, CV_AA ); return; } CComPtr<IFaceModelData> faceModelData; ERROR_CHECK( faceModelBuilder->GetFaceData( &faceModelData ) ); if( faceModelData != nullptr ){ ERROR_CHECK( faceModelData->ProduceFaceModel( &faceModel ) ); produced = true; } } inline std::string status2string( const FaceModelBuilderCollectionStatus collection ) { //文字数の都合上省略します。 return status; } inline std::string status2string( const FaceModelBuilderCaptureStatus capture ) { //文字数の都合上省略します。 } inline void result() { //文字数の都合上省略します。 } void draw() { drawHDFaceFrame(); } void drawHDFaceFrame() { if( !colorImage.empty() ){ cv::imshow( "HDFace", colorImage ); } } }; void main() { try{ KinectApp app; app.initialize(); app.run(); } catch( std::exception& ex ){ std::cout << ex.what() << std::endl; } }

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio Community 2017

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

LouiS0616
LouiS0616

2017/10/11 21:35 編集

パスは通してますか?あと、おそらくいずれかのCComPtrがヌルになってしまっているので、適宜ブレークポイントをおいて発生個所を絞り込んで下さい。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。