admin管理员组

文章数量:1794759

AI应用第一课:C语言支付宝刷脸登录

AI应用第一课:C语言支付宝刷脸登录

  • 项目应用场景
  • VIP学员小林入职的第一个项目:

    支付宝刷脸支付:

     

  • 项目演示
  • 演示奇牛支付刷脸登录。

    环境搭建

    直接领取开发模板,直接开发。上完课后,再按照以下步骤自己搭建。

  • 配置人脸识别SDK开发环境
  • 注意,配置环境前,先把VS的平台调整为64位系统(也可以使用32位,但是人脸识别的SDK也要改位32位版本的)

    补充:

    商业开发,人脸识别相关的项目,千万不要自己开发人脸识别

    应该选择合适的人脸识别SDK

    选择人脸识别SDK: 百度,腾讯,阿里,虹软

    所有的商业SDK,都有两个版本:(研发版本【免费的】,发行版【付费的】)

    比如: UE4

    下载虹软SDK(64位)

    配置头文件目录和库文件目录

    在项目目录下,创建face目录,再把人脸识别SDK的头文件和库文件复制到项目目录下的face目录下

    头文件

     

    库文件

     

    配置SDK的头文件目录

    配置SDK的库文件目录

    配置附加依赖项

    libarcsoft_face_engine.lib

    复制DLL库文件到可执行文件目录

    导入Rock自定义的接口文件

  • 配置opencv开发环境
  • opencv是图像处理,应用最广的免费的开源框架

    已经有人研发了,使用opencv配合激光炮打蚊子的系统(秒变军用,斩首行动)

    opencv使用C/C++开发(其中有500个常用接口使用C语言,其他使用C++),跨平台

    Qt是跨平台的应用框架

    opencv是跨平台的图像处理框架

    Qt + opencv

    安装opencv

    头文件包含目录:

    D:\\opencv\\build\\include

    D:\\opencv\\build\\include\\opencv

    D:\\opencv\\build\\include\\opencv2

    库文件包含目录:

    D:\\opencv\\build\\x64\\vc12\\lib

    使用的库(附加依赖性)

    (以下是最常用的库文件,还有很多其他的库文件)

    opencv_core249d.lib

    opencv_highgui249d.lib

    opencv_imgproc249d.lib

    动态库 opencv_core249d.dll

    opencv_highgui249d.dll

    opencv_imgproc249d.dll

  • 导入第3方类
  • CVvImage

    补充:高薪就业最常见的面试问题:

    你使用过哪些第三方框架?使用过哪些第三方的类、文件、库、工具?

    比如:网络开发,libevent Qt开发中的表格图像处理:xxx

    导入Rock 私有工具库

  • 项目实现
  • 设计系统界面
  • 始于颜值,新手开发,从软件界面开始。

    IT开发常识

    界面的设计,由美工说了算!美工的设计由产品经理说了算,产品经理的决策,由甲方爸爸说了算!

    美工出图:(同时提供素材)

    程序员实现:

    一个图片控件,两个按钮控件。

    一分钟搞定。

    拖放控件

     

    一个图片控件,2个按钮控件

    此时的界面,颜值丑陋,欲爱不能,不堪使用!

    界面修饰

    把欢迎界面的素材图片,加载到项目资源中。

  • 拷贝素材图片到项目目录的res子目录
  • 把图片添加到项目资源中
  • 配置图片控件
  •    类型,改为:Bitmap

       图像,设置为:IDB_BITMAP1

  • 调整界面布局
  •    问题:界面调不动了!

       技巧:因为图片控件的图片太大了,导致对话窗口不能操作

             把图片控件的类型,再设置为frame,然后再把窗口拖放到更大,再把图片的类型调回到Bitmap

             最后再把窗口缩小到合适程度。

  • 修改按钮的文字
  •    分别设置为“注册”、“登录”

    设计效果:

  • HBITMAP pic = (HBITMAP)LoadImage(NULL, L"mm1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    m_img.SetBitmap(pic);

    HBITMAP pic = (HBITMAP)LoadImage(NULL, L"mm2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    m_img.SetBitmap(pic);

    测试效果。

  • 使用摄像头
  • 要使用刷脸认证,必须使用摄像头。

    原理:

    使用定时器,定时的捕获摄像头的图像数据,把捕获的图像帧,显示到图片控件即可。

  • 添加工具库
  • tools.h  tools.cpp  CvvImage.h  CvvImage.cpp

    (tools.h 、tools.cpp是Rock写的,专门用于摄像头处理的函数,可作为自己的私有工具使用)

    把这两个文件复制到项目目录下,并添加到项目中。

  • 定时摄像头变量
  • #include <opencv2/opencv.hpp>

    using namespace cv;

    // 定义一个摄像头变量

    VideoCapture cap;

    在注册按钮的事件处理程序中,打开摄像头,并创建定时器

    // 1. 打开摄像头

    cap.open(0); //打开默认的摄像头

    // 2. 创建定时器

    SetTimer(

    1,      //定时器的编号

    100, //每隔100ms提醒一次

    NULL);  //时间到了之后,执行哪个函数,NULL表示执行默认的定时处理函数

  • 为对话框创建定时消
  •   先选择对话框,然后在对话框的属性窗口中的“消”选项卡,添加“VM_TIMER”消

  • 在定时处理函数中,实现定时捕获
  • #include "tools.h"

    void COpenCVTmpDlg::OnTimer(UINT_PTR nIDEvent)

    {

    // TODO: 在此添加消处理程序代码和/或调用默认值

    if (nIDEvent == 1) {

    // 把摄像头cap捕获的图像帧,放到当前窗口m_hWnd的IDC_STATIC_IMG控件中显示

    refreshCamera(&cap, m_hWnd, IDC_STATIC_IMG);

    }

    CDialogEx::OnTimer(nIDEvent);

    }

  • 实现注册
  • 方法:使用摄像头倒计时拍照,然后保存照片即可。

    #include <mmsystem.h>

    #pragma comment(lib, "winmm.lib")

    void COpenCVTmpDlg::OnTimer(UINT_PTR nIDEvent)

    {

    // TODO: 在此添加消处理程序代码和/或调用默认值

    static int count1 = 0;

    if (nIDEvent == 1) {

    // 把摄像头cap捕获的图像帧,放到当前窗口m_hWnd的IDC_STATIC_IMG控件中显示

    refreshCamera(&cap, m_hWnd, IDC_STATIC_IMG);

    count1++;

    if (count1 == 1) {

    mciSendString(_T("play res/zhuche.mp3"), 0, 0, 0); // 播放3秒倒计时的功能

    } else if (count1 == 30) {

    pAIZhao(&cap, "Rock.jpg");

    count1 = 0;

    KillTimer(1); //关闭定时器

    cap.release(); // 关闭摄像头

    MessageBox(_T("注册成功!"));

    // 把画面切换到最开始的欢迎画面

    HBITMAP hbitmap = (HBITMAP)LoadImage(NULL, "res/start.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    m_img.SetBitmap(hbitmap);

    }

    }

    CDialogEx::OnTimer(nIDEvent);

    }

  • 人脸识别
  • 人脸识别分析:

    直接像素对比不合适,不能使用连连看辅助的方式。

    解决方案:

    使用人脸识别SDK

  • 刷脸
  •    和登录的方式类似.

      

    void COpenCVTmpDlg::OnBnClickedButtonLogin()

    {

    // TODO: 在此添加控件通知处理程序代码

    //HBITMAP pic = (HBITMAP)LoadImage(NULL, "mm2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    //m_img.SetBitmap(pic);

    cap.open(0);

    SetTimer(2, 100, NULL);

    }

    void COpenCVTmpDlg::OnTimer(UINT_PTR nIDEvent)

    {

    // TODO: 在此添加消处理程序代码和/或调用默认值

    static int count1 = 0;

    if (nIDEvent == 1) {

    ......

    } else if (nIDEvent == 2) {

    refreshCamera(&cap, m_hWnd, IDC_STATIC_IMG);

    }

    CDialogEx::OnTimer(nIDEvent);

    }

     

  • 定义人脸识别接口
  • 导入人脸识别工具库faceTool.h  faceTool.cpp 到项目中。
  • 添加头文件
  • #include "faceTool.h"

  • 定义人脸识别模块变量
  • // 人脸识别的模块变量

    MHandle handle;

  • 对模块变量进行初始化
  • 在对话框窗口的初始化函数中,添加:faceInit(&handle);

  • 定义人脸识别的接口faceCheck
  • BOOL faceCheck(const char* name1, const char* name2) {

    // 读取两个照片

    // 数据类型的大小写是敏感的!

    IplImage* img1 = cvLoadImage(name1);

    IplImage* img2 = cvLoadImage(name2);

    if (!img1 || !img2) {

    return false; //FALSE

    }

    float ret = faceCompare(handle, img1, img2);

    // return ret >= 0.95

    if (ret < 0.95) {

    return false;

    }

    else {

    return true;

  • 实现人脸识别登录
  • 方法:

    第1秒结束时,自动拍照、并进行人脸识别,

    第2秒结束时,根据上一秒的识别结果刷新界面

    代码实现

    void COpenCVTmpDlg::OnTimer(UINT_PTR nIDEvent)

    {

    // TODO: 在此添加消处理程序代码和/或调用默认值

    static int count1 = 0;

    static int count2 = 0;

    static bool success = false; //表示识别结果是否成功

    if (nIDEvent == 1) {

        ......

    }

    else if (nIDEvent == 2) {

    refreshCamera(&cap, m_hWnd, IDC_STATIC_IMG);

    count2++;

    if (count2 == 10) {

    paiZhao(&cap, "Rock2.jpg");  //拍照

    // 人脸识别

    if (faceCheck("Rock.jpg", "Rock2.jpg")) {

    success = true;

    // 播放一个登录成功的声音,持续1S

    mciSendString("play res/login.mp3", 0, 0, 0);

    }

    } else if (count2 == 20) {

    count2 = 0;

    KillTimer(2);

    cap.release();

    const char* fileName = success ? "res/bgInit.bmp" : "res/bgError.bmp";

    HBITMAP hbitmap = (HBITMAP)LoadImage(NULL, fileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    m_img.SetBitmap(hbitmap);

    success = false;

    }

    }

    CDialogEx::OnTimer(nIDEvent);

    }

  • 项目完善
  • 活体检测
  • 张张嘴,向左摇头,向右摇头,点点头, 眨眨眼(金融相关的!)

  • 多用户账户登录
  • 使用数据库

    VIP课程第3卷

    已就业学员在研发工作中,90%以上要使用数据库。

  • 跨平台
  • 使用Qt移植到其他手机平台

    VIP课程第5卷,快速高薪就业的保证。

  • 项目小结
  • 项目开发就是,从需求入门,逐步完善的过程。
  • 技术大佬,也都是从零基础开始,逐步升级,逐步变强的过程
  • 小翔-大二开始迷茫,刚开始学习时,只求能找到工作就足够了,后面入职百度服务器开发,年薪30W
  • Marin, 32岁开始学习,最开始只求能够快速转行,6个月后入职C++音视频服务器开发,月薪15K,4个月后,月薪18K
  • 佳佳,大三实习,只求不要到学校指定的工厂实习,现在已经入职C++开发一年多了

  • 今天的分享就到这里了,大家要好好学C语言/C++哟~ 对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!C语言C++编程学习交流圈子,QQ群:763855696【点击进入】C语言从入门到精通(C语言入门C语言教程C语言零基础C语言基础C语言学习C 整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程) 欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!                编程学习视频分享:

    本文标签: 支付宝一课语言AI