Kinect结合Unity基础使用(一)

Kinect结合Unity基础使用(一),第1张

SDK 安装

kinect 是输入。类似鼠标 即时动态捕捉、影像辨识、麦克风输入、语音辨识

Kinect 是一组传感器的组合,包含一个彩色摄像头,一对深度摄像头(一个用以发射红

外,一个用以接收) ,一组麦克风阵列和底座马达。

彩色摄像头想必大家都已经很熟悉了。深度摄像头是由红外线提供的,返回画面上每个

点的深度值(离 Kinect 的距离,单位是 mm,标称精度约 5mm) 。麦克风阵列其实是数个水平放置的麦克风,因为彼此间有距离,所以可手档亩以识别说话人的方向,借此粗略估计是哪个玩家在说话,便于想象的话可以理解为类似声纳图(声音我们不涉及)。

读取彩色数据流,可以获得一张1080p的图片(1920*1080)

犹如拍照应用

看SDK自带示例

Color Depth D2D 彩色数据流

和许多输入设备不一样,Kinect 能够产生三维数据,它有红外发射器和摄像头。 Kinect SDK 从红外摄像头获取的红外数据后,对其进行计算处理,然后产生景深影像数据。

深度帧数据中,每个像素占 16 位,即每一个像素占 2 个字节。每一个像素的深度值只占用了 16 个位中的 13 个位。

获取每一个像素的距离很容易,但是要直接使用还需要做一些位 *** 作。如上图所示,深度值存储在第 3 至 15 位中蠢橘,要获取能够直接使用的深度数据需要毕森向右移位,将游戏者索引(Player Index)位移除

看SDK自带示例

Depth Basics-D2D 深度数据流

0.5-4.5米

25个关节点 每个关节点的 3D空间坐标和转向

看SDK自带示例

Body Basics D2D 骨骼数据流

示例:

Color Depth D2D 彩色数据流

Depth Basics-D2D 深度数据流

Coordinate Mapping Basics 扣出人物,置换背景

Body Basics D2D 骨骼数据流

1. 如果一个非微软的Kinect驱动安装在你的Windows PC上,那么请卸载它,再安装

微软的Kinect驱动,否则可能Kinect不工作;

2. 务必给Kinect连接外接电源—如果你想让Kinect全力工作的话;如果Kinect只依靠

通过USB端口提供的电源,那么它只能发挥最小限度的功能; 3. 播放标准的音频和视频,不需要特定的软件;

4. 如果你使用USB hub的话,那么Kinect将是接在USB hub上的唯一设备。如果你有

多个Kinect,请把它们连接到不同的USB Controllers。如果2台Kinect连接到了一个USB端口上,那么只有一个能正常工作; 5. Kinect内置了一个风扇来防止过热。风扇是由Kinect的固件控制的,一旦温度达到

90摄氏度,摄像头就会关闭。没有提供能控制风扇的API. 6. 合理的光照—不能太强也不能太弱,对于RGB摄像头是非常重要的。白炽光、荧光

灯和自然光照没有问题。切忌用强烈的光连续照射摄像头,这会“弄瞎”摄像头的。 7. 深度传感器在普通和弱光首斗下工作正常,只是在接近黑暗的光照下会增加信号中的噪声。

8. 深度传感器是通过反射光来分析深度信息的。因此,强反射的(如镜子,打磨的金属)、强吸光的物体可能不会被识别的非常好。

加载完驱动神简后,现在开始设置你的开发环境。如果你使用的是Visual Studio,请阅读下面的开发环者瞎磨境设置知识来帮助你创建你的第一个C#或C++应用程序。

[csharp] view plain copy

using System

using System.Collections.Generic

using System.Linq

using System.Text

using System.Windows

using System.Windows.Controls

using System.Windows.Data

using System.Windows.Documents

using System.Windows.Input

using System.Windows.Media

using System.Windows.Media.Imaging

using System.Windows.Navigation

using System.Windows.Shapes

using Microsoft.Kinect

namespace WpfApplication2

{

///笑纳 <summary>

/// MainWindow.xaml 的交互逻辑

/搏坦// <碰银没/summary>

public partial class MainWindow : Window

{

public MainWindow()//vs2010自动生成的。

{

InitializeComponent()

}

private KinectSensor _kinect//一个全局变量,自然是用来调用Kinect用的,

private void startKinect()

{

if (KinectSensor.KinectSensors.Count >0)//如果有一个Kinect是可以使用的。

{

_kinect = KinectSensor.KinectSensors[0]//打开第一个Kinect

MessageBox.Show("kinect 目前的状态为:" + _kinect.Status)//这里调用一个messagebox来显示现在的状态。

_kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30)

_kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30)

_kinect.SkeletonStream.Enable()//使能skeleton

_kinect.AllFramesReady +=

new EventHandler<AllFramesReadyEventArgs>(_kinect_AllFramesReady) //大概意思就是添加一个事件处理程序吧,类似于单片机中的//中断。

_kinect.Start()//设置完成之后启动Kinect

}//if

else

{

MessageBox.Show("没有任何Kinect设备")

}

}//start kinect

void _kinect_AllFramesReady(object sender, AllFramesReadyEventArgs e)//打开并显示彩色图像的具体程序。

{

using (ColorImageFrame colorFrame = e.OpenColorImageFrame())

{

if (colorFrame == null)

{

return

}//if null

byte[] pixels = new byte[colorFrame.PixelDataLength]

colorFrame.CopyPixelDataTo(pixels)

int stride = colorFrame.Width * 4

imageCamera.Source =//这个imageCamera变量时在mainFrame中定义的一个Image控件。

BitmapSource.Create(colorFrame.Width, colorFrame.Height,

96, 96, PixelFormats.Bgr32, null, pixels, stride)

}

//throw new NotImplementedException()

}

private void Window_Loaded(object sender, RoutedEventArgs e)//当第一次窗体加载时,调用StartKinect。

{

startKinect()

}

}

}

[csharp] view plain copy


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12465533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存