前几天实验室考核要用到seetaface2,给的参考资料是GitHub上官方文档,是用c++写的,但自己只有c语言基础看官方给的代码有点吃力,在网上找了好久都没发现好的参考资料。
然后只能自己摸索,经过几天的尝试后,终于看懂了官方文档,后来有看了看官方的c++头文件,原来用到的函数,在头文件里都有说明和参数介绍,说的还比较清楚。

这里附上github地址: https://github.com/seetaface/SeetaFaceEngine2/blob/master/example/C++/README.md

后来写程序就比较容易了,所以把代码贴在这里,给要找seetaface2代码的同学一点参考吧。

(linux环境下,配合opencv使用)

1,一对一人脸识别

#include <iostream>#include <opencv2/core.hpp> //使用自己编译的opencv头文件
#include <opencv/highgui.h>
#include <opencv2/opencv.hpp>#include <seeta/FaceDetector2.h>
#include <seeta/Struct_cv.h>
#include <seeta/PointDetector2.h>
#include <seeta/FaceRecognizer.h>using namespace std;
using namespace cv;int main(int argc, char **argv)
{seeta::FaceDetector2 FD("bindata/SeetaFaceDetector2.0.ats");seeta::PointDetector2 PD("bindata/SeetaPointDetector2.0.pts5.ats");seeta::FaceRecognizer2 FR("bindata/SeetaFaceRecognizer2.0.ats");float similar = 0;Mat mat1 = imread("image/2.jpg");seeta::cv::ImageData image1 = mat1;SeetaRect *face1 = FD.Detect(image1);SeetaPointF points1[5];PD.DetectEx(image1, *face1, points1);Mat mat2 = imread("image/1.jpg");seeta::cv::ImageData image2 = mat2;SeetaRect *face2 = FD.Detect(image2);SeetaPointF points2[5];PD.DetectEx(image2, *face2, points2);//判断相似性similar = FR.Compare(image1, points1, image2, points2);if (similar <= 0.65)   //以0.65为判断分界cout <<"  没有检测到人脸!" << endl;else{cout <<"  检测到对应人脸!" << endl;cout << "Similarity: " << similar << endl;//画矩形Rect rect = {face2->x, face2->y, face2->width, face2->height};rectangle(mat2,rect,Scalar(0,255,0),2.3,1,0);//在图片上保存矩形框imwrite("./image/save_pic_1.jpg", mat2);}imshow("image:", mat2);  //展示图片cvWaitKey(0);return 0;}

效果图如下,识别率还是挺准的。

2,一对N 人脸识别

#include <iostream>#include <opencv2/core.hpp> //使用自己编译的opencv头文件
#include <opencv/highgui.h>
#include <opencv2/opencv.hpp>#include <seeta/FaceDetector2.h>
#include <seeta/Struct_cv.h>
#include <seeta/PointDetector2.h>
#include <seeta/FaceRecognizer.h>using namespace std;
using namespace cv;int register_image(seeta::FaceDetector2 &FD, seeta::PointDetector2 &PD, seeta::FaceRecognizer2 &FR, const std::string &filename);int main(int argc, char **argv)
{seeta::FaceDetector2 FD("bindata/SeetaFaceDetector2.0.ats");seeta::PointDetector2 PD("bindata/SeetaPointDetector2.0.pts5.ats");seeta::FaceRecognizer2 FR("bindata/SeetaFaceRecognizer2.0.ats");float similar = 0;float Similarity = 0;int num;register_image(FD, PD, FR, "image/1.jpg"); //向数据库注册一张人脸Mat mat = imread("image/h_1.jpg");seeta::cv::ImageData image = mat;SeetaRect *face = FD.Detect(image, &num);while (num > 0) //判断相似性,并画矩形框{SeetaPointF *points = PD.Detect(image, *face);FR.Recognize(image, points, &similar);if (similar > 0.65) //以0.65为判断分界{cout << "  检测到所需人脸。" << endl;cout << "Similarity: " << similar << "\n"<< endl;  //打印相似度Similarity = similar;//画矩形Rect rect = {face->x, face->y, face->width, face->height};rectangle(mat, rect, Scalar(0, 255, 0), 2.3, 1, 0);//在图片上保存矩形框imwrite("./image/save_pic_h1.jpg", mat);}++ face;    num --; }if (Similarity == 0)cout << " 这张合照中没有要检测的人脸!请换一张来检测\n" << endl;imshow("image:", mat);waitKey(0);return 0;
}int register_image(seeta::FaceDetector2 & FD, seeta::PointDetector2 & PD, seeta::FaceRecognizer2 & FR, const std::string &filename)
{cv::Mat mat = cv::imread(filename);if (mat.empty())return -1;seeta::cv::ImageData image = mat;SeetaRect *face = FD.Detect(image);if (!face)return -1;SeetaPointF *points = PD.Detect(image, *face);if (!points)return -1;if (points)return FR.Register(image, points); // Reture -1 if failed.
}

识别效果图如下

3,N 对 N 人脸识别,为了与现实中人脸和名字相照应,所以采用向数据库注册人脸时,每注册一张,就显示出对应的人脸,然后用户输入相应的名字。最后讲名字打印在要识别的人脸旁边,做到注册的和识别的脸对应同一个名字。

/********1对N人脸识别,需要事先知道用于注册的照片中有几张脸*********/#include <iostream>
#include <opencv2/core.hpp> //使用自己编译的opencv头文件
#include <opencv/highgui.h>
#include <opencv2/opencv.hpp>#include <seeta/FaceDetector2.h>
#include <seeta/Struct_cv.h>
#include <seeta/PointDetector2.h>
#include <seeta/FaceRecognizer.h>using namespace std;
using namespace cv;int register_image(seeta::FaceDetector2 &FD, seeta::PointDetector2 &PD, seeta::FaceRecognizer2 &FR, const std::string &filename, string name[]);int main(int argc, char **argv)
{seeta::FaceDetector2 FD("bindata/SeetaFaceDetector2.0.ats");seeta::PointDetector2 PD("bindata/SeetaPointDetector2.0.pts5.ats");seeta::FaceRecognizer2 FR("bindata/SeetaFaceRecognizer2.0.ats");int num;int index;float similar = 0;string text;string name[6];int Index = register_image(FD, PD, FR, "image/H_1.jpg", name);cout << "图库中检测到" << Index + 1 << "张脸.\n" << endl;Mat mat = imread("image/H_2.jpg");seeta::cv::ImageData image = mat;SeetaRect *face = FD.Detect(image, &num);for (int i = 0; i < num; ++i, ++face) //判断相似性,并画矩形框{SeetaPointF *points = PD.Detect(image, *face);if (points)index = FR.Recognize(image, points, &similar);if (similar >= 0.65)   //以0.65为检测边界{Rect rect = {face->x, face->y, face->width, face->height};  //画矩形rectangle(mat, rect, Scalar(0, 255, 0), 2.3, 1, 0);text = name[index];   //打印名字putText(mat, text, Point(face->x - 5, face->y + 2), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 255, 255), 1, 8, 0);}       }imshow("image", mat);imwrite("./image/save_pic_H1.jpg", mat);waitKey(0);return 0;
}// 向database中注册图片中的每一张人脸
int register_image(seeta::FaceDetector2 &FD, seeta::PointDetector2 &PD, seeta::FaceRecognizer2 &FR, const std::string &filename, string name[])
{int num;int index;string text;Mat mat = imread(filename);if (mat.empty())return -1;seeta::cv::ImageData image = mat;SeetaRect *face = FD.Detect(image, &num);if (!face)return -1;for (int i = 0; i < num; ++i, ++face){SeetaPointF *points = PD.Detect(image, *face);if (!points)return -1;else if (points)index = FR.Register(image, points); // Reture -1 if failed.Rect rect = {face->x, face->y, face->width, face->height};  //每注册一张人脸,就显示出来。rectangle(mat,rect, Scalar(0,255,0),2.3,1,0);imshow("database", mat);moveWindow("database", 0, 0);waitKey(1000);cin >> name[i];putText(mat, name[i], Point(face->x - 5, face->y + 2), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 255, 255), 1, 8, 0);cvDestroyWindow("database");}imshow("database", mat);return index;
}

效果图如下

要是只要求注册的脸和识别的脸名字对应,而不要求它们也和现实中的名字对应,只需要稍微改动一下代码即可。

seetaface2有好有意思、好玩的地方,我也才刚入门,欢迎大佬带我多玩哈。

(最后,本文所用图片如有人认为侵犯肖像权的,欢迎指出,我及时改正。)

seetaface2人脸识别相关推荐

  1. 重磅|中科视拓开源SeetaFace2人脸识别算法

    今天,来自中科院计算所的人工智能国家队中科视拓宣布,开源商用级SeetaFace2人脸识别算法. SeetaFace2采用商业友好的BSD协议,这是在2016年9月开源SeetaFace1.0人脸识别 ...

  2. C/C++人脸识别引擎 SeetaFace2打造“刷脸时代”

    SeetaFace2 人脸识别引擎包括了搭建一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块 FaceDetector.面部关键点定位模块 FaceLandmarker 以及人脸特征提取与比 ...

  3. 如何安装并使用SeetaFace 开源人脸识别代码【中科院计算机所山世光老师团队研发】

    最近因为导师接到了一个关于人脸识别的开发项目,需要我们去寻找一些开源的可以二次开发的人脸识别程序.(说白了就是想白嫖,直接调用人家的接口不香吗,可是那得花钱),这时候就在看到网友推荐的SeetaFac ...

  4. 人脸识别SeetaFace2原理与代码详解

    人脸识别SeetaFace2原理与代码详解 前言 一.人脸识别步骤 二.SeetaFace2基本介绍 三.seetaFace2人脸注册.识别代码详解 3.1 人脸注册 3.1.1 人脸检测 3.1.2 ...

  5. 「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程

    笔者的最新私人博客网站经过一段时间的努力,已经初期建设完毕,csdn上的博文会逐渐转移过去-- 欢迎访问呀- |=传=送=门=> 多多洛的博客 2016年,中科院山世光老师开源了其研发的seet ...

  6. SeetaFace2.0:中科视拓开源跨平台C++商业人脸识别库

    SeetaFace2.0:中科视拓开源跨平台C++商业人脸识别库 SeetaFace2.0 的人脸识别库,来自中科院计算所的中科视拓团队商业开源,它完全使用 C++编写,支持 Windows.Linu ...

  7. 离线人脸识别SeetaFace2

    SeetaFace2Demo 离线人脸识别升级版SeetaFace2 GitHub地址:https://github.com/shuguoli68/LiSeetaFace2 效果截图 人脸检测识别 2 ...

  8. 人脸识别--SeetaFace2介绍

    SeetaFace2是中科视拓在2019年发布的开源人脸识别引擎,使用c++编写,支持windows.linux系统,支持arm.x86平台,功能包含人脸检测.关键点定位.人脸识别,相比于2016开源 ...

  9. Android离线人脸识别方案对比

    Android 离线人脸识别方案对比总结 文章目录 Android 离线人脸识别方案对比总结 百度.腾讯.阿里.Face++.商汤等人脸识别 虹软人脸识别 OpenCV 人脸识别 中科视拓(Seeta ...

最新文章

  1. vue中props的双向绑定
  2. Linux 下用来查询安装包信息的RPM选项
  3. 机器学习实战(MachineLearinginAction) 第三章 决策树
  4. asp.net分割字符串的几种方法
  5. 滑动验证码研究-后续
  6. dns代表计算机哪个术语,windows dns 术语解释
  7. 简明python教程:数据结构
  8. visualstudio 2017 工具栏隐藏解决办法
  9. Overfeat论文笔记
  10. 信息系统项目管理师必背知识点(完整版)
  11. 【自动驾驶】浅谈自动驾驶在业界的发展
  12. 怎么用photoshop抠图,得到透明图片,填充颜色,得到一个程序透明图标
  13. SaltStack之return与job管理
  14. linux环境启动tomcat成功后,访问链接一直在转圈
  15. Autojs-QQ每日定时给女票/男票/闺蜜/基友发送一句话
  16. Pyhton零基础投喂(综合练习:1.论⽂数据统计)
  17. 渗透测试之突破口——web服务突破
  18. Java 代码 各种不规范示范,希望引以为戒,望看到的大哥们 都能把代码写的规范点,方便你我他。
  19. 电视盒子显示ntp服务器异常,ntp服务器连接异常咋办
  20. 三明梅列:社区服务走进“微时代”

热门文章

  1. Python:实现factorial阶乘算法(附完整源码)
  2. 简单病毒脚本的原理分析
  3. 使用vant组件实现轮播和预览
  4. Elementui自定义Pagination 上一页下一页使用按钮
  5. mysql idata有什么用_IDataParameter有什么用,哪方面才用到
  6. 记录一下复现CLAM
  7. 老婆,我把悍马给你挣下来,下辈子找我要钥匙!
  8. 小白学JAVA之十七——集合类库
  9. 无线网络怎么连接绝地球生服务器,手机无线网络连接方法 手机Wifi无线网络设置的操作步骤组图...
  10. 高速公路超速处罚 (15分)