0

我正在使用 opencv c++ 进行人脸检测 - 识别项目,代码运行速度非常慢,真实的相机馈送和处理后的馈送之间存在滞后,我不希望用户看到这种滞后。

所以我可以有一个功能,它只是从相机读取一帧并显示它。并且所有检测/识别工作都可以在其他并行运行的功能上完成?

我也希望我的结果在屏幕上可见(面部周围有一个带有必要细节的框),所以我可以跨功能传输这些数据。我可以创建一个包含所有这些矩形数据的 Rect 数据类型的向量,所有函数都可以访问这些数据以推送新面孔并显示它们吗?

我只是在寻找解决这个问题的方法,我对并行计算知之甚少,如果有其他选择,请提供详细信息

谢谢

理士

4

2 回答 2

0

首先要注意一件事——总会有一些滞后。即使您只是显示来自相机的图像视频(没有任何处理),它也会有点延迟。

优化人脸检测的过程也很重要,并行计算并不能解决你所有的问题。这里我已经写了一些(但主要是关于面部内的眼睛检测)。值得尝试的另一个技术是检查您在最后一帧中找到面部的区域(图像的一部分)是否发生了变化。一般的想法很简单——从旧(前一个)帧的同一区域中减去新(实际)帧的区域。然后在结果图像上使用二进制阈值操作(您需要通过尝试不同的值自行找到阈值 - 我不确定,但我认为我使用了大约 30 的值 - 不要使用太小的值,因为两个帧之间总是存在一些差异,因为噪声和光照变化很小等)。然后计算所有非零像素,并将该数字除以该区域的所有像素(= 宽度 * 高度)并乘以 100。这个数字将是改变像素的百分比。如果这个值很小,你没有分析当前帧,你可以假设前一帧的分析结果仍然是真实的和正确的。请注意,只有当背景没有快速变化(例如树木或水)时,这种技术才能正常工作。

于 2013-06-07T10:53:39.070 回答
0

是的,您需要在单独的线程中运行人脸检测和识别代码。首先,您需要复制框架以在另一个线程上使用它。

使用 Rect 的向量会很方便。但是在使用vector时需要锁定mutex,以防止并行访问相同数据时出现问题。并且您需要在复制帧时锁定互斥锁。

我应该注意,如果您的面部检测和识别代码运行非常缓慢,它永远不会给您最新的结果:矩形将被替换。

于 2013-06-07T07:31:24.737 回答