从CaptureElement和MediaCapture执行实时video流处理

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


技术1

在我以前的Windows 7应用程序中,我能够使用以下技术( C#中的相机面部检测使用Emgu CV(OpenCV in .NET)和WPF )来执行实时video处理。 该技术具有固定周期定时器回调,以主动从相机对象查询图像缓冲区

void timer_Tick(object sender, EventArgs e) { Image 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的video处理的文章中,他们大多使用内置处理function

  • 如何旋转捕获的video(使用C#/ VB / C ++和XAML的Windowsapp store应用)
  • 如何为捕获的video添加video稳定效果(使用C#/ VB / C ++和XAML的Windowsapp store应用)

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

我相信我需要根据使用CaptureElement & MediaCapture

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

如果您只想查看网络摄像头输入或将其捕获到文件而没有麻烦,这种方法很棒。 如果您想实时处理video或覆盖其他一些UI组件 – 请输入…

CaptureElement和MediaCapture方式

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

任何提示如何从CaptureElement和MediaCapture执行实时video流处理?

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

更好的方法可能是使用MediaCapture.AddEffectAsync()并在C ++中编写一个Media Foundation Transform(MFT)来处理video,并以某种方式将结果传回给应用程序。