繁体   English   中英

我可以通过并行运行的两个功能来访问相机框架吗?

[英]can i access a camera frame in two functions running in parallel?

我正在使用opencv c ++进行人脸检测-识别项目,该代码的运行速度非常慢,真实的相机供稿与处理后的供稿之间存在滞后,我不希望该滞后对用户可见。

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

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

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

谢谢

里士

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

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

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

首先要注意一件事-总是会有一些滞后。 即使仅显示来自摄像机的图像视频(未经任何处理),也会有些延迟。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM