基于OpenCV的人脸识别考勤系统(三)
目錄
六、百度智能云人臉庫的創建
七、人臉識別SDK的導入
八、百度云平臺的接入
六、百度智能云人臉庫的創建
在百度智能云的人臉識別控制臺中,申請領取免費資源,在進一步頁面中我們選擇領取全部免費接口即可
?接下來在左側公有云服務的應用列表中,創建應用,注意,需要將應用歸屬選擇為個人。3
?創建完成后即可看到創建情況:
接下來在可視化人臉庫中新建組,上傳待識別的照片即可。
七、人臉識別SDK的導入
我們可以使用百度提供的SDK完成人臉信息的上傳和比對信息的接收。SDK的下載地址為SDK下載_文字識別SDK_語音識別SDK-百度AI開放平臺 (baidu.com), 我們選擇人臉識別中的C HTTP SDK進行下載,點擊使用說明即可進入該SDK的說明文檔。
?根據SDK的官方文檔說明,有五個步驟來使用該SDK:
如果編譯報錯base/http.h:23:23: fatal error: json/json.h: 沒有這個文件或文件夾,那我們將base文件夾中的http.h文件第23行的#include <json/json.h>改為#include <jsoncpp/json/json.h>
同理,編譯報錯base/base.h:21:23: fatal error: json/json.h: 沒有這個文件或文件夾時,我們將base.h21行中的#include <json/json.h>改為#include <jsoncpp/json/json.h>
編譯報錯base.utils.h:21:25:fatal error:openssl/evp.h:沒有這個文件或文件夾時,需要安裝一個新的庫文件
sudo apt-get install lib-ssl-dev八、百度云平臺的接入
在之前說的SDK官方文檔中,我們按照說明進行。
使用剛剛你創建應用時提供的ID,Key和Serect
接下來使用SDK文檔中人臉搜索的client.search方法
?該函數的參數為:
因此,我們需要先定義一個std::string類型的image和image_type,之前的圖片格式是jpg的,所以需要進行一下轉換,變成base64格式的
std::string base64Img; json::value result;base64Img = base64_encode((char *)jpgBuf.data(), jpgBuf().size()); //格式轉換為base64result = client.search(base64Img, "BASE64", "Student", aip::null); //這里的"Student"是你之前新建的人臉分組的名稱?上述代碼段的前兩行需要放在for循環前面,后兩行放在for循環內部的imencode函數后即可
接下來編譯,會報錯找不到函數search,這是因為我們下載的SDK中沒有search方法,我們使用下面的代碼替換“face.h”中的代碼即可。現在即可正常編譯運行。
/*** Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved** Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with* the License. You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the* specific language governing permissions and limitations under the License.** @author baidu aip*/#ifndef __AIP_FACE_H__ #define __AIP_FACE_H__#include "base/base.h"namespace aip {class Face: public AipBase{public:std::string _faceverify ="https://aip.baidubce.com/rest/2.0/face/v4/faceverify";std::string _detect ="https://aip.baidubce.com/rest/2.0/face/v2/detect";std::string _match ="https://aip.baidubce.com/rest/2.0/face/v2/match";std::string _identify ="https://aip.baidubce.com/rest/2.0/face/v2/identify";std::string _verify ="https://aip.baidubce.com/rest/2.0/face/v2/verify";std::string _user_add ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/add";std::string _user_update ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/update";std::string _user_delete ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/delete";std::string _user_get ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/get";std::string _group_getlist ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/getlist";std::string _group_getusers ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/getusers";std::string _group_adduser ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/adduser";std::string _group_deleteuser ="https://aip.baidubce.com/rest/2.0/face/v2/faceset/group/deleteuser";std::string _face_verify_v4 ="https://aip.baidubce.com/rest/2.0/face/v4/mingjing/verify";std::string _face_match_v4 ="https://aip.baidubce.com/rest/2.0/face/v4/mingjing/match";std::string _online_picture_live_v4 = "https://aip.baidubce.com/rest/2.0/face/v4/faceverify";std::string _face_search = "https://aip.baidubce.com/rest/2.0/face/v3/search";//"https://aip.baidubce.com/rest/2.0/face/capture/search";//Face(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk){}std::string vector_join_base64(const std::vector<std::string> & v_images) {std::string images;size_t count = v_images.size();for (size_t i = 0; i < count;i++){std::string image = v_images[i];images += base64_encode(image.c_str(), (int) image.size());if (i != count) {images += ",";}}return images;}/*** detect* @param image 圖像文件二進制內容,可以使用aip::get_file_content函數獲取* options 可選參數:* max_face_num 最多處理人臉數目,默認值1* face_fields 包括age,beauty,expression,faceshape,gender,glasses,landmark,race,qualities信息,逗號分隔,默認只返回人臉框、概率和旋轉角度*/Json::Value detect(std::string const & image,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["image"] = base64_encode(image.c_str(), (int) image.size());std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_detect, null, data, null);return result;}/*** match* @param images vector多圖圖像文件二進制內容,vector中每一項可以使用aip::get_file_content函數獲取* options 可選參數:* ext_fields 返回質量信息,取值固定:目前支持qualities(質量檢測)。(對所有圖片都會做改處理)* image_liveness 返回的活體信息,“faceliveness,faceliveness” 表示對比對的兩張圖片都做活體檢測;“,faceliveness” 表示對第一張圖片不做活體檢測、第二張圖做活體檢測;“faceliveness,” 表示對第一張圖片做活體檢測、第二張圖不做活體檢測;<br>**注:需要用于判斷活體的圖片,圖片中的人臉像素面積需要不小于100px\*100px,人臉長寬與圖片長寬比例,不小于1/3*** types 請求對比的兩張圖片的類型,示例:“7,13”<br>**12**表示帶水印證件照:一般為帶水印的小圖,如公安網小圖<br>**7**表示生活照:通常為手機、相機拍攝的人像圖片、或從網絡獲取的人像圖片等<br>**13**表示證件照片:如拍攝的身份證、工卡、護照、學生證等證件圖片,**注**:需要確保人臉部分不可太小,通常為100px\*100px*/Json::Value match(const std::vector<std::string> & images,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["images"] = vector_join_base64(images);std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_match, null, data, null);return result;}/*** identify* @param group_id 用戶組id(由數字、字母、下劃線組成),長度限制128B,多個用戶組id,用逗號分隔* @param image 圖像文件二進制內容,可以使用aip::get_file_content函數獲取* options 可選參數:* ext_fields 特殊返回信息,多個用逗號分隔,取值固定: 目前支持faceliveness(活體檢測)。**注:需要用于判斷活體的圖片,圖片中的人臉像素面積需要不小于100px\*100px,人臉長寬與圖片長寬比例,不小于1/3*** user_top_num 返回用戶top數,默認為1,最多返回5個*/Json::Value identify(std::string const & group_id,std::string const & image,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["group_id"] = group_id;data["image"] = base64_encode(image.c_str(), (int) image.size());std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_identify, null, data, null);return result;}/*** verify* @param uid 用戶id(由數字、字母、下劃線組成),長度限制128B* @param image 圖像文件二進制內容,可以使用aip::get_file_content函數獲取* @param group_id 用戶組id(由數字、字母、下劃線組成),長度限制128B,多個用戶組id,用逗號分隔* options 可選參數:* top_num 返回用戶top數,默認為1* ext_fields 特殊返回信息,多個用逗號分隔,取值固定: 目前支持faceliveness(活體檢測)。**注:需要用于判斷活體的圖片,圖片中的人臉像素面積需要不小于100px\*100px,人臉長寬與圖片長寬比例,不小于1/3***/Json::Value verify(std::string const & uid,std::string const & image,std::string const & group_id,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["uid"] = uid;data["image"] = base64_encode(image.c_str(), (int) image.size());data["group_id"] = group_id;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_verify, null, data, null);return result;}/*** user_add* @param uid 用戶id(由數字、字母、下劃線組成),長度限制128B* @param user_info 用戶資料,長度限制256B* @param group_id 用戶組id,標識一組用戶(由數字、字母、下劃線組成),長度限制128B。如果需要將一個uid注冊到多個group下,group\_id需要用多個逗號分隔,每個group_id長度限制為48個英文字符。**注:group無需單獨創建,注冊用戶時則會自動創建group。**<br>**產品建議**:根據您的業務需求,可以將需要注冊的用戶,按照業務劃分,分配到不同的group下,例如按照會員手機尾號作為groupid,用于刷臉支付、會員計費消費等,這樣可以盡可能控制每個group下的用戶數與人臉數,提升檢索的準確率* @param image 圖像文件二進制內容,可以使用aip::get_file_content函數獲取* options 可選參數:* action_type 參數包含append、replace。**如果為“replace”,則每次注冊時進行替換replace(新增或更新)操作,默認為append操作**。例如:uid在庫中已經存在時,對此uid重復注冊時,新注冊的圖片默認會**追加**到該uid下,如果手動選擇`action_type:replace`,則會用新圖替換庫中該uid下所有圖片。*/Json::Value user_add(std::string const & uid,std::string const & user_info,std::string const & group_id,std::string const & image,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["uid"] = uid;data["user_info"] = user_info;data["group_id"] = group_id;data["image"] = base64_encode(image.c_str(), (int) image.size());std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_user_add, null, data, null);return result;}/*** user_update* @param uid 用戶id(由數字、字母、下劃線組成),長度限制128B* @param image 圖像文件二進制內容,可以使用aip::get_file_content函數獲取* @param user_info 用戶資料,長度限制256B* @param group_id 更新指定groupid下uid對應的信息* options 可選參數:* action_type 目前僅支持replace,uid不存在時,不報錯,會自動變為注冊操作;未選擇該參數時,如果uid不存在會提示錯誤*/Json::Value user_update(std::string const & uid,std::string const & image,std::string const & user_info,std::string const & group_id,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["uid"] = uid;data["image"] = base64_encode(image.c_str(), (int) image.size());data["user_info"] = user_info;data["group_id"] = group_id;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_user_update, null, data, null);return result;}/*** user_delete* @param uid 用戶id(由數字、字母、下劃線組成),長度限制128B* @param group_id 刪除指定groupid下uid對應的信息* options 可選參數:*/Json::Value user_delete(std::string const & uid,std::string const & group_id,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["uid"] = uid;data["group_id"] = group_id;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_user_delete, null, data, null);return result;}/*** user_get* @param uid 用戶id(由數字、字母、下劃線組成),長度限制128B* options 可選參數:* group_id 選擇指定group_id則只查找group列表下的uid內容,如果不指定則查找所有group下對應uid的信息*/Json::Value user_get(std::string const & uid,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["uid"] = uid;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_user_get, null, data, null);return result;}/*** group_getlist* options 可選參數:* start 默認值0,起始序號* end 返回數量,默認值100,最大值1000*/Json::Value group_getlist(const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_group_getlist, null, data, null);return result;}/*** group_getusers* @param group_id 用戶組id(由數字、字母、下劃線組成),長度限制128B* options 可選參數:* start 默認值0,起始序號* end 返回數量,默認值100,最大值1000*/Json::Value group_getusers(std::string const & group_id,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["group_id"] = group_id;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_group_getusers, null, data, null);return result;}/*** group_adduser* @param group_id 用戶組id(由數字、字母、下劃線組成),長度限制128B,多個用戶組id,用逗號分隔* @param uid 用戶id(由數字、字母、下劃線組成),長度限制128B* @param src_group_id 從指定group里復制信息* options 可選參數:*/Json::Value group_adduser(std::string const & group_id,std::string const & uid,std::string const & src_group_id,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["group_id"] = group_id;data["uid"] = uid;data["src_group_id"] = src_group_id;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_group_adduser, null, data, null);return result;}/*** group_deleteuser* @param group_id 用戶組id(由數字、字母、下劃線組成),長度限制128B,多個用戶組id,用逗號分隔* @param uid 用戶id(由數字、字母、下劃線組成),長度限制128B* options 可選參數:*/Json::Value group_deleteuser(std::string const & group_id,std::string const & uid,const std::map<std::string, std::string> & options){std::map<std::string, std::string> data;data["group_id"] = group_id;data["uid"] = uid;std::copy(options.begin(), options.end(), std::inserter(data, data.end()));Json::Value result =this->request(_group_deleteuser, null, data, null);return result;}/*** 人臉 - 人臉實名認證V4* 基于姓名和身份證號,調取公安權威數據源人臉圖,將當前獲取的人臉圖片,與此公安數據源人臉圖進行對比,得出比對分數,并基于此進行業務判斷是否為同一人* @param idCardNumber 身份證件號* @param name 姓名(需要是 utf8 編碼)* @param image 圖片信息(數據大小應小于10M 分辨率應小于1920*1080),5.2版本SDK請求時已包含在加密數據data中,無需額外傳入* options 可選參數:* quality_control 質量控制參數*/Json::Value faceMingJingVerify(const std::string& idCardNumber,const std::string& name,std::string* image,std::map<std::string, std::string> options){std::string access_token = this->getAccessToken();Json::Value data;data["id_card_number"] = idCardNumber;data["name"] = name;if (image != nullptr) {data["image"] = *image;}std::map< std::string,std::string >::iterator it ;for(it = options.begin(); it != options.end(); it++){data[it->first] = it->second;}std::string mid = "?access_token=";std::string url = _face_verify_v4 + mid + access_token;Json::Value result =this->request_com(url, data);return result;}/*** 人臉 - 人臉對比V4* 用于比對多張圖片中的人臉相似度并返回兩兩比對的得分,可用于判斷兩張臉是否是同一人的可能性大小* @param image 圖片信息(數據大小應小于10M 分辨率應小于1920*1080),5.2版本SDK請求時已包含在加密數據data中,無需額外傳入* @param imageType 圖片類型* @param registerImage 圖片信息(總數據大小應小于10M),圖片上傳方式根據image_type來判斷。本圖片特指客戶服務器上傳圖片,非加密圖片Base64值* @param registerImageType 圖片類型* options 可選參數*/Json::Value faceMingJingMatch(std::string * image,std::string * imageType,const std::string& registerImage,const std::string& registerImageType,std::map<std::string, std::string> options){std::string access_token = this->getAccessToken();Json::Value data;if (image != nullptr) {data["image"] = *image;}if (imageType != nullptr) {data["image_type"] = *imageType;}data["register_image"] = registerImage;data["register_image_type"] = registerImageType;std::map< std::string,std::string >::iterator it ;for(it = options.begin(); it != options.end(); it++){data[it->first] = it->second;}std::string mid = "?access_token=";std::string url = _face_match_v4 + mid + access_token;Json::Value result =this->request_com(url, data);return result;}/*** 人臉 - 在線圖片活體V4* 基于單張圖片,判斷圖片中的人臉是否為二次翻拍* @param sdkVersion sdk版本* options 可選參數*/Json::Value onlinePictureLiveV4(const std::string& sdkVersion,std::vector<std::string>& imageList,std::map<std::string, std::string> options){std::string access_token = this->getAccessToken();Json::Value data;data["sdk_version"] = sdkVersion;Json::Value imageListJson;for (std::string image : imageList) {imageListJson.append(image);}data["image_list"] = imageListJson;std::map< std::string,std::string >::iterator it ;for(it = options.begin(); it != options.end(); it++){data[it->first] = it->second;}std::string mid = "?access_token=";std::string url = _online_picture_live_v4 + mid + access_token;Json::Value result =this->request_com(url, data);return result;}Json::Value search(std::string const & image,std::string const & imageType,std::string const & group_id,const std::map<std::string, std::string> & options){std::string access_token = this->getAccessToken();Json::Value data;data["image"] = image;data["image_type"] = imageType;data["group_id_list"] = group_id;std::string mid = "?access_token=";std::string url = _face_search + mid + access_token;Json::Value result =this->request_com(url, data);return result;}}; } #endif到該部分截止,完整代碼為:
#include <iostream> #include "opencv2/opencv.hpp" #include "face.h"using namespace std; using namespace cv; using namespace aip;int main() {VideoCapture cap(0); // open the default cameraif(!cap.isOpened()) // check if we succeeded{cout<<"Camera open failed!"<<endl;return -1;}cout<<"Camera open successfully!"<<endl;// 設置APPID/AK/SKstd::string app_id = "你的app id";std::string api_key = "你的api key";std::string secret_key = "你的secret key";aip::Face client(app_id, api_key, secret_key);Mat img;Mat grayImg;Mat equalizeImg;vector<Rect> faces;Mat faceImg;vector<uchar> jpgBuf;std::string base64Img;Json::Value result;CascadeClassifier classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");for(;;){cap >> img; // get a new img from cameracvtColor(img, grayImg, CV_BGR2GRAY); //灰度處理equalizeHist(grayImg,equalizeImg); //均衡化處理classifier.detectMultiScale(equalizeImg, faces); //檢測人臉并返回在facas中if(faces.size()){rectangle(equalizeImg, faces[0], Scalar(255,255,255)); //繪制矩形框faceImg = equalizeImg(faces[0]); imencode(".jpg", faceImg, jpgBuf); //將圖片編碼為jpg格式后存到jpgBuf中base64Img = base64_encode((char *)jpgBuf.data(), jpgBuf.size()); //格式轉換為base64 result = client.search(base64Img, "BASE64", "Student", aip::null); //這里的"Student"是你之前新建的人臉分組的名稱}elsecout<<"No face detected!"<<endl;imshow("video", equalizeImg); //在video窗口中展示圖片 waitKey(40); //設置幀率(40ms讀取一幀)}return 0; }總結
以上是生活随笔為你收集整理的基于OpenCV的人脸识别考勤系统(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信开发小程序云开发云存储中文件下载地址
- 下一篇: JAVA毕业设计酒店管理系统设计与实现计