先展示下效果:
这是源图片
测试结果:
结果还是很不错的
代码中写入的是相似度达到80+才会识别。易烊千玺的相似度在70左右。
源图片需要存到云端:
源代码
#include <iostream>
#include "face.h"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
using namespace aip;
int main(int argc, char const *argv[])
{
cout << "hello" << endl;
VideoCapture cap(0);//打开相机
if (cap.isOpened())//判断相机是否打开
{
cout << "打开相机成功" << endl;
}
else
{
cout << "打开相机失败" << endl;
return -1;
}
aip::Face client("36872208","IWEjuvLEucWzbsGq19yLDkbR","uBjRcpGAuf05BTnnVDOIKDd7EVqjLHsb");
Mat ColorImage;//存放彩色照片
Mat GrayImage;//存放黑白照片
Mat MatFace;//存放识别的人脸
vector<Rect>AllFace;//存放人脸图像
vector<uchar>JpgFace;//存放编码为Jpg格式的人脸图像数据
CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");
Json::Value result;
string Base64Face;
while (1)//循环截图
{
cap >> ColorImage;
cvtColor(ColorImage,GrayImage,CV_BGR2GRAY);//将照片转换为黑白照片
equalizeHist(GrayImage,GrayImage);//色彩均衡处理
Classifier.detectMultiScale(GrayImage,AllFace);
if(AllFace.size())//判断是否检测到人脸
{
rectangle(GrayImage,AllFace[0],Scalar(255,255,255));//在图像中框出人脸
MatFace=GrayImage(AllFace[0]);//从GrayImage中截取人脸
imencode(".jpg",MatFace,JpgFace);//转换照片格式
Base64Face=base64_encode((char*)JpgFace.data(),JpgFace.size());
result=client.search(Base64Face,"BASE64","123",aip::null);
if(!result["result"].isNull())
{
//相似度超过70时才会输出信息
if (result["result"]["user_list"][0]["score"].asInt() > 80)
{
cout<< result["result"]["user_list"][0]["user_id"]<<endl;
goto lable;
}
cout<<"没有匹配到人员"<<endl;
}
//else
//{
//cout<<result["result"]["user_list"][0]["user_id"]<<endl;
//}
}
lable:
imshow("video", GrayImage); //展示图片
waitKey(10); //停止40毫秒
}
return 0;
}