C++实现人脸识别(百度云平台)

article/2025/10/24 21:35:32

C++实现人脸识别(百度云平台)

项目资源下载

项目思路:opencv 采集人脸照片,将照片发送至百度智能云平台,百度云平台与人脸库中的数据进行比较并返回结果。

一、项目环境

  1. Ubuntu 64 20.0.4

  2. opencv 4.2.0

二、环境配置

1、安装 opencv

sudo apt-get install libopencv-dev

安装需要等待一段时间,有些系统可能要安装依赖,按照提示安装即可。

安装完成后可使用命令

dpkg -s libopencv-dev

查看安装的状态与版本。不同的系统版本有差别,我这里是 opencv4.2.0,具体版本和使用的软件源有关。

安装完成后可先测试。

/*
test.cpp
*/#include<iostream>
#include "opencv4/opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{// 打开默认摄像头0VideoCapture cap = 0;// 如果摄像头开启出现异常,则退出程序if(!cap.isOpened()){cout << "Camera open failed!" << endl;return -1;}cout << "Camera open success!" << endl;// 实例化人脸级联分类器cv::CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml");// 照片容器容器 Mat为 cv 内定义类型Mat ColorFace; // 用于展示,彩色展示效果较好Mat GrayFace;  // 用于查找人脸,灰色查找降低计算量// 人脸列表 Rect类型,为人脸的矩形框坐标vector<Rect> AllFace;// 存储从图片中截取的人脸Mat MatFace;// 存储截图vector<uchar> JpgFace;// 循环采集图片并展示,达到视频效果while(true){// 拍照cap >> ColorFace;// 将彩色照片转为灰度,降低计算量cvtColor(ColorFace, GrayFace,cv::COLOR_BGR2GRAY);// 将灰度照片均衡化,便于从背景中分离人脸equalizeHist(GrayFace, GrayFace);// 从灰度照片中检测人脸,并将检测到的人脸存入人脸列表中Classifier.detectMultiScale(GrayFace, AllFace);// 判断是否检测到人脸,没有人脸则列表为空if(AllFace.size()==0){cout << "no face" << endl;}else{// 框出检测到的人脸,第一个参数为要框出的图片,第二个参数为人脸,最后一个是框的颜色rectangle(ColorFace, AllFace[0], Scalar(255, 255, 0));}// 显示图片,第一个参数为窗口名称,第二个为展示的图片imshow("test", ColorFace);// 等待40ms,相当于25帧(24帧是人眼连贯的最小帧率)waitKey(40);}return 0;
}

执行编译命令

g++ test.cpp -o test

这时我们会发现其报错了,报错如下
在这里插入图片描述

出现这种情况是因为我们的项目中引入了opencv4/opencv2/opencv.hpp这个库,但没有对其进行编译。

解决办法如下:

① 编译时动态链接用到的库

g++ test.cpp -o test -lopencv_highgui

很可惜,我使用这种方法并没有成功,又查阅了很多资料,发现是 .so 文件没能正确链接,也就是环境变量问题,所以有了第二种解决办法。

其次,这第一种方法每次使用新的 opencv 下的函数都需要增加 -l 的动态链接编译,过于繁琐,导致编译命令过于复杂,第二种方法也解决了这个问题。

②环境变量配置
链接: 参考文章

执行如下语句

pkg-config --cflags opencv

返回如下结果

Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

其原因是缺少 opencv.pc文件,我们需要创建这个文件并将其导入环境变量中,具体操作如下:

首先创建 opencv.pc文件,注意目录信息

cd /usr/local/lib
sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc

然后在文件中添加如下内容

sudo nano opencv.pc
prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/libName: opencv
Description: The opencv library
Version:4.0.1
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann  -lopencv_core
~                                               

这里面主要是opencv的配置信息,我们可以看到Libs里有我们会用到的所有链接库。

保存并推出文件编辑:ctrl+ o ctrl + x.

将文件导入环境变量

export  PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

这就配置好 opencv 的环境变量了。

再次执行命令

pkg-config --cflags --libs opencv

返回结果如下,即配置成功

-I/usr/local/include/opencv4 -L/usr/local/lib \
-lopencv_shape -lopencv_stitching -lopencv_objdetect \
-lopencv_superres -lopencv_videostab -lopencv_calib3d \
-lopencv_features2d -lopencv_highgui -lopencv_videoio \
-lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml \
-lopencv_imgproc -lopencv_flann -lopencv_core

返回到项目文件夹,执行如下命令编译

sudo g++ test.cpp -o test `pkg-config --cflags --libs opencv`

执行 ls-l 发现已经生成了可执行文件 test

运行示例:

./test

发现又又又报错啦!!!
在这里插入图片描述
不用担心,这是因为我们的虚拟机没有连接到摄像头导致的,我们只需要按照如下步骤操作即可。
在这里插入图片描述
点开 虚拟机 --> 可移动设备 --> IMC Networks Integrated Camera --> 连接(断开与 主机 的连接) 即可。

再次执行 ./test
在这里插入图片描述

可以看到程序成功运行,在终端按下 ctrl+c 即可结束程序。

2、百度云平台配置

首先要到百度智能云平台创建一个人脸搜索的应用,百度云平台具体的使用方法可以去看百度的教程,非常简单。

①登录百度智能云
链接: 百度智能云平台

②找到人脸识别云服务
在这里插入图片描述

进入之后点击立即使用

③创建应用
在这里插入图片描述
在这里插入图片描述

创建成功后,进入管理应用
在这里插入图片描述

点击查看人脸库,新建用户分组
在这里插入图片描述

新建用户并上传照片即可,注意上传的用户照片要面部轮廓与五官清晰的正面照。

至此,我们在百度智能云上的人脸库就创建成功啦。

3、配置SDK

为了能够应用百度智能云,我们还需要下载相应的SDK配置本地环境。
链接: C++ SDK文档
链接: C++ SDK下载地址

因为我们的项目是在乌班图中运行,所以建议直接在乌班图内下载。

下载完成后解压到我们的项目文件中
在这里插入图片描述

进入项目目录,执行如下命令

cd aip-cpp-sdk-0.8.1
sudo mv * ../

在这里插入图片描述

SDK已经导入项目啦,还需要安装一些依赖包,参考上面的SDK文档。
在这里插入图片描述

以上就是我们需要下载安装的依赖包,执行如下命令

sudo apt-get install libcurl4-openssl-dev
sudo apt-get install openssl
sudo apt-get install libjsoncpp-dev

因为项目引入了这些库,且这些库是C++11标准,所以在编译时要在末尾添加如下链接

-lcurl -lcrypto -ljsoncpp  -std=c++11

全部安装好后,我们的项目环境就配置好啦。

但我们还有一些地方需要更改。

进入之前解压出来的 base 文件夹,打开 http.h,将 23 行的 #include <json/json.h> 更改为#include <jsoncpp/json/json.h>

同样 base.h 的 21 行也应作出相同的更改。

三、编码

下面就是完整的代码,备注详细。

#include<iostream>
#include "opencv4/opencv2/opencv.hpp"
#include "face.h"using namespace std;
using namespace cv;
using namespace aip;int main()
{// Json容器,用于存储云端发送回来的数据Json::Value result;// 打开默认摄像头0VideoCapture cap = 0;// 如果摄像头开启出现异常,则退出程序if(!cap.isOpened()){cout << "Camera open failed!" << endl;return -1;}cout << "Camera open success!" << endl;// 实例化人脸级联分类器cv::CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml");// 照片容器容器 Mat为 cv 内定义类型Mat ColorFace;Mat GrayFace;// 人脸列表 Rect类型,为人脸的矩形框坐标vector<Rect> AllFace;// 存储从图片中截取的人脸Mat MatFace;// 存储截图vector<uchar> JpgFace;// 连接百度智能云std::string app_id = "更换为你的 app_id";std::string api_key = "更换为你的 api_key";std::string secret_key = "更换为你的 secret_key";// 创建人脸识别云服务客户端aip::Face client(app_id, api_key, secret_key);// 因为百度智能云要求发送的人脸为 Base64 格式,所以声明一个 string 类型的容器存储它string Base64Face;// 循环采集图片并展示,达到视频效果while(true){// 拍照cap >> ColorFace;// 将照片转化为灰度格式,降低计算量cvtColor(ColorFace, GrayFace,cv::COLOR_BGR2GRAY);// 将灰度照片均衡化,便于从背景中分离人脸equalizeHist(GrayFace, GrayFace);// 从灰度照片中检测人脸,并将检测到的人脸存入人脸列表中Classifier.detectMultiScale(GrayFace, AllFace);// 判断是否检测到人脸if(AllFace.size()==0){cout << "no face" << endl;}else{// 截取检测到的第一张人脸MatFace = GrayFace(AllFace[0]);// 将截取的无格式人脸转为 .jpg 格式imencode(".jpg", MatFace, JpgFace);// 将图片转为 Base64 格式Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size());// 从人脸库中搜索人脸result = client.search(Base64Face, "BASE64", "test1", aip::null);// 解析返回结果if(!result["result"].isNull()){// 当返回结果也检测到人脸时,将彩色照片中的人脸框起来rectangle(ColorFace, AllFace[0], Scalar(255, 255, 0));// 判断人脸相似度,当相似度大于80%,判定为同一人,输出其编号(人脸库中的编号),否则输出 unknown peopleif(result["result"]["user_list"][0]["score"].asInt() >= 80){cout << "find " << result["result"]["user_list"][0]["user_id"] << endl;}else{cout<< "unkown people" << endl;}}else{cout << "no face" << endl;}}// 展示图片imshow("test", ColorFace);waitKey(40);}return 0;
}

使用如下命令编译

sudo g++ test.cpp -o test `pkg-config --cflags --libs opencv` -lcurl -lcrypto -ljsoncpp  -std=c++11

运行

./test

运行结果
在这里插入图片描述


http://chatgpt.dhexx.cn/article/qq2o5mBV.shtml

相关文章

人脸识别开源库

https://blog.csdn.net/qq_42156420/article/details/83445801 以往的人脸识别主要是包括人脸图像采集、人脸识别预处理、身份确认、身份查找等技术和系统。现在人脸识别已经慢慢延伸到了ADAS中的驾驶员检测、行人跟踪、甚至到了动态物体的跟踪。由此可以看出&#xff0c;人脸…

人脸识别——基于DLib库

目录 1.人脸识别的流程 2.ResNet-34算法概述 3.测试准备 4.测试代码 5.测试结果 1.人脸识别的流程 dlib库提供高精度人脸识别算法是基于深度学习网络ResNet-34实现&#xff0c;该网络基于三百万张照片进行训练&#xff0c;最终获得了人脸检测模型。 模型下载地址&#xff…

深度学习系列18:开源人脸识别库

这年头&#xff0c;能有个开源的人脸库真是感天谢地了&#xff0c;而且可以在arm机器上使用&#xff0c;真不容易。git地址见https://github.com/ageitgey/face_recognition 1. 人脸检测 人脸检测可以选hog和cnn两种。默认用hog&#xff08;在cpu上用cnn真的很慢&#xff09;…

人脸识别库的安装

确保你的python为3.6 !!! 1.安装cmake pip install cmake2.安装boost pip install boost3.安装dlib 选择19.8.1 pip install dlib19.8.14.安装face-recognition pip install face-recognition

应用一个基于Python的开源人脸识别库,face_recognition

转载请注明出处&#xff1a;http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/ 文章链接&#xff1a;http://blog.csdn.net/hongbin_xu/article/details/74981819 或http://hongbin96.com/125 今天看微信时&#xff0c;看到一篇推送文章介绍了一个基于python的开源人…

开源人脸识别库,face_recognition

转载请注明出处&#xff1a;http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/ 文章链接&#xff1a;http://blog.csdn.net/hongbin_xu/article/details/74981819 或http://hongbin96.com/125 今天看微信时&#xff0c;看到一篇推送文章介绍了一个基于python的开源人…

[深度学习] Python人脸识别库Deepface使用教程

deepface是一个Python轻量级人脸识别和人脸属性分析&#xff08;年龄、性别、情感和种族&#xff09;框架&#xff0c;提供非常简单的接口就可以实现各种人脸识别算法的应用。deepface官方仓库为deepface。deepface提供了多种模型&#xff0c;模型下载地址为deepface_models。 …

[深度学习] Python人脸识别库face_recognition使用教程

Python人脸识别库face_recognition使用教程 face_recognition号称是世界上最简单的开源人脸识别库&#xff0c;可以通过Python或命令行识别和操作人脸。face_recognition提供了十分完整的技术文档和应用实例&#xff0c;人脸识别初学者建议研究该库上手。face_recognition的官…

Face Recognition 库-人脸识别

1. Face Recognition 库简介&#xff1a; 中文文档&#xff1a; [face_recognition/README_Simplified_Chinese.md] Face Recognition 库主要封装了dlib这一 C 图形库&#xff0c;通过 Python 语言将它封装为一个非常简单就可以实现人脸识别的 API 库&#xff0c;屏蔽了人脸识…

应用层下的人脸识别(二):人脸库

本文为系列文章的第二篇&#xff0c;介绍人脸库的相关内容。人脸库是人脸识别的基础&#xff0c;建立人脸库往往是人脸项目的首要任务&#xff0c;全文围绕着什么是人脸库及如何建立人脸库展开讨论。 1. 什么是人脸库 简单来讲&#xff0c;人脸库就是人脸数据的储存管理中心&a…

全国高校计算机能力挑战赛Java试题(一)

消除字符串 这个题目上来就是运用一个回文的一个思想&#xff0c;我目前算法也是入门阶段&#xff0c;所以也处于学习阶段。 public class xiaozfc {public static void main(String[] args) {Scanner sc new Scanner(System.in);String txt sc.next();ArrayList<String&…

Java课程设计--学生成绩管理系统

一、团队名称&#xff1a; 团队成员&#xff1a; 刘江华 2019122249819 19信管专升本杨利杰 2018122241648 18信管本张富强 2018122241658 18信管本 二、需求分析 1.数据存储在数据库和文件中 分为“教师”模块和“学生”模块。 2.学生模块提供登陆功能&#xff0c;登陆成功后…

Java8--20道关于Stream流的题目练习

正题开始 Student 类 具有属性&#xff1a; 不及格次数failCount&#xff0c; 名字name&#xff0c; 科任老师chineseTeacher&#xff0c; 班主任classTeacher题目1&#xff1a;筛选学生不及格次数3次及3次以上的学生列表 List<String> arrayList array.stream().filte…

第十三届蓝桥杯省赛 JAVA B组(真题解析+个人体会)(已更新完G题)

试题 A: 星期计算【填空题】 题目&#xff1a; 答案&#xff1a;7 解析&#xff1a; 此题直接对7求余即可。 public class Main {public static void main(String[] args) {System.out.println(Math.pow(20, 22) % 7 6);} } 贴一个BigInteger的代码 import java.math.Bi…

java的一些课程设计题目_Java课程设计

Java课程设计 1. 题目及要求 基于学校的搜索引擎 负责部分:Java GUI设计 2.界面调查 1)调查界面:百度 2)思考: 根据我的调查,我认为我需要完成三个界面的设计: 第一个是调查主界面,里面有一个集美大学的logo,一个搜索框用文本字段,因为需要在里面写入搜索内容,一个搜索…

计算机二级--java篇

计算机二级 全国计算机等级&#xff08;NCRE&#xff09;&#xff0c;计算机二级分为语言程序设计&#xff08;包括C、C、Java、Visual Basic&#xff09;、数据库程序设计&#xff08;包括Visual FoxPro、Access&#xff09;、MS Office高级应用&#xff0c;各项目均为机考。考…

java 课程设计题目_Java课程设计题目有哪些?Java课程设计题目汇总

在学习Java的路上,多多练习项目实践是很有必要的。因此,本文整理了20道Java课程设计题目,希望大家总结、回顾和实践学过的所有面向对象的编程思想以及编程方法。 1、编写一个记事本程序 要求:用图形用户界面实现。 能实现编辑、保存、另存为、查找替换等功能。 提示:使用文…

Java绘制圆形

package 坦克大战.draw;import javax.swing.*; import java.awt.*;/*** Auther:* Date: 2022/4/16 - 04 - 16 - 21:16* Description: 坦克大战.draw* version: 1.0*/ public class draw extends JFrame{//继承JFrame、JFrame对应窗口&#xff0c;可以当作一个画框//定义一个画板…

Java练习题(经典8题)

题目一 共有50枚硬币&#xff0c;可能包括4种类型&#xff1a;1元&#xff0c;5角&#xff0c;1角&#xff0c;5分。已知总价值为20元。求各种硬币的数量。 解题思路&#xff1a;简单分析可知硬币有多种组合&#xff0c;我们可以假设先抛开50枚硬币去寻找1元需要多少个硬币&…

Java中常见的30道例题(附代码)

目录 第一题&#xff1a;判断数组中奇数偶数的个数并求和 第二题&#xff1a;判断三个数中的最大值 第三题&#xff1a;剔除某些数据并打印输出 第四题&#xff1a;输入0到7判断星期几 第五题&#xff1a;将一个数组倒序输出 第六题&#xff1a;输入一个数判断是否是素数 …