Compliant APIs for Windows and Linux C++ usage.
Download Windows SDK. Download Linux SDK. View API.
#include <seeta/FaceDetector2.h>
seeta::FaceDetector2 FD("bindata/SeetaFaceDetector2.0.ats");
#include <seeta/Struct_cv.h>
cv::Mat mat = cv::imread("1.jpg");
seeta::cv::ImageData image = mat;
int num; // save the number of detected faces
SeetaRect *face = FD.Detect(image, &num);
for (int i = 0; i < num; ++i, ++face)
{
std::cout << "Face(" << i << "): " << "(" << face->x << ", " << face->y << ", " << face->width << ", " << face->height << ")" << std::endl;
}
#include <seeta/PointDetector2.h>
seeta::PointDetector2 PD("bindata/SeetaPointDetector2.0.pts5.ats");
// assume that face is the returned value of `FD.Detect`
SeetaPointF *points = PD.Detect(image, *face);
if (points)
{
std::cout << "Points: [" << std::endl;
for (int j = 0; j < PD.LandmarkNum(); ++j)
{
std::cout << "(" << points[j].x << ", " << points[j].y << ")," << std::endl;
}
std::cout << "]" << std::endl;
}
#include <seeta/FaceRecognizer.h>
seeta::FaceRecognizer2 FR("bindata/SeetaFaceRecognizer2.0.ats");
Compare similar between 1.jpg
and 2.jpg
.
cv::Mat mat1 = cv::imread("1.jpg");
seeta::cv::ImageData image1 = mat1;
SeetaRect *face1 = FD.Detect(image1);
SeetaPointF points1[5];
PD.DetectEx(image1, *face1, points1);
cv::Mat mat2 = cv::imread("2.jpg");
seeta::cv::ImageData image2 = mat2;
SeetaRect *face2 = FD.Detect(image2);
SeetaPointF points2[5];
PD.DetectEx(image2, *face2, points2);
float similar = FR.Compare(image1, points1, image2, points2);
// similar should be 0, if `Compare` failed.
Register faces using function like bellowing. The returned value is the index of face database. Reture -1 if failed.
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;
return FR.Register(image, points); // Reture -1 if failed.
}
cv::Mat mat = cv::imread("1.jpg");
seeta::cv::ImageData image = mat;
SeetaRect *face = FD.Detect(image);
SeetaPointF *points = PD.Detect(image, *face);
float similar = 0;
int index = FR.Recognize(image, points, &similar);
index
saves the index of face databese, which is same as the retured value by Register
. similar
saves the most similar.
cv::Mat mat = cv::imread("1.jpg");
seeta::cv::ImageData image = mat;
SeetaRect *face = FD.Detect(image);
SeetaPointF *points = PD.Detect(image, *face);
float *similar = FR.RecognizeEx(image, points);
for (int i = 0; i < FR.MaxRegisterIndex(); ++i)
{
std::cout << "1.jpg vs. db/" << i + 1 << ".jpg: " << similar[i] << std::endl;
}
FR.Clear();