我正在使用opencv c ++进行面部检测 - 识别项目,代码工作真的很慢,真正的相机输入和处理过的输入之间存在滞后,我不希望用户看到该延迟。
所以我可以有一个只从相机读取帧并显示它的功能。并且所有检测/识别工作都可以在其他并行运行的功能上完成?
我也希望我的结果在屏幕上可见(脸部周围的框有必要的细节)所以我可以跨功能传输这些数据。我可以创建一个Rect数据类型的向量,其中包含所有这些矩形数据,可以通过所有函数访问这些矩形数据以推送新面并显示它们吗?
我只是在寻找这个问题的解决方案,我对并行计算知之甚少,如果还有其他选择请详细说明
感谢
仙人
答案 0 :(得分:0)
是的,您需要在单独的线程中运行面部检测和识别代码。首先,您需要复制框架以在另一个线程上使用它。
使用Rect的矢量会很方便。但是,在使用向量时需要锁定互斥锁,以防止并行访问相同数据时出现问题。并且您需要在复制帧时锁定互斥锁。
我应该注意,如果您的面部检测和识别代码运行得非常慢,它将永远不会给您最新的结果:矩形将被取代。
答案 1 :(得分:0)
首先要注意一件事 - 总会有一些滞后。即使您只是从相机显示图像视频(没有任何处理),它也会有点延迟。
优化人脸检测过程也很重要,并行计算不会解决你所有的问题。 Here我已经写了一些关于这一点(但主要是关于面部内的眼睛检测)。值得尝试的花药技术是检查在最后一帧中找到面部的区域(图像的一部分)是否发生了变化。一般的想法很简单 - 从旧(前一个)帧的相同区域中减去新(实际)帧的区域。然后在结果图像上使用二进制阈值操作(你需要通过尝试不同的值来找到你自己的阈值 - 我不确定,但我认为我使用了大约30的东西 - 不要使用太小的值,因为两个帧之间总有一些差异,因为噪音和照明的变化很小等)。然后计算所有非零像素,并将该数字除以该区域的所有像素(=宽度*高度)并乘以100.此数字将是已更改像素的百分比。如果此值很小,则您没有分析当前帧,您可以假设前一帧的分析结果仍然是实际且正确的。请注意,只有当背景没有快速变化时(例如树木或水),此技术才能正常工作。