从 CaptureElement 和 MediaCapture 执行实时视频流处理

Posted

技术标签:

【中文标题】从 CaptureElement 和 MediaCapture 执行实时视频流处理【英文标题】:Perform live video stream processing from CaptureElement & MediaCapture 【发布时间】:2012-10-01 21:48:15 【问题描述】:

在我的 Windows 8 应用商店应用程序中,我倾向于执行实时视频流处理(例如人脸检测)。


技术 1

在我之前的 Windows 7 应用程序中,我能够使用以下技术 (Camera Face Detection in C# Using Emgu CV (OpenCV in .NET) and WPF) 来执行实时视频处理。该技术是,具有固定周期的计时器回调,以主动从相机对象查询图像缓冲区

void timer_Tick(object sender, EventArgs e)

    Image<Bgr,Byte> currentFrame = capture.QueryFrame();
    // Perform image processing based on currentFrame

技巧2

我之前在android 中使用的另一种技术是,我将在相机本身上安装一个相机缓冲区预览回调。 相机将通过传递捕获的相机缓冲区定期触发回调。从那里,我可以进行图像处理。

public abstract void onPreviewFrame (byte[] data, Camera camera)

    // Perform image processing based on data

然而,在讨论Windows 8 Store Application的视频处理的文章中,他们大多使用内置的处理功能

How to rotate captured video (Windows Store apps using C#/VB/C++ and XAML) How to add video stabilization effect to captured video (Windows Store apps using C#/VB/C++ and XAML)

它们都没有演示如何访问原始相机捕获的缓冲区,逐个像素地迭代缓冲区。

我相信我需要根据

使用CaptureElement &amp; MediaCapture

http://blog.xyzzer.me/2012/01/22/displaying-webcam-preview-in-a-metro-app-using-winrt-and-xaml/

如果您只想查看网络摄像头输入或 轻松将其捕获到文件中。如果你想处理视频 实时或覆盖一些其他 UI 组件 - 输入...

CaptureElement 和 MediaCapture 方式

不过,之后作者没有再详细说明。 (我希望他这样做:)

任何提示如何?

【问题讨论】:

【参考方案1】:

您可以首先尝试的是 MediaCapture.CapturePhotoToStreamAsync,我认为这也只是该照片将被压缩的情况,但您可能会很快将其解码回 WriteableBitmap 并对其像素进行一些处理。不过,您可能不会每秒处理太多帧。

更好的方法可能是使用 MediaCapture.AddEffectAsync() 并用 C++ 编写一个媒体基础转换 (MFT) 来处理视频并以某种方式将结果传送回应用程序。

【讨论】:

我通过您博客中的链接 channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-777T 浏览了 MFT 信息。关于 MFT 的任何想法都可以在 C# 中实现,因为我现在所有的视频缓冲区处理代码都在 C# 中?想知道为什么微软让 Metro 中的相机缓冲区处理比其桌面更困难。 我认为 MFT 只是 C++,我推测这是因为它需要最高性能,而用于 Windows Store 应用程序的 .NET 缺少许多需要在此之前实现的基本功能。总体而言,尽管他们似乎正在推动使用本机堆栈开发游戏和媒体应用程序 - 首先是因为它已经可用,其次是人们学习和构建更多高性能应用程序。 另外检查older question我回答了一些关于 MFT 的大脑转储。 感谢您的资源。 1783行Grayscale.cpp代码只是为了进行灰度转换? :(顺便说一句,你认为灰度 c++ 项目能够直接从 OpenCV Windows 7 DLL 使用函数吗?几天前我尝试在 Windows Store App 中使用 EgmuCV (C# wrapper) + OpenCV DLL。它不会工作,因为 Windows Store应用程序不能使用 Windows 7 DLL?!如果我在 MFT C++ 代码中使用 Windows 7 DLL,我不确定事情会不会有所不同? 我记不太清了,但是灰度的东西可以处理多种视频流格式,而且很好 - 编写 MFT 似乎不是那么简单。好处是,一旦您确定了实际处理代码的位置 - 您只需修改几行代码即可更改帧的处理方式。如果您的库不能在应用程序中的 Win8 上运行 - 它也不应该在 MFT 中运行。

以上是关于从 CaptureElement 和 MediaCapture 执行实时视频流处理的主要内容,如果未能解决你的问题,请参考以下文章

uwp之拍照(使用后置摄像头)

可以投射或流式传输(Android-Chromecast)本地文件吗?

如何在 Windows 8.1 中捕获高分辨率视频并从中捕获照片。我在尝试时遇到了 UI 跳跃效果

WPF MVVM从入门到精通4:命令和事件

直接从表中选择和从视图中选择是不是具有相同的性能影响

从 Schema 和 Schema 从 GUI 生成 GraphQL GUI