OpenCV+DNN人脸识别
v4l2进行视频采集
打开设备,设置视频参数,分辨率,样式
1 | v4l2_fd = ::open(dev,O_RDWR); //打开设备 |
申请缓冲区,查询缓冲区是否符合要求
1 | struct v4l2_requestbuffers req; //申请缓冲区 |
内存映射,将缓冲区放入工作队列,等待用户采集
1 | v4l2_buffer_length = buf.length; //内存映射 |
获取一帧视频
从缓冲区取出视频数据
1 | struct v4l2_buffer buf; //从缓冲区取出视频数据 |
MJPEG解码,将MJPEG格式的图片转为QIMAG格式
1 | // MJPEG解码 |
缓冲区重新入队
1 | if (ioctl(v4l2_fd, VIDIOC_QBUF, &buf) < 0) { //缓冲区重新入队 |
持续获取多帧视频,并且对视频进行一些预处理,
1、缩小视频的分辨率进行加速
2、彩色转变灰度图
3、检测60*60以上像素的人脸
4、再映射回原图
5、将人脸用矩形框框住
6、缩放显示到一个Qlabel标签上
1 | static int detect_counter = 0; |
采集人脸
1、采集最大的一张人脸
2、裁剪缩放?
3、RGB转BGR
4、提取并保存特征
1 | if (faces.empty()) { |
获取人脸特征
1、缩放到像素112*112
2、对人脸进行归一化
3、生成blob
4、输入后前向推理
5、再L2归一化
1 | cv::Mat Widget::getFaceFeature(const cv::Mat& faceImg) { |
对比采集的人脸和检测到的人脸
1、检查是否已经采集三次人脸
2、取最大的人脸裁剪缩放
3、RGB转BGR
4、提取特征,计算余弦相似度
5、设定阈值0.5,大于阈值认定同一人
1 | if (collectCount < collectTarget) { |