当前位置:   article > 正文

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

c++人脸识别

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

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

安装完成后可使用命令

  1. dpkg -s libopencv-dev
  2. 1

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

安装完成后可先测试。

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

执行编译命令

g++ test.cpp -o test

这时我们会发现其报错了,报错如下

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

解决办法如下:

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

g++ test.cpp -o test -lopencv_highgui

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

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

②环境变量配置

链接: 参考文章

执行如下语句

pkg-config --cflags opencv

返回如下结果

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

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

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

  1. cd /usr/local/lib
  2. sudo mkdir pkgconfig
  3. cd pkgconfig
  4. sudo touch opencv.pc

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

sudo nano opencv.pc
  1. prefix=/usr/local
  2. exec_prefix=${prefix}
  3. includedir=${prefix}/include
  4. libdir=${exec_prefix}/lib
  5. Name: opencv
  6. Description: The opencv library
  7. Version:4.0.1
  8. Cflags: -I${includedir}/opencv4
  9. 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
  10. ~

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

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

将文件导入环境变量

export  PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

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

再次执行命令

pkg-config --cflags --libs opencv

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

  1. -I/usr/local/include/opencv4 -L/usr/local/lib \
  2. -lopencv_shape -lopencv_stitching -lopencv_objdetect \
  3. -lopencv_superres -lopencv_videostab -lopencv_calib3d \
  4. -lopencv_features2d -lopencv_highgui -lopencv_videoio \
  5. -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml \
  6. -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下载地址

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

下载完成后解压到我们的项目文件中

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

  1. cd aip-cpp-sdk-0.8.1
  2. sudomv * ../

SDK已经导入项目啦,还需要安装一些依赖包,参考上面的SDK文档。

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

  1. sudoapt-getinstall libcurl4-openssl-dev
  2. sudoapt-getinstall openssl
  3. sudoapt-getinstall 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 行也应作出相同的更改。

三、编码

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

  1. #include<iostream>
  2. #include "opencv4/opencv2/opencv.hpp"
  3. #include "face.h"
  4. using namespace std;
  5. using namespace cv;
  6. using namespace aip;
  7. int main()
  8. {
  9. // Json容器,用于存储云端发送回来的数据
  10. Json::Value result;
  11. // 打开默认摄像头0
  12. VideoCapture cap = 0;
  13. // 如果摄像头开启出现异常,则退出程序
  14. if(!cap.isOpened())
  15. {
  16. cout << "Camera open failed!" << endl;
  17. return -1;
  18. }
  19. cout << "Camera open success!" << endl;
  20. // 实例化人脸级联分类器
  21. cv::CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml");
  22. // 照片容器容器 Mat为 cv 内定义类型
  23. Mat ColorFace;
  24. Mat GrayFace;
  25. // 人脸列表 Rect类型,为人脸的矩形框坐标
  26. vector<Rect> AllFace;
  27. // 存储从图片中截取的人脸
  28. Mat MatFace;
  29. // 存储截图
  30. vector<uchar> JpgFace;
  31. // 连接百度智能云
  32. std::string app_id = "更换为你的 app_id";
  33. std::string api_key = "更换为你的 api_key";
  34. std::string secret_key = "更换为你的 secret_key";
  35. // 创建人脸识别云服务客户端
  36. aip::Face client(app_id, api_key, secret_key);
  37. // 因为百度智能云要求发送的人脸为 Base64 格式,所以声明一个 string 类型的容器存储它
  38. string Base64Face;
  39. // 循环采集图片并展示,达到视频效果
  40. while(true)
  41. {
  42. // 拍照
  43. cap >> ColorFace;
  44. // 将照片转化为灰度格式,降低计算量
  45. cvtColor(ColorFace, GrayFace,cv::COLOR_BGR2GRAY);
  46. // 将灰度照片均衡化,便于从背景中分离人脸
  47. equalizeHist(GrayFace, GrayFace);
  48. // 从灰度照片中检测人脸,并将检测到的人脸存入人脸列表中
  49. Classifier.detectMultiScale(GrayFace, AllFace);
  50. // 判断是否检测到人脸
  51. if(AllFace.size()==0){
  52. cout << "no face" << endl;
  53. }else{
  54. // 截取检测到的第一张人脸
  55. MatFace = GrayFace(AllFace[0]);
  56. // 将截取的无格式人脸转为 .jpg 格式
  57. imencode(".jpg", MatFace, JpgFace);
  58. // 将图片转为 Base64 格式
  59. Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size());
  60. // 从人脸库中搜索人脸
  61. result = client.search(Base64Face, "BASE64", "test1", aip::null);
  62. // 解析返回结果
  63. if(!result["result"].isNull()){
  64. // 当返回结果也检测到人脸时,将彩色照片中的人脸框起来
  65. rectangle(ColorFace, AllFace[0], Scalar(255, 255, 0));
  66. // 判断人脸相似度,当相似度大于80%,判定为同一人,输出其编号(人脸库中的编号),否则输出 unknown people
  67. if(result["result"]["user_list"][0]["score"].asInt() >= 80){
  68. cout << "find " << result["result"]["user_list"][0]["user_id"] << endl;
  69. }else{
  70. cout<< "unkown people" << endl;
  71. }
  72. }else{
  73. cout << "no face" << endl;
  74. }
  75. }
  76. // 展示图片
  77. imshow("test", ColorFace);
  78. waitKey(40);
  79. }
  80. return 0;
  81. }

使用如下命令编译

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

运行

./test

原文链接:https://blog.csdn.net/X_xs_mxt/article/details/127710672#comments_25689722

感谢作者准可转发哈
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/324817
推荐阅读
相关标签
  

闽ICP备14008679号