admin管理员组文章数量:1794759
AI应用第一课:C语言支付宝刷脸登录
VIP学员小林入职的第一个项目:
支付宝刷脸支付:
演示奇牛支付刷脸登录。
环境搭建
直接领取开发模板,直接开发。上完课后,再按照以下步骤自己搭建。
注意,配置环境前,先把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使用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
CVvImage
补充:高薪就业最常见的面试问题:
你使用过哪些第三方框架?使用过哪些第三方的类、文件、库、工具?
比如:网络开发,libevent Qt开发中的表格图像处理:xxx
导入Rock 私有工具库始于颜值,新手开发,从软件界面开始。
IT开发常识
界面的设计,由美工说了算!美工的设计由产品经理说了算,产品经理的决策,由甲方爸爸说了算!
美工出图:(同时提供素材)
程序员实现:
一个图片控件,两个按钮控件。
一分钟搞定。
拖放控件
一个图片控件,2个按钮控件
此时的界面,颜值丑陋,欲爱不能,不堪使用!
界面修饰把欢迎界面的素材图片,加载到项目资源中。
类型,改为: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); } |
#include "faceTool.h" |
// 人脸识别的模块变量 MHandle handle; |
在对话框窗口的初始化函数中,添加:faceInit(&handle);
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卷,快速高薪就业的保证。
今天的分享就到这里了,大家要好好学C语言/C++哟~ 对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!C语言C++编程学习交流圈子,QQ群:763855696【点击进入】C语言从入门到精通(C语言入门C语言教程C语言零基础C语言基础C语言学习C 整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程) 欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦! 编程学习视频分享:
版权声明:本文标题:AI应用第一课:C语言支付宝刷脸登录 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686887273a114519.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论