Kinect2+Opencv绘制声源定位方向

没什么事儿做给之前的Kinect2声源定位功能加上一个小的图形化界面,效果如下图所示:

Kinect2+Opencv绘制声源定位方向_第1张图片


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;
}

//女票看完电影了,我先撤啦~本来还想再写两句的

祝开发愉快~



你可能感兴趣的:(【___kinect___】,语音语音,-----语言相关-----)