在 Arduino Create 中使用 OpenCV 进行人脸检测
在这里,我们利用OpenCV库并应用方向梯度直方图(HOG)算法来创建一个用于人员检测/计数的计算机视觉应用程序。
计算(或测量)进入指定区域的人数。您可能熟悉人员计数系统,这些系统用于小型商店、图书馆和便利店,它们使用红外传感器来检测人员。当红外线束被截断(例如,一个人通过进入或离开门来拦截它)时,系统就会增加计数。当涉及到遮挡情况时(当一个人A挡住人B,并且人B没有被计数时),这项技术有局限性。一个设计得当的基于计算机视觉的人员计数系统在处理遮挡情况时可以更稳健。在这里,我们利用OpenCV库并应用方向梯度直方图(HOG)算法来创建一个用于人员检测/计数的计算机视觉应用程序。
你将学到什么
- 如何运行一个基本的人员计数器计算机视觉应用程序
收集您的材料
- UP Squared板
- OpenCV 3.3.0版
- 一个UVC网络摄像头
获取代码
要在Arduino Create* IDE中打开示例,请导航到Examples > FROM LIBRARIES > UP SQUARED GROVE IOT DEV KIT > OpenCV-PeopleCounter。
注意:如果您尚未这样做,请通过Arduino Create连接到您的Intel®平台。有关如何执行此任务的说明,请参阅Arduino Create入门指南。
验证
上传
运行应用程序
注意:在尝试运行应用程序之前,请确保您已插入UVC网络摄像头
将草图成功上传到目标硬件后,将在Ubuntu桌面的Home目录(Arduino Create IDE放置编译代码的位置)中创建一个sketches文件夹。因为草图文件夹受到保护,所以您需要以root用户身份运行该应用程序。
sudo su cd sketches ./OpenCV-PeopleCounter
桌面应该弹出两个窗口(一个用于网络摄像头视频,一个用于显示数值的终端窗口)。当检测到人时,您将在该人周围看到一个绿色的边界框。并且终端显示“人员计数”为一个整数值(每帧人员计数)。
工作原理
代码中人员检测部分使用方向梯度直方图(HOG),这是一种“特征描述符”,用于实现对象检测。特征描述符(一种算法)将来自图像或视频的信息编码为数值。然后,这些值用于区分一个特征与另一个特征(使分类任务更容易)。
在代码示例(.ino文件)中,我们使用HOGDescriptor hog;
初始化HOG对象,然后指示HOG对象使用默认的人员计数器hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
。对于视频捕获中的每一帧,我们使用hog.detectMultiScale
(在int detectAndDraw(const HOGDescriptor &hog, Mat &img)
下方)执行人员(我们的对象)的检测,然后从for(size_t i = 0; i < found.size(); i++ )
开始绘制一个矩形(绿色)框。为了计算矩形的数量(对应于检测到的人员),我们使用int num_people = detectAndDraw(hog, image)
。
因为我们利用了现有的(默认)检测器(在这里,我们实际上没有从头开始构建对象检测器),所以我们没有提供HOG对象的深入解释。大部分工作由OpenCV库完成,这意味着示例代码是高级的(细节从您的视角中抽象出来)。
关于HOG
在这里,“直方图”指的是一个分布(例如,一组相似的事物,如边缘),“方向”指的是方向,“梯度”指的是x, y导数(如微积分,我们在这里寻找斜率)。两种类型的梯度被用作特征:边缘(包括曲线)和强度。曲线和边缘是这类问题(检测物体,如人员)以及通常的HOG滤波器方法的主要思想。而HOG滤波器是一种线性分类器,这意味着它非常擅长根据多维特征(如曲线和边缘)将事物分类到“桶”中。
在opencv.org上阅读更多关于HOG描述符类的信息。