Kinect2+Opencv绘制声源定位方向

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



Kinect2的SDK会返回声源相对于Kinect2正前方的角度,例如我在画面中偏左,角度自然就偏左,大小为-0.52。


对于声音,Kinect2这块最重要的有两个参数,一个是角度,另一个是确信度,如果对Opencv不感兴趣就直接拖到最后看声源定位的代码。


用手机录制声音,动态显示如下:



下面自然就是准备工作啦。

首先需要Kinect2+Opencv的配置环境工作,详情见上博客:

http://blog.csdn.net/zmdsjtu/article/details/52275879


配置完之后,粘贴代码应该就可以了……


全部代码如下:

#include<iostream>
#include<opencv2\opencv.hpp>
#include "kinect.h"  
#include<string>
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<iostream>
#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;
}

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

祝开发愉快~



  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值