gpt4 book ai didi

c# - Kinect 框架异步到达

转载 作者:行者123 更新时间:2023-11-30 12:57:57 26 4
gpt4 key购买 nike

我正在寻求有关 Kinect v2 SDK 中的 MultiSourceFrameArrived 事件的帮助。

下面是有问题的方法:

    private async void _reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();

using (var colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame())
{
if (colorFrame != null)
{
_writeableBitmap.Lock();
colorFrame.CopyConvertedFrameDataToIntPtr(
_writeableBitmap.BackBuffer,
(uint)(_colorFrameDescription.Width * _colorFrameDescription.Height * _colorFrameDescription.BytesPerPixel),
ColorImageFormat.Bgra);
_writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, _writeableBitmap.PixelWidth, _writeableBitmap.PixelHeight));
_writeableBitmap.Unlock();
reflectionOverlayControl.ReflectionImageSource = _writeableBitmap;
}
}

using (var bodyFrame = multiSourceFrame.BodyFrameReference.AcquireFrame())
{
if (bodyFrame != null)
{
Body body = JointHelpers.FindClosestBody(bodyFrame);

if (body != null)
{
if (body.IsTracked)
{
Dictionary<BodyComponentType, BodyComponent> bodyComponentDictionary = BuildBodyComponentDictionary(body);

foreach (BodyComponent bodyComponent in bodyComponentDictionary.Values.OrderBy(x => x.BodyComponentType))
{
bodyComponent.Generate(_writeableBitmap, _coordinateMapper, FrameType.Color, 25);
if (!_isRunningFiltering)
{
_isRunningFiltering = true;
try
{
await Task.Run(() =>
{
bodyComponent.RunFunFiltering();
});
}
finally
{
_isRunningFiltering = false;
}
}
}
reflectionOverlayControl.UpdateValues(
bodyComponentDictionary,
GetFullBodyComponent(body));
}
}
}
}
}

现在,请允许我解释一下:

  • 该方法在特定类型的帧从 Kinect 到达时运行,这是获取的,我可以在 using block 中从中提取 ColorFrame 和 BodyFrame。
  • 第一个“using” block 将 ColorFrame 转换为 WPFWriteableBitmap(在构造函数中声明)并将用户控件的 ReflectionImageSource 集设置为等于此 WriteableBitmap。如果这是唯一使用的 block ,我会在屏幕上看到非常流畅的提要!
  • 第二个 BodyFrame 使用确定最接近的 body ,如果它被跟踪,然后创建一个字典填充一个人的 BodyComponents(手、脚、头等)
  • 此处的 foreach 循环在每个 BodyComponent 上运行“生成”函数,这会设置它的一些属性。例如,它设置一个 EncompassingRectangle 属性,该属性是一个 Int32Rect 对象,旨在包含组件。

接下来是我需要帮助的地方!

方法 RunFunFiltering 是一种高度密集的处理方法,运行时会创建一个阻塞语句,卡住我的 UI。这会使我的彩色帧视频输入非常跳跃!这个 RunFunFiltering 方法需要设置 BodyComponent 类的一些属性,例如矩形应该显示的颜色、它的 ReflectionImageSource 中白色像素的数量以及使用包含在长方形。

因为这个对象现在已经完成,所有的属性都设置好了(这已经为字典中的每个 BodyComponent 完成了)我在 View 上运行一个 UpdateValues 方法,它在屏幕上显示 BodyComponent 类中有趣的东西对我来说。

在这篇文章中遵循@sstan 的一些建议:Async Await to Keep Event Firing

我加入了一个 Task.Run() block 。但是,这似乎并没有释放我的用户界面,我仍然看到一个跳动的图像。奇怪的是在那个计时器示例中,它工作得很好!我在这里有点不知所措,不知道该怎么做。

我是异步函数的初学者,但我真的很想了解您的解决方案。如果您能提供有关代码的解释,我将不胜感激!

更新

我已经能够确定获取框架的 using 语句在放置在 Task.Run 调用之外时会阻塞 UI。

我不能只是让整个 BodyFrame using block 异步运行,因为我需要第一个“生成”函数始终发生,而不是繁重的处理线程的一部分。两个 using block 似乎不雅,而是把我的问题推到地毯下......

最佳答案

从您的评论中我了解到以下内容:

  • 你有一个在帧到达时调用的异步函数
  • 如果没有 RunFunFiltering 任务正在运行,则启动一个
  • 如果这样的任务正在运行,请不要启动新任务
  • 如果RunFunFiltering完成处理结果

.

Task taskFunFiltering = null;

private async Task ProcessFrame(...)
{ // a new frame is arrived
DoSomeProcessing(...);
// only start a new run fun filtering if previous one is finished
if (taskFunFiltering == null || taskFunFiltering.IsCompleted)
{ // start a new fun filtering
// don't wait for the result
taskFunFiltering = Task.Run( () => ...);
}
}

private async Task RunFunFiltering(...)
{
// do the filtering and wait until finished
var filterResult = await DoFiltering(...);
DisplayResult(filterResult);
}

关于c# - Kinect 框架异步到达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com