基于opencv的人脸识别

  • FageMo/人脸识别系统 - 码云 - 开源中国
  • ZiXie/IMX6ULLAccessControlSystem - 码云 - 开源中国
  • OpenCV官网帮助文档:OpenCV: OpenCV modules
  • OpenCV3.1.0下载:Releases - OpenCV
  • 百度智能云:百度智能云控制台
  • 百度人脸识别产品介绍:人脸识别_人脸检测_人脸对比_人脸搜索_活体检测_百度智能云
  • SDK下载:SDK下载_文字识别SDK_语音识别SDK-百度AI开放平台
  • 最近学习在linux环境中尝试人脸识别,最重要的也是最麻烦的就是各种库的交叉编译和移植了.在这里不同于其他的人脸识别,他们都是arm开发板把采集的图像数据传给服务器后台,让服务器处理后返还数据,而我是直接在开发板上运行人脸识别算法,不过因为开发板性能孱弱,识别一次要挺久(大概一分半),所以有条件还是要更换一下开发板。
  • 我还是使用百度智能云服务器来进行人脸识别的。
  • 使用opencv库打开图片
  • 编写代码
  •   #include 
      #include 
      using namespace std;
      using namespace cv;
      int main(int argc, char **argv)
      {
       Mat img = imread("/opt/src/images/美女.jpg");
       if (img.empty()) {
       cout << "打开图像失败!" << endl;
       return -1;
       }
       namedWindow("image", CV_WINDOW_AUTOSIZE);
       imshow("image", img);
       waitKey();
       return 0;
      }
    
  • 使能编译器
  •   source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
    
  • opencv(v3.1.0) 头文件用的是交叉编译链Poky自带的(因为是使用交叉编译链进行编译的),路径是 ubuntu 的 /opt 文件夹下(可以去交叉编译链路径下的 sysroot 文件夹下输入find ./ -name libopencv* 查看),在开发板上库文件路径是在 /usr/lib 里面(开发板的 /lib 文件夹也是库文件夹,只不过 opencv 的不在这个文件夹,但是开发板运行可执行文件时也会在 /lib 下查找)。
  • 编译cpp代码
  •   $CXX opencv_test.cpp -o opencv_test -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio -lopencv_imgcodecs
    
  • 这里编译的时候,因为交叉编译链自带的库很多,所以需要指定某些特定的我们使用到的 opencv 库,这些库不需要添加额外的库所在路径,因为这些是交叉编译链自带的。
  • 交叉编译器编译出来的可执行文件 opencv_test,目标平台是ARM,是在开发板上运行的。完成编译之后,拷贝 opencv_test 到开发板文件系统目录
  • 查看开发板文件系统版本(需要2.0以上版本才支持opencv程序直接显示)
  •   cat /etc/version
    
  • 在开发板上运行 opencv_test
  • 在执行 opencv_test 之前,首先我们需要使用 xinit 指令初始化。Xinit 是作用是对 X-Window 系统的初始化程序,主要完成 X 服务器的初始化设置。在高版本的文件系统使用 wayland 的方式。简单的来说要想直接使用 OpenCV 显示在屏幕上,是依赖 X 服务 的,需要开启桌面窗口,然后 OpenCV 程序在桌面窗口里运行。
  • 使用 Xinit 初始化后,X 服务端可以接收鼠标键盘的输入,而 X 客户端(应用程序)通过与 X 服务器通信来获取显示和输入事件,例如当你在终端中运行一个图形化应用程序时,这个应用程序就是一个 X 客户端,它通过 X 服务器来接收输入从而管理图形界面。
  • 开发板出厂默认使用的 Qt 界面是不依赖 X 服务器的。默认出厂系统已经把 X 服务器相关关掉,所以我们需要执行下面的执行进行开启。
  • 先退出出厂系统默认的 Qt 界面,在 QT 界面的设置中退出。
  • 然后,输入
  •   xinit /etc/X11/Xsession >/var/log/Xsession.log 2>&1 &
      ./opencv_test
    
  • 使用opencv+百度智能云服务器进行人脸识别
  • 流程
  • 将开发板图片上传至百度智能云服务器,然后服务器完成识别,将返回信息回传至开发板,但是回传的信息需要处理,并且是通过 https 协议进行网络传输的,那么我们怎么处理服务器回传给我们的信息呢?百度为我们写了一种接口,即SDK。
  • 下载SDK
  • SDK下载:SDK下载_文字识别SDK_语音识别SDK-百度AI开放平台
  • 使用SDK的步骤
  • image.png
  • 安装SDK代码所需要的库
  • SDK也是一群代码,它本身也是需要调用其他库的。
  • 安装依赖库libcurl(需要支持https)、openssl(加密相关)、 jsoncpp(>1.6.2版本,0.x版本将不被支持,提取有用信息)
  •   sudo apt-get install libcurl4-openssl-dev
      sudo apt-get install openssl
      sudo apt-get install libjsoncpp-dev
      
      软件的名字一般是lib???-dev
    
  • 使用命令查看Status是否是install ok installed,是则安装成功。
  •   dpkg -s 软件包名
    
  • 使用apt-get安装的软件的组成文件路径
  • 软件安装包路径:/var/cache/apt/archives
  • 软件安装路径:/usr/share
  • 配置文件安装路径:/etc
  • 可执行文件安装路径:/usr/bin
  • lib文件安装路径:/usr/lib
  • 头文件安装路径:/usr/include
  • 可以使用命令查看这些组成文件所在位置
  •   dpkg -L 软件包名
    
  • apt-get安装到的地方是ubuntu,需要移植到交叉编译链和开发板根目录
  • 安装完成之后,需要将 /usr/lib 中的三种 lib 放到交叉编译器的路径下,即 /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib,同时还需要将 /usr/include 的三种 include 放到交叉编译器的路径下,即 /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include
    • 首先 dpkg -L 软件包名 看下都有哪些文件,然后再复制过去。
  • 报错/usr/lib/x86_64-linux-gnu/libcurl.so: file not recognized: File format not recognized
  • 之前,在ubuntu下载了三种库,并将其中两种的 lib 和 include 放到了交叉编译器下,但是好像无法运行,并出现如上报错。
  • 原因分析:
    • 进入ubuntu的usr/lib文件夹,输入命令查看动态库,动态库不一定是 libcurl.so,还有可能是libcurl.so.4.5.0这种的,所以需要使用如下命令查看实际的动态库。
    • 	  $ls libcurl.* -l 
      
    • image.png
    • 然后再输入命令查看实际动态库的具体信息,可以看到是x86-64架构的,并不是ARM架构的,所以编译器识别不了。
    • 	  file libcurl.so.4.5.0
      
    • image.png
  • 参考自CSDN:.so: file not recognized: file format not recognized-CSDN博客
  • 编译三个库为 ARM 架构
  • 参考:wenzheng/Imx6ULL_QT_Camera - 码云 - 开源中国
  • jsoncpp是在git下载的,安装在camera目录下
  • 项目首页 - jsoncpp - GitCode
  • 然后按照第五讲 项目实战-图像识别项目5-移植百度AI依赖库jsoncpp_哔哩哔哩_bilibili编译成 ARM 平台的 jsoncpp。
  • 其他两个是使用的百度离线识别sdk包自带的,百度离线识别sdk可以cmake,但是无法make,因为交叉编译器中有些库不存在,所以我选择直接使用sdk里面的库,而不使用sdk的程序。
  •   $CXX opencv_test.cpp -o opencv_test -L/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/
        -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio -lopencv_imgcodecs -lopencv_objdetect 
        -L/home/book/Linux/nfs/rootfs/home/root/app_user/Face_reco/face_offline_sdk/lib/armv7hf -lcurl -lcrypto 
        -L/home/book/Linux/camera/jsoncpp-1.9.5/build/lib -I/home/book/Linux/camera/jsoncpp-1.9.5/build/include/ -ljsoncpp 
        -std=c++11
    
  • 在opencv官网下载 opencv3.1.0 包
  • 需要用到 opencv3.1.0 包里面的 /data/haarcascades 里面的人脸实例文件用来检测人脸,比如可以辨别眼睛,笑脸等
  • 将三个库放到开发板的 /lib 文件夹下
  • 只需要拷贝库,不需要拷贝头文件。(好像只需要我们编译 jsoncpp,然后编译可执行文件时将 jsoncpp 的 -L和-I加上,并把库放到开发板下,其他的两个库好像是编译器自带的,然后注意要加上-std=c++11)
  • 插上eth1到路由器,电脑用热点,报错无法解析百度域名
  • 默认路由为eth0,无法连接外网,所以手动添加一条默认网关
  •   route add default gw 192.168.1.1
    
  • 运行 ./opencv_test
  • 注意需要更改分组为 “family”,因为我在百度智能云中创建的分组就是 family。
  •   result = client.search(Base64Face, "BASE64", "family", aip::null);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值