我想将Kinect 2中的动作捕捉数据存储为BVH文件.我找到了Kinect 1的代码,可以在这里找到.我查看了代码,发现了一些我无法理解的内容.例如,在上面提到的代码中,我试图理解skel在代码中的几个地方找到的Skeleton 对象到底是什么.如果没有,是否有任何已知的应用程序可用于完成预期的?
编辑:我试图将Skeleton skel更改为Body skel,我认为它是kinect SDK 2.0的对应对象.但是,当我试图获得身体的位置时,我遇到了错误:
tempMotionVektor[0] = -Math.Round( skel.Position.X * 100,2);
tempMotionVektor[1] = Math.Round( skel.Position.Y * 100,2) + 120;
tempMotionVektor[2] = 300 - Math.Round( skel.Position.Z * 100,2);
Run Code Online (Sandbox Code Playgroud)
调用Body skel的函数Position时,我遇到了错误.如何在sdk 2.0中检索骨架的X,Y,Z?我试图将以上三行更改为:
tempMotionVektor[0] = -Math.Round(skel.Joints[0].Position.X * 100, 2);
tempMotionVektor[1] = Math.Round(skel.Joints[0].Position.Y * 100, 2) + 120;
tempMotionVektor[2] = 300 - Math.Round(skel.Joints[0].Position.Z * 100, 2);
Run Code Online (Sandbox Code Playgroud)
编辑:基本上我设法在bodyBasicsWPF和kinect2bvh组合后存储一个bvh文件.然而,似乎我存储的骨架效率不高.肘部有奇怪的动作.我想知道我是否必须更改文件kinectSkeletonBVH.cp中的内容.更具体地说,kinect 2版本的关节轴方向的变化是什么.如何更改以下行:skel.BoneOrientations[JointType.ShoulderCenter].AbsoluteRotation.Quaternion; 我尝试更改该行skel.JointOrientations[JointType.ShoulderCenter].Orientation.我对吗?我使用以下代码将关节添加到BVHBone对象:
BVHBone hipCenter = new BVHBone(null, JointType.SpineBase.ToString(), 6, TransAxis.None, true);
BVHBone hipCenter2 = …Run Code Online (Sandbox Code Playgroud) 他们在哪里有所不同?
选择libfreenect或OpenNI + SensorKinect有什么好处,例如,官方SDK,反之亦然?
有什么缺点?
目前我使用Microsoft Kinect测量关节之间的角度.大多数测量都正常工作.每当一个人侧身坐在椅子上(在椅子上)时,Kinect就不会准确地跟踪骨架.为了说明我的问题,我添加了3张Kinect深度视图的图片.



正如您所看到的,3个测量中有2个"正确"工作.每当我抬起腿时,Kinect都会正确地停止骨骼跟踪.有没有人能解决这个问题,或者这只是Kinect的限制?
谢谢.
更新1:
将JointTrackingState-Enumeration在屏幕截图2对这些跟踪关节所示被标记为Inferred,然而深度视图正在跟踪我的全身.
更新2: 截图2我试图跟踪我的前腿,突出显示为绿色.我知道另一条腿没有跟踪但是这没关系,我想.
更新3: 以下代码选择骨架:
private Skeleton StickySkeleton(Skeleton[] skeletons)
{
if (skeletons.Count<Skeleton>(skeleton => skeleton.TrackingId == _trackedSkeletonId) <= 0)
{
_trackedSkeletonId = -1;
_skeleton = null;
}
if (_trackedSkeletonId == -1)
{
Skeleton foundSkeleton = skeletons.FirstOrDefault<Skeleton>(skeleton => skeleton.TrackingState == SkeletonTrackingState.Tracked);
if (foundSkeleton != null)
{
_trackedSkeletonId = foundSkeleton.TrackingId;
return foundSkeleton;
}
}
return _skeleton;
}
Run Code Online (Sandbox Code Playgroud)
每当跟踪骨架时,数据将用于绘制关节点并计算关节之间的角度.
更新4: 我测试坐在一个"块",比椅子简化得多.不幸的是,Kinect的行为仍然相同.
以下2个截图:


kinect中的深度相机有多精确?
特别是我想知道:
我现在正在收集大约一天的数据,但大多数作者都没有说出他们的来源,而且价值似乎差别很大......
任何人都可以使用Raspberry Pi从Kinect获取相机数据吗?
我们想用无线Kinect使用以太网或WiFi连接它.否则,如果您有替代方案,请告诉我.
我正在为大学项目开发一个原型演讲文本字幕应用程序.我将在我的项目中使用手势识别,所以我认为使用Kinect作为麦克风源是一个好主意,而不是使用额外的麦克风.我的应用的想法是识别自发的演讲,如长而复杂的句子(我明白,语音听写不会是完美的).我看过许多Kinect语音示例,它引用了Microsoft.Speech,但没有引用System.Speech.由于我需要训练语音引擎并将DictationGrammar加载到语音识别引擎中,因此Microsoft.Speech是我的唯一选择.
我已经设法使用Kinect作为直接麦克风音频源,但由于我正在加载Kinect进行视频预览和手势识别,我无法将其作为直接麦克风访问.
这是直接访问麦克风而无需加载Kinect硬件进行手势等的代码,并且工作正常:
private void InitializeSpeech()
{
var speechRecognitionEngine = new SpeechRecognitionEngine();
speechRecognitionEngine.SetInputToDefaultAudioDevice();
speechRecognitionEngine.LoadGrammar(new DictationGrammar());
speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text);
}
Run Code Online (Sandbox Code Playgroud)
这是我需要在加载后通过Kinect访问访问源的地方,它根本没有做任何事情.我想这样做:
using (var audioSource = new KinectAudioSource())
{
audioSource.FeatureMode = true;
audioSource.AutomaticGainControl = false;
audioSource.SystemMode = SystemMode.OptibeamArrayOnly;
var recognizerInfo = GetKinectRecognizer();
var speechRecognitionEngine = new SpeechRecognitionEngine(recognizerInfo.Id);
speechRecognitionEngine.LoadGrammar(new DictationGrammar());
speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text);
using (var s = audioSource.Start())
{
speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是,是否可以使用System.Speech而不是Microsoft.Speech与当前的Kinect SDK,以及我在第二个代码示例中做错了什么?
GetKinectRecognizer方法
private static …Run Code Online (Sandbox Code Playgroud) 首先:我正在使用Microsoft Visual Studio 2012
我是C#/ Java开发人员,现在我正在尝试使用Microsoft SDK和C++为kinect编程.所以我开始使用Color Basics示例,我无法编译它.起初,没有一个类能够找到Windows.h. 所以我安装了(或者重新安装,我不确定)Windows SDK,并将SDK的include目录添加到项目的包含"路径"中.然后所有问题都消失了,除了一个:
Error 5 error RC1015: cannot open include file 'windows.h'. C:\temp\ColorBasics-D2D\ColorBasics.rc 17 1 ColorBasics-D2D
Run Code Online (Sandbox Code Playgroud)
这就是错误.没有理由,系统可以找到它,因为它被用在多个其他文件中,只有这个文件无法使用它.作为参考,整个文件是bugging(ColorBasics.rc):
//------------------------------------------------------------------------------
// <copyright file="ColorBasics-D3D.rc" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || …Run Code Online (Sandbox Code Playgroud) 我买了一个Kinect在我的电脑上玩C#.(编程真有趣!)
我正在使用CLNUIDevice.dll从Kinect获取深度图像.这工作正常,我能够通过图像中的RGB值读取深度.
现在我想知道哪些库可以做不同类型的识别.我见过手识别,人脸识别,骨骼,情感,物体等.
图像处理库不一定是Kinect(虽然这样会很好)而且它们不一定是.Net(虽然这样会很好).例如:任何对象跟踪库都可以工作,但如果它可以正确使用Kinect的3D热图,它将更好地工作.
我有一个使用Kinect处理视频会议的项目(或者更可能是其中四个).现在,我的公司为我们的VTC房间使用这些价格昂贵的相机.希望是,将几个Kinects联系在一起,我们可以降低成本.计划是让其中四个/五个覆盖180度弧线,这样Kinects就可以看到整个房间/桌子(仍然比我们现有的相机便宜很多!).应用程序将根据桌面上的对象选择来自Kinect的视频流.计划在理论上很好,但我遇到了障碍.
据我所知,没有办法分辨哪个麦克风阵列与Kinect Runtime对象相对应.我可以使用以下方法获取表示每个Kinect的对象:
Device device = new Device();
Runtime[] kinects = new Runtime[device.Count];
for( int i = 0; i < kinects.Length; i ++ )
kinects[i] = new Runtime(i);
Run Code Online (Sandbox Code Playgroud)
每个麦克风阵列使用:
var source = new KinectAudioSource();
IEnumerable<AudioDeviceInfo> devices = source.FindCaptureDevices();
foreach( AudioDeviceInfo in device in devices)
{
KinectAudioSource devSpecificSource = new KinectAudioSource();
devSpecificSource.MicrophoneIndex = (short)device.DeviceIndex;
}
Run Code Online (Sandbox Code Playgroud)
但是我找不到任何方法可以知道运行时A对应于KinectAudioSource B.对于我正在使用的两个Kinect来说这不是一个大问题(我只是想猜哪个是哪个,如果它们错了就转换它们) ,但是当我们获得四到五个Kinects时,我不希望每次应用程序运行时都需要进行任何类型的校准.我已经考虑过假设Runtime和KinectAudioSource对象的顺序相同(运行时索引0对应于设备中的第一个AudioDeviceInfo),但这似乎有风险.
所以,问题是:有没有办法将Runtime对象与其KinectAudioSource匹配?如果没有,是否保证它们的顺序正确,那么我可以将Runtime 0与设备中的第一个KinectAudioSource麦克风索引相匹配?
更新: 最后猛烈抨击WPF的单线程公寓要求和Kinect音频的多线程公寓要求足以使两者一起行动.问题是,据我可以告诉,Kinect的运行对象和KinectAudioSources的顺序都没有排队.我在一个相当响亮的实验室(我是......可能是房间内的40名实习生之一),所以很难测试,但我很确定订单已经切换为我插入的两个Kinects.我有两个Runtime对象和两个KinectAudioSource对象.当第一个KinectAudioSource报告声音直接来自它前面时,我实际上站在与第二个Runtime对象关联的Kinect前面.所以不能保证两者的订单排成一行.现在,重复一下这个问题:如何将KinectAudioSource对象与Nui.Runtime对象进行匹配?现在,我只挂了两个Kinect,但由于目标是四个或五个......我需要一个具体的方法来做到这一点.
更新2: 带回我工作的两个Kinects回家玩.三个Kinects,一台电脑.有趣的东西(实际上很难将它们全部安装到一起,其中一个视频源似乎没有工作,所以我现在回到2).musefan的回答让我希望我错过了AudioDeviceInfo对象中的一些内容,这些内容可以解释这个问题,但没有运气.我在运行时对象中找到了一个名为NuiCamera.UniqueDeviceName的有趣外观字段,但我在AudioDeviceInfo中找不到该字段和任何内容之间的任何链接.
这些字段的输出,希望Sherlock Holmes看到线程并注意到连接:
Console.WriteLine("Nui{0}: {1}", i, nuis[i].NuiCamera.UniqueDeviceName);
//Nui0: USB\VID_0409&PID_005A\6&1F9D61BF&0&4
//Nui1: USB\VID_0409&PID_005A\6&356AC357&0&3
Console.WriteLine("AudioDeviceInfo{0}: {1}, {2}, {3}", audios.IndexOf(audio), …Run Code Online (Sandbox Code Playgroud) 我在wpf应用程序中工作,我在XAML中创建了一个复选框,然后我的代码在一个类中调用一个函数,在这个函数中有一个if条件,它检查复选框是否被选中但是没有看到复选框在这堂课上,怎么做呢?
非常感谢
编辑:
这是我做的步骤:我在KinectSkeleton的同一项目下创建了ViewModel类,如下所示:ViewModel类:
public class ViewModel
{
public bool IsChecked { get; set; }
public bool is_clicked { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在KinectSkeleton中我定义了一个属性,如下所示:
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register("ViewModelH", typeof(ViewModel), typeof(KinectSkeleton), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
public ViewModel ViewModelH
{
get
{
return (ViewModel)GetValue(ViewModelProperty);
}
set
{
SetValue(ViewModelProperty, value);
}
}
Run Code Online (Sandbox Code Playgroud)
并且KinectWindow.xaml中的复选框和按钮的代码是:
<Button Content="Calibrate" Height="24" x:Name="Calibrate" x:FieldModifier="public" Width="90" Click="Calibrate_Click" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Left" DockPanel.Dock="Left" Panel.ZIndex="0" Padding="0" VerticalAlignment="Center" />
<CheckBox IsChecked="{Binding Mode=TwoWay, Path=IsChecked}" Content="AngleDifference" Height="22" x:Name="AngleDifference" x:FieldModifier="public" Width="117" Checked="AngleDifference_Checked" Unchecked="AngleDifference_Unchecked" HorizontalAlignment="Left" VerticalAlignment="Center" …Run Code Online (Sandbox Code Playgroud)