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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Kinect

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

Q&A

解決済

1回答

1799閲覧

KINECTv2において音声方向が認識されず、動かない

kana_yamamoto

総合スコア7

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Kinect

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

0グッド

0クリップ

投稿2017/08/09 05:41

Kinectv2で音声方向を取得し、線で描画するようにしたいのですが、デバックすると線が固まっていて動きません。音声を認識している様子もないのでどうすれば治るのかわかりません。
環境はWindows10、VisualStudio2015のC++で開発しています。
プログラムは本をほとんど映したものなのでなぜ動かないのかもわかりません。
環境変数などは設定済みです。
よろしくお願いします。
以下プログラム

#include <sstream> #include<Kinect.h> #include<opencv2\opencv.hpp>//opencv #include<atlbase.h>//opencv //using namespace std; #define ERROR_CHECK( ret ) \ if ( (ret) != S_OK ){ \ 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 = nullptr; CComPtr<IAudioBeamFrameReader> audioBeamFrameReader = nullptr; float beamAngle; float beamAngleConfidence; //IKinectSensor* kinect = nullptr; IColorFrameReader* colorFrameReader = nullptr; std::vector<BYTE> colorBuffer; int colorWidth; int colorHeight; unsigned int colorBytesPerPixel; WAITABLE_HANDLE waitableHandle = 0; bool isAvailable = false; public: void initialize() { //デフォルトのkinectを取得する ERROR_CHECK(::GetDefaultKinectSensor(&kinect)); ERROR_CHECK(kinect->Open()); //カラーリーダーを取得する CComPtr<IColorFrameSource> colorFrameSource; ERROR_CHECK(kinect->get_ColorFrameSource(&colorFrameSource)); ERROR_CHECK(colorFrameSource->OpenReader(&colorFrameReader)); //カラー画像のサイズを取得する CComPtr<IFrameDescription> colorFrameDescription; ERROR_CHECK(colorFrameSource->CreateFrameDescription(ColorImageFormat::ColorImageFormat_Bgra, &colorFrameDescription)); ERROR_CHECK(colorFrameDescription->get_Width(&colorWidth) ); ERROR_CHECK(colorFrameDescription->get_Height(&colorHeight)); ERROR_CHECK(colorFrameDescription->get_BytesPerPixel(&colorBytesPerPixel)); std::cout << "create :" << colorWidth << "," << colorHeight << "," << colorBytesPerPixel << std::endl; //バッファーを作成する colorBuffer.resize(colorWidth * colorHeight * colorBytesPerPixel); //オーディオを開く CComPtr<IAudioSource> audioSource; ERROR_CHECK(kinect->get_AudioSource(&audioSource)); ERROR_CHECK(audioSource->OpenReader(&audioBeamFrameReader)); } void updateAudioFrame() { //ビームフレームリストを取得する CComPtr<IAudioBeamFrameList> audioBeamFrameList; auto ret = audioBeamFrameReader->AcquireLatestBeamFrames(&audioBeamFrameList); if (ret != S_OK) { return; } //ビームフレームを取得する UINT beamCount = 0; ERROR_CHECK(audioBeamFrameList->get_BeamCount(&beamCount)); for (int i = 0; i < beamCount; i++) { CComPtr<IAudioBeamFrame> audioBeamFrame; ERROR_CHECK(audioBeamFrameList->OpenAudioBeamFrame(i, &audioBeamFrame)); //サブフレームを取得する UINT subFrameCount = 0; ERROR_CHECK(audioBeamFrame->get_SubFrameCount(&subFrameCount)); for (int j = 0; j < subFrameCount; j++) { CComPtr<IAudioBeamSubFrame> audioBeamSubFrame; ERROR_CHECK(audioBeamFrame->GetSubFrame(j, &audioBeamSubFrame)); //角度及び角度の信頼性を取得する ERROR_CHECK(audioBeamSubFrame->get_BeamAngle(&beamAngle)); ERROR_CHECK(audioBeamSubFrame->get_BeamAngleConfidence(&beamAngleConfidence)); } } } void run() { while (1) { update(); draw(); auto key = cv::waitKey(10); if (key == 'q') { break; } } } private: void update() { updateColorFrame();// カラーフレームの更新 } // カラーフレームの更新 void updateColorFrame() { // フレームを取得する CComPtr<IColorFrame> colorFrame; auto ret = colorFrameReader->AcquireLatestFrame(&colorFrame); if (FAILED(ret)) { return; } if (ret == S_OK) { // BGRAの形式でデータを取得する ERROR_CHECK(colorFrame->CopyConvertedFrameDataToArray( colorBuffer.size(), &colorBuffer[0], ColorImageFormat::ColorImageFormat_Bgra)); // スマートポインタを使ってない場合は、自分でフレームを解放する // colorFrame->Release(); } } void draw() { drawColorFrame(); cv::Mat image = cv::Mat::zeros(480, 640, CV_8UC4); //ラジアンから度に変換する auto angle = beamAngle * 180 / 3.1416; //線を回転させる(逆回転させる) auto alpha = 3.1416 / -angle; int offsetX = 320; int offsetY = 240; auto X2 = 0 * cos(alpha) - offsetY * sin(alpha); auto Y2 = 0 * sin(alpha) + offsetY * cos(alpha); //回転させた線を描画する cv::line(image, cv::Point(offsetX, 0), cv::Point(offsetX + X2, Y2), cv::Scalar(255, 255, 255), 10); cv::imshow("AudioBeamAngle", image); //std::cout << "Angle" << angle; } void drawColorFrame() { // カラーデータを表示する cv::Mat colorImage(colorHeight, colorWidth, CV_8UC4, &colorBuffer[0]); cv::imshow("ColorImage", colorImage); } }; void main() { try { KinectApp app; app.initialize(); app.run(); } catch (std::exception& ex) { std::cout << ex.what() << std::endl; } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

run()関数でupdateAudioFrame()を呼び出していないのが原因でした.

投稿2017/08/09 07:47

kana_yamamoto

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問