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; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。