本篇测评由电子工程世界的优秀测评者“流行科技”提供。 此次测试的开源项目,是基于QT+OpenCV的人脸识别打卡项目。本次体验使用的是开源的代码,此代码本来是运行在WIN下的,为了测试稍微进行了修改,让其运行在米尔iMX8M Plus开发板上。 测试项目实际是分了两个工程,一个工程是作为管理员控制功能使用,添加人脸信息。同时也可以查询到打卡记录,对从机进行下发通知等等。 人脸识别我们主要需要用到opencv的人脸检测分类器。 OpenCV编译完成后已经提供好了的。 因为这里还需要涉及到训练模型,有了模型后才能更好地识别,所以还是简单介绍下怎么训练的吧。 CascadeClassifier cascada; //将opencv官方训练好的人脸识别分类器拷贝到自己的工程目录中 cascada.load("F:videoccchaarcascade_frontalface_alt2.xml"); VideoCapture cap(1); //0表示电脑自带的,如果用一个外接摄像头,将0变成1 Mat frame, myFace; int pic_num = 1; while (1) { //摄像头读图像 frame; vector faces;//vector容器存检测到的faces Mat frame_gray; cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转灰度化,减少运算 cascada.detectMultiScale(frame_gray, faces, 1.1, 4, CV_HAAR_DO_ROUGH_SEARCH, Size(70, 70), Size(1000, 1000)); printf("检测到人脸个数:%dn", faces.size()); //识别到的脸用矩形圈出 for (int i = 0; i < faces.size(); i++) { rectangle(frame, faces, Scalar(255, 0, 0), 2, 8, 0); } //当只有一个人脸时,开始拍照 if (faces.size() == 1) { Mat faceROI = frame_gray(faces );//在灰度图中将圈出的脸所在区域裁剪出 //cout << faces .x << endl;//测试下face .x resize(faceROI, myFace, Size(92, 112));//将兴趣域size为92*112 putText(frame, to_string(pic_num), faces .tl(), 3, 1.2, (0, 0, 225), 2, 0);//在 faces .tl()的左上角上面写序号 string filename = format("F:video%d.jpg", pic_num); //图片的存放位置,frmat的用法跟QString差不多 imwrite(filename, myFace);//存在当前目录下 imshow(filename, myFace);//显示下size后的脸 waitKey(500);//等待500us destroyWindow(filename);//:销毁指定的窗口 pic_num++;//序号加1 if (pic_num == 11) { return 0;//当序号为11时退出循环,一共拍10张照片 } } int c = waitKey(10); if ((char)c == 27) { break; } //10us内输入esc则退出循环 imshow("frame", frame);//显示视频流 waitKey(100);//等待100us } return 0; 通过上面的代码,完成图像采集。 //读取你的CSV文件路径. //string fn_csv = string(argv ); string fn_csv = "F:videocccat.txt"; // 2个容器来存放图像数据和对应的标签 vector images; vector labels; // 读取数据. 如果文件不合法就会出错 // 输入的文件名已经有了. try { read_csv(fn_csv, images, labels); //从csv文件中批量读取训练数据 } catch (cv::Exception& e) { cerr << "Error opening file "" << fn_csv << "". Reason: " << e.msg << endl; // 文件有问题,我们啥也做不了了,退出了 exit(1); } // 如果没有读取到足够图片,也退出. if (images.size() <= 1) { string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!"; CV_Error(CV_StsError, error_message); } for (int i = 0; i < images.size(); i++) { //cout<