本文旨在叙述我基于OpenCV和百度智能云的人脸识别考勤项目, 根据此系列, 应该可以复现出完整的项目。
该项目是在Ubuntu 16.04系统下使用OpenCV技术进行开发的,如果想要成功复现,最好保证系统环境一致,本人尝试了Ubuntu 20.04版本,但是会出现一系列错误,故使用16.04版本的Ubuntu。该系统的下载安装在此不多赘述,请读者自行安装。
目录
一、项目原理介绍
- 图像采集:使用代码来调用摄像头,进行图像的采集
- 人脸检测:使用OpenCV集成的文件,在采集到的图像中进行人脸的识别
- 上传数据:将脸部数据上传到百度智能云进行比对
- 收集结果:收集百度智能云比对的人脸结果,将人脸信息输入到图像上
项目最后的结果如下:
二、提前准备
1. OpenCV库文件的安装
首先,我们需要安装OpenCV库,在命令行里面敲入
sudo apt-get install libopencv-dev
安装好这个文件后,我们使用如下命令来查看安装的版本
dpkg -s libopencv-dev
可以看到,我安装的版本是2.4.9
接下来,在OpenCV的官网上找到对应版本的官方文档,之后我们的开发都将基于该文档
2. 虚拟机的配置
由于虚拟机需要调用电脑的摄像头,因此需要配置好
首先在VMware的虚拟机设置里面将USB适配改为大于3.0的标准
接下来,将电脑摄像头连接到虚拟机上,如图:
选择自己电脑型号的摄像头,并连接,连接成功后,在Ubuntu的终端中依次输入:
cd /dev
ls
如果看到video0则说明摄像头连接成功
三、调用摄像头读取视频
1. 调用摄像头
我们进入官方文档中highgui部分,再选择videocapture部分,那里有我们想要的文档说明
下面这个图详细说明了VideoCapture类是如何使用的。我们复制官方代码,再加上C++的头文件等基本信息,形成我们的main.cpp,代码如下:
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
{
cout<<"Camera open failed!"<<endl;
return -1;
}
cout<<"Camera open successfully!"<<endl;
return 0;
}
这段代码由于调用摄像头,当然,只是输出是否成功,并没有显示视频。接下来编译运行:
g++ main.cpp -o main -lopencv_highgui
//因为调用了OpenCV第三方库的highgui,所以编译时要加以链接
//之后新加了别的库文件的话,还需要使用-l**** 来加以链接
返回结果为"Camera open successfully!"
2. 显示视频
还是那个参考文档里面。因为要显示视频,我们需要循环将摄像头采集到的图片展示出来。在OpenCV中有个类Mat,可以用来存储图像数据,所以我们使用Mat声明一个对象img,来储存采集到的图像数据,代码如下:
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
{
cout<<"Camera open failed!"<<endl;
return -1;
}
cout<<"Camera open successfully!"<<endl;
Mat img;
for(;;)
{
cap >> img; // get a new img from camera
imshow("video", img); //在video窗口中展示图片
waitKey(40); //设置帧率(40ms读取一帧)
}
return 0;
}
值得注意的是,原编译命令会报错,显示我们没有添加libopencv_core,这是因为Mat类是在core中的(大家可以在官方文档的core里面找到Mat类),所以此时的编译命令为:
g++ main.cpp -o main -lopencv_highgui -lopencv_core
此时编译通过,之后./main执行代码, 就可以显示出摄像头读取的视频了
第一部分先写这么多吧...