由于注册功能不可避免地要使用到摄像头,这就需要我们引入OpenCV(open source computer vision library),这是一个基于BSD许可(开源)发行的跨平台计算机视觉库,它轻量级而且高效,由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。
首先进入https://opencv.org/releases/ 网站下载opencv的安装包,解压安装好后,将安装路径配置到环境变量中,然后将opencv_world440.dll opencv_world440d.dll opencv_videoio_ffmpeg440_64.dll三个动态链接库到C:\Windows\System32 路径下,最后配置opencv 目录及链接器。
这样我们就部署好了opencv,可以使用库里面的各种功能。
1.处理背景图片切换的定时器
if (nIDEvent == 1) {
m_snowBG.SetBitmap(m_snows[snowIndex]);
snowIndex = (snowIndex + 1) % 16;
}//- nIDEvent == 1 时,定时器每次触发会切换背景图片。
//- m_snowBG.SetBitmap(m_snows[snowIndex]):设置背景图片为 m_snows 数组中的当前图片。
//- snowIndex = (snowIndex + 1) % 16:更新图片索引,使其在 0 到 15 之间循环。
2. 处理摄像头拍照和显示的定时器
else if(nIDEvent == 2){
//使用摄像头拍摄头像并进行显示
refreshCamera(&cap, m_hWnd, IDC_PHOTO_REAL);
count++;
if (count == 1) {
mciSendString(L"play res/zhuce.mp3", 0, 0, 0);
}
else if (count == 30) {
paiZhao(&cap, "tmp.jpg");
count = 0;
KillTimer(2);//关闭定时器
cap.release();//关闭摄像头
IplImage* img1 = cvLoadImage("tmp.jpg");
IplImage* img2 = cvLoadImage("res/neijun.jpg");
float xiShu = faceCompare(faceModel, img1, img2);
int yanZhi = xiShu * 1000 + 80 + rand() % 15;
if (yanZhi <= 0) {
yanZhi = 60;
}
else if (yanZhi >= 100) {
yanZhi = 99;
}
//生成职业
const char* jobs[] = { "精神科主任","精神科副主任","精神科实习生" };
//工作-用户名-颜值.jpg
CString editName;
m_name.GetWindowText(editName);
USES_CONVERSION;
char* editName2 = T2A(editName);
char cmd[521];
sprintf_s(cmd, sizeof(cmd), "move tmp.jpg users\\%s-%s-%d.jpg",
jobs[rand() % 3], editName2, yanZhi);
system(cmd);
WinWelcome win;
win.DoModal();
CDialogEx::OnOK();//nIDEvent == 2 时,定时器每次触发会从摄像头捕捉图像并显示。
//refreshCamera(&cap, mhWnd, IDC_PHOTO_REAL)`:刷新摄像头图像并显示在窗口中。
//count++:增加计数器
//if (count == 1):第一次计时器触发时播放音频文件 zhuce.mp3。
//else if (count == 30):第 30 次计时器触发时进行拍照和后续处理:
//paiZhao(&cap, "tmp.jpg")`:拍照并保存为 `tmp.jpg`。
//count = 0`:重置计数器。
//KillTimer(2)`:关闭定时器。
//cap.release()`:关闭摄像头。
//加载图像并进行人脸比较。
//根据比较结果生成“颜值”并计算最终结果。
//根据生成的颜值和用户输入的用户名创建文件名,并将 `tmp.jpg` 移动到 `users` 目录下。
//打开一个新窗口 WinWelcome 并关闭当前对话框。