如何在30 FPS下正确平滑检测到的面部位置和大小?

时间:2014-02-02 22:55:08

标签: avfoundation face-detection core-image

我想过滤检测到的脸部的位置和大小,以便沿着时间平滑。

问题是视频大约是30 FPS但调用面部检测的方法: captureOutput:didOutputSampleBuffer:fromConnection 每秒调用一次,然后将矩形(一个CGRect)发送到要使用的主线程: dispatch_async(dispatch_get_main_queue() 因此,如果我在程序的那一部分应用低通滤波器或卡尔曼滤波器并不重要,因为它每秒更新矩形5次,这就是我看到矩形像振动或其位置有噪声的原因。

我该怎么办?

为了在那里应用过滤器,我应该以每秒30个滴答或类似的速度添加定时器(NSTimer)之类的东西吗? 你会使用什么程序架构?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我对avfoundation不是很熟悉,但是你可以使用它来探索API: addPeriodicTimeObserverForInterval:queue:usingBlock:on AVPlayer

你可以给它一个1/30 CMTime,它将被定时到视频而不是绝对时间。

然后是与输出捕获委托协调的问题。听起来它们可能由不同的线程(?)处理,因此您可能希望创建某种线程安全队列数据结构,以将事件从周期性时间观察器传递到输出捕获。这种东西似乎不是一个内置的库,所以你可能必须对这件作品有所启发。