【Ubuntu】基于C++实现人脸识别(15)

face_all;// 存储所有脸的方框列表Mat img_face_shot;// 存储人脸截图vector img_face_jpg; // 存储.jpg格式的人脸截图string img_face_base64;// 存储BASE64格式的人脸截图Json::Value result;// 存储百度云返回的信息time_t sec;// 存储当前系统时间(总秒数)for(;;) {cap >> img_color;// 1.获取一帧彩色图像cvtColor(img_color, img_gray, cv::COLOR_BGR2GRAY);// 2.将彩图转换成灰度图(-lopencv_imgproc)equalizeHist(img_gray, img_eql);// 3.直方图均衡化(-lopencv_imgproc)Classifier.detectMultiScale(img_eql, face_all);// 4.人脸检测if( face_all.size() ) {// 5.框出所有的人脸for(int i=0; i 80 ) {// 输出姓名和时间cout << result["result"]["user_list"][0]["user_id"] << " ";sec = time(NULL);cout << ctime(&sec) << endl; // 将总秒数转换成年月日时分秒输出// 在图像上添加名字、时间putText(img_eql,result["result"]["user_list"][0]["user_id"].asString(),//要添加的内容Point(0,50),// 添加的位置FONT_HERSHEY_SIMPLEX, // 字体1.2,// 字号Scalar(255,255,255)); // 颜色putText(img_eql,ctime(&sec),//要添加的内容Point(0,100),// 添加的位置FONT_HERSHEY_SIMPLEX, // 字体1.2,// 字号Scalar(255,255,255)); // 颜色}}imshow("video", img_eql); // 在“video”窗口中显示图片(编译时加上-lopencv_highgui)waitKey(50);// 等待50ms(20fps)}/显示视频-结束/return 0;}
图6-1 最终实现效果
后记1:优化显示
显然黑白显示太丑,于是下面来优化代码:
图像优化 。将图像变成彩色显示 。方框优化 。将其加粗,并视其为黄色,至于是BGR格式 。显示信息优化 。添加的信息跟随方框显示、调整格式为“年-月-日 时:分:秒”、调整字符(加粗、缩小) 。逻辑优化 。时间调用只出现依次,而不是“向终端写入”和“图像显示信息”这两个过程分别获取一次时间 。
未实现:多人脸识别 。
//终端编译指令/g++ main.cpp -o main -std=c++11 -lopencv_videoio -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_core -lopencv_objdetect -lopencv_imgcodecs -lcurl -lcrypto -ljsoncpp//cpp源代码/#include #include "opencv2/opencv.hpp"#include "face.h"using namespace std;using namespace cv;using namespace aip;// 获取当前的时间,并返回格式为“年-月-日 时:分:秒”的字符串std::string GetTime(void) {time_t sec;// 存储当前系统时间(总秒数)std::string time_info;// 存储完整的时间信息std::string time_display;// 存储提取好的时间信息std::string month;// 存储月份// 下面开始切割字符sec = time(NULL);time_info = ctime(&sec);time_display = time_info.substr(20,4);//年time_display.append("-");//月month = time_info.substr(4,3);if(month == "Jan")time_display.append("01");else if(month == "Feb") time_display.append("02");else if(month == "Mar") time_display.append("03");else if(month == "Apr") time_display.append("04");else if(month == "May") time_display.append("05");else if(month == "Jun") time_display.append("06");else if(month == "Jul") time_display.append("07");else if(month == "Aug") time_display.append("08");else if(month == "Sep") time_display.append("09");else if(month == "Oct") time_display.append("10");else if(month == "Nov") time_display.append("11");else if(month == "Dec") time_display.append("12");else time_display.append("err");time_display.append("-");time_display.append(time_info, 8, 11);//日时分秒return time_display;}int main() {// 打开摄像头//VideoCapture cap(0);VideoCapture cap(0, cv::CAP_V4L2);// 打开(默认的)摄像头0(编译时加上-lopencv_videoio)if(!cap.isOpened()) {// 检查摄像头是否成功打开cout