没什么事儿做给之前的Kinect2声源定位功能加上一个小的图形化界面,效果如下图所示:
Kinect2的SDK会返回声源相对于Kinect2正前方的角度,例如我在画面中偏左,角度自然就偏左,大小为-0.52。
对于声音,Kinect2这块最重要的有两个参数,一个是角度,另一个是确信度,如果对Opencv不感兴趣就直接拖到最后看声源定位的代码。
用手机录制声音,动态显示如下:
下面自然就是准备工作啦。
首先需要Kinect2+Opencv的配置环境工作,详情见上博客:
http://blog.csdn.net/zmdsjtu/article/details/52275879
配置完之后,粘贴代码应该就可以了……
全部代码如下:
#include
#include
#include "kinect.h"
#include
using namespace cv;
void 画方向图(Mat 图片,float 方向,float 确信度);
int main()
{
IKinectSensor* 一个Sensor; //申请一个Sensor指针
HRESULT hr = GetDefaultKinectSensor(&一个Sensor); // 获取一个默认的Sensor
BOOLEAN bIsOpen = 0;
一个Sensor->get_IsOpen(&bIsOpen); // 查看下是否已经打开
printf("bIsOpen: %d\n", bIsOpen);
if (!bIsOpen) // 没打开,则尝试打开
{
hr = 一个Sensor->Open();
}
bIsOpen = 0;
一个Sensor->get_IsOpen(&bIsOpen); // 是否已经打开
printf("bIsOpen: %d\n", bIsOpen);
BOOLEAN bAvaliable = 0;
一个Sensor->get_IsAvailable(&bAvaliable); // 是否可用
printf("bAvaliable: %d\n", bAvaliable);
// DWORD dwCapability = 0;
// 一个Sensor->get_KinectCapabilities(&dwCapability); // 获取容量
// printf("dwCapability: %d\n", dwCapability);
// WCHAR bbuid[256] = { 0 };
// 一个Sensor->get_UniqueKinectId(256, bbuid); // 获取唯一ID
// printf("UID: %s\n", bbuid);
// 音频数据获取
IAudioSource* audios = nullptr;
UINT nAudioCount = 0;
hr = 一个Sensor->get_AudioSource(&audios);
IAudioBeam* audiobm = nullptr;
IAudioBeamList* audiobml = nullptr;
audios->get_AudioBeams(&audiobml);
audiobml->OpenAudioBeam(0, &audiobm); // 目前只支持第一个
float fAngle = 0.0f;
float fAngleConfidence = 0.0f;
while (waitKey(30)!=27)
{
Mat img(200, 400, CV_8UC3, Scalar(255, 255, 255));
// circle(img, Point(200, 0), 100, Scalar(0, 0, 0));
fAngle = 0.0f;
fAngleConfidence = 0.0f;
audiobm->get_BeamAngle(&fAngle); // 获取音频的角度
audiobm->get_BeamAngleConfidence(&fAngleConfidence); // 获取音频的可信度(0 - 1)
画方向图(img, fAngle, fAngleConfidence);
imshow("", img);
}
一个Sensor->Close();
return 0;
}
void 画方向图(Mat 图片,float 方向, float 确信度) {
circle(图片, Point(200,0), 100, Scalar(0, 0, 0));
Point 朝向;
朝向.x = 100 * sin(方向)+200;
朝向.y = 100 * cos(方向) ;
if (确信度 > 0.5)
line(图片, Point(200,0), 朝向, Scalar(0, 0, 255));
std::string 显示内容 = "angle:" + std::to_string(方向) + " confidence:" + std::to_string(确信度);
putText(图片, 显示内容, Point(20, 180), CV_FONT_HERSHEY_PLAIN, 1, cv::Scalar(255, 0, 0), 1, 4);
}
单独Kinect2声源定位模块(返回的角度以及确信度)
#include
#include "kinect.h"
int main()
{
IKinectSensor* 一个Sensor; //申请一个Sensor指针
HRESULT hr = GetDefaultKinectSensor(&一个Sensor); // 获取一个默认的Sensor
BOOLEAN bIsOpen = 0;
一个Sensor->get_IsOpen(&bIsOpen); // 查看下是否已经打开
printf("bIsOpen: %d\n", bIsOpen);
if (!bIsOpen) // 没打开,则尝试打开
{
hr = 一个Sensor->Open();
}
bIsOpen = 0;
一个Sensor->get_IsOpen(&bIsOpen); // 是否已经打开
printf("bIsOpen: %d\n", bIsOpen);
BOOLEAN bAvaliable = 0;
一个Sensor->get_IsAvailable(&bAvaliable); // 是否可用
printf("bAvaliable: %d\n", bAvaliable);
// 音频数据获取
IAudioSource* audios = nullptr;
UINT nAudioCount = 0;
hr = 一个Sensor->get_AudioSource(&audios);
IAudioBeam* audiobm = nullptr;
IAudioBeamList* audiobml = nullptr;
audios->get_AudioBeams(&audiobml);
audiobml->OpenAudioBeam(0, &audiobm); // 目前只支持第一个
float fAngle = 0.0f;
float fAngleConfidence = 0.0f;
while (waitKey(30)!=27)
{
Mat img(200, 400, CV_8UC3, Scalar(255, 255, 255));
circle(img, Point(200, 0), 100, Scalar(0, 0, 0));
fAngle = 0.0f;
fAngleConfidence = 0.0f;
audiobm->get_BeamAngle(&fAngle); // 获取音频的角度
audiobm->get_BeamAngleConfidence(&fAngleConfidence); // 获取音频的可信度(0 - 1)
printf("Angle: %3.2f (%1.2f)\n", (fAngle / 3.1415926f)*180.0f, fAngleConfidence);
Sleep(200);
}
一个Sensor->Close();
return 0;
}
//女票看完电影了,我先撤啦~本来还想再写两句的