feat:引入人脸识别sdk

This commit is contained in:
ctw committed 2025-11-29 01:17:29 +08:00
1 parent ce16eaf82e
commit 158d012eff
331 files changed
+13539

No files matched your search

@@ -0,0 +1,24 @@
//
// Created on 2024/4/3.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".
#ifndef HARMONYFACEVERIFY_IMAGEUTILS_H
#define HARMONYFACEVERIFY_IMAGEUTILS_H
#include "BlobTypes.h"
#include "FaceBlobTypes.h"
namespace dtf {
class ImageUtils {
public:
static std::string Rotate(const Image *in, int angle, Image *out);
static std::string Crop(const Image *in, Rect rect, Image *out);
static std::string Scale(const Image *in, double x, double y, Image *out);
static std::string Packing(const Image *in, double compress_rate, Image *out);
static std::string YUV2RGB(const Image *in, Image *out);
static std::string BGRA2RGB(const Image *in, Image *out);
static void Release(Image *image);
};
}
#endif //HARMONYFACEVERIFY_IMAGEUTILS_H
@@ -0,0 +1,57 @@
//
// Created on 2024/4/2.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".
#ifndef HARMONYFACEVERIFY_BLOBMANAGER_H
#define HARMONYFACEVERIFY_BLOBMANAGER_H
#include "FaceBlobTypes.h"
#include "BlobImageUtil.h"
#include "BlobTypes.h"
namespace dtf {
struct BlobConfig {
double compress_rate;
double desired_width;
bool need_enc_content;
bool need_enc_image;
int retry_count;
std::string upload_image_type;
std::string bis_token;
std::vector<std::string> collection;
// 加密配置
int aesKeyLen = 0;
std::string rsaMod = "";
std::string rsaExp = "";
void SetDefault();
void ParseConfig(Json config_json);
};
#ifdef DT_REQUEST_BLOB
class BlobManager {
public:
BlobConfig config;
std::string aes_key_cipher;
std::string aes_key;
int metaSerializer;
BlobManager(BlobConfig config);
~BlobManager();
virtual FaceBlobContentResult GenerateBlob(std::vector<FaceFrame> &frames, const std::map<std::string, std::string> &ext);
virtual BlobMeta GenerateMeta(const std::map<std::string, std::string> &ext);
virtual std::string ToString(FaceBlobContentResult &result);
std::string ProcessImage(Image &image, Image *out, Image *out_encrypted);
std::string ProcessImage(Image &image, double compress_rate, Rect roi);
};
#endif
}
#endif //HARMONYFACEVERIFY_BLOBMANAGER_H
@@ -0,0 +1,126 @@
#ifndef BLOBPACKCONTROLLER_H
#define BLOBPACKCONTROLLER_H
#include <vector>
#include <map>
#include "dt_json11.hpp"
#include "BlobManager.h"
#include "BlobTypes.h"
#include "DTEncrypt.h"
using namespace std;
namespace dtf {
class BlobPackController {
public:
BlobPackController();
~BlobPackController();
/**
* @brief config 配置数据打包控制器
* @param config 图像压缩率&密钥等数据
*/
void config(BlobConfig &config);
/**
* @brief cacheBlobContent 缓存人脸识别结果数据
* @param bestImage 最佳人脸图
* @param extraImages 额外采集人脸图片(动作:图片序列)
* @param ext 额外的配置(可不传)
*/
void cacheBlobContent(FaceFrame &bestImage,
vector<pair<string, vector<FaceFrame>>> extraImages = vector<pair<string, vector<FaceFrame>>>(),
map<string, string> ext = map<string, string>());
/**
* @brief encryptExtraImages 加密额外数据图
* @param quality 图片质量
* @return 处理后的照片(动作:原始数据&jpeg图片&加密图片)
*/
vector<pair<string, vector<FaceFrame>>> encryptExtraImages(float quality = 70);
/**
* @brief encryptBestImage 加密最佳人脸图
* @param quality 图片质量
* @return 原始数据&jpeg图片&加密图片
*/
FaceFrame encryptBestImage(float quality = 70);
/**
* @brief signCollectionInfo 对CollectInfo签名
* @param param 额外参数 {"multipic_zfaceBlinkLiveness_video":"123123123123","multipic_LeftYawLiveness_video":"123123123123"}
* @return 签名加密数据
*/
string signCollectionInfo(string param);
/**
* @brief geneateBlob 生成报文blob
* @return 认证报文
*/
string geneateBlob();
/**
* @brief getContentSignature 获取ContentSig,RSA加密密钥
* @return 字符串
*/
string getContentSignature();
/**
* @brief release 数据清除
*/
void release();
protected:
/**
* @brief encryptImage 图像加密
* @param frame 帧数据
* @param quality 图片质量
* @return
*/
FaceFrame encryptImage(FaceFrame &frame, float quality = 70);
/**
* @brief imageRelease 图片释放
* @param frame 帧
*/
void imageRelease(FaceFrame &frame);
/**
* @brief generateCollectionInfo 生成CollectInfo信息
* @param param 外部生成生成CollectInfo
* @return 补充图片MD5数据后的CollectInfo
*/
string generateCollectionInfo(string param);
private:
/**
* @brief contentEncrypt 图片内容加密
*/
DTEncrypt contentEncrypt;
/**
* @brief behavelogEncrypt behavelog加密
*/
DTEncrypt behavelogEncrypt;
/**
* @brief bestImage 最佳人脸图
*/
FaceFrame bestImage;
/**
* @brief extraImages 额外数据
*/
vector<pair<string, vector<FaceFrame>>> extraImages;
/**
* @brief blobConfig 报文配置
*/
BlobConfig blobConfig;
/**
* @brief blobContentExtra 额外参数
*/
map<string, string> blobContentExtra;
};
}
#endif //BLOBPACKCONTROLLER_H
@@ -0,0 +1,122 @@
//
// Created on 2024/4/2.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".
#ifndef HARMONYFACEVERIFY_BLOBMODEL_H
#define HARMONYFACEVERIFY_BLOBMODEL_H
#include "dt_json11.hpp"
#include <string>
namespace dtf {
struct ImageTypeConstant {
static const int YUV;
static const int RGB;
static const int BGRA;
static const int RGBA;
static const int BGR;
};
struct BlobConstant {
static const std::string BLOB_VERSION;
static const std::string SUB_TYPE_PANO;
static const std::string BLOB_ELEM_TYPE_FACE;
static const std::string SUB_TYPE_VERSION;
static const std::string PUB_KEY_N;
static const std::string PUB_KEY_E;
};
struct BlobPackConstant {
static const std::string EXT_NAME;
};
#ifdef DT_REQUEST_BLOB
struct MetaConstant {
static const std::string VAL_TYPE_FACE;
static const std::string KEY_INVTP_TYPE;
static const std::string KEY_BIS_TOKEN;
static const std::string KEY_EXTRA_RETRY;
static const std::string KEY_EXTRA;
static const std::string KEY_DRAGONFLY;
static const std::string KEY_DRAGONFLY_PASS;
static const std::string KEY_PHOTINUS_VIDEO_OSS_NAME;
static const std::string KEY_PHOTINUS_METADATA_OSS_NAME;
static const std::string VAL_INVTP_TYPE_NORMAL;
// static constexpr int VAL_DRAGONFLY_PASS_SUCCESS = 1;
static constexpr int VAL_SERIALIZER_JSON = 1;
static constexpr int VAL_SERIALIZER_PB = 2;
//TS层传入的参数key
static const std::string PARAM_PHOTINUS_VIDEO_OSS_NAME;
static const std::string PARAM_PHOTINUS_METADATA_OSS_NAME;
static const std::string PARAM_BLOB_USE_NATIVE_SWITCH;
};
#endif
struct Point {
double x;
double y;
};
struct Rect {
double left;
double right;
double top;
double bottom;
Rect() {}
Rect(double left, double right, double top, double bottom) {
this->left = left;
this->right = right;
this->top = top;
this->bottom = bottom;
}
};
struct Image {
uint8_t *data = nullptr;
int rotation;
double width;
double height;
long len = 0;
int format;
bool encrypted = false;
std::string base64 = "";
std::string md5 = "";
};
#ifdef DT_REQUEST_BLOB
struct BlobMeta {
std::string type;
std::map<std::string,std::string> collectInfo;
std::map<std::string, int> score;
int serialize;
std::string invtp_type;
std::string bistoken;
std::map<std::string,std::string> extInfo;
};
struct BlobElem {
BlobElem(){}
std::string type;
std::string subType;
int idx;
std::string version;
std::string content;
};
#endif
} // namespace dtf
#endif //HARMONYFACEVERIFY_BLOBMODEL_H
@@ -0,0 +1,135 @@
//
// Created by CandleWen on 2023/7/24.
//
#ifndef VERIFY_DTENCRYPT_H
#define VERIFY_DTENCRYPT_H
#include <string>
using namespace std;
namespace dtf
{
/**
* AES & RSA 加密以及秘钥加密
* 人脸数据加密类
*/
class DTEncrypt
{
public:
/**
* RSA加密数据
* @param mod PK modulus
* @param exp PK exponent
* @param content 加密内容
* @param out 输出内容
* @param out_len 输出长度
*/
static void rsa_encrypt_content(const string &mod, const string &exp, const string &content,
unsigned char **out, size_t *out_len);
/**
* RSA加密数据,返回base64的字符串
* @param mod PK modulus
* @param exp PK exponent
* @param content 加密内容
*/
static string base64_rsa_encrypt_content(const string &mod, const string &exp, const string &content);
/**
* AES加密
* @param giv
* @param in 输入内容
* @param in_len 输入内容长度
* @param key key
* @param out 输出内容
* @param out_len 输出内容长度
*/
static void aes_encrypt(const string &giv, const unsigned char *in, size_t in_len, const string &key,
unsigned char **out, size_t *out_len, uint8_t *iv = 0);
/**
* AES解密
* @param giv
* @param in 输入内容
* @param in_len 输入内容长度
* @param key key
* @param out 输出内容
* @param out_len 输出内容长度
*/
static void aes_decrypt(const string &giv, const unsigned char *in, size_t in_len, const string &key,
unsigned char **out, size_t *out_len, uint8_t *iv = 0);
/**
* 初始化
* @param aes_key_len AES加密秘钥长度
* @param mod RSA公钥modulus
* @param exp RSA公钥exponent
*/
DTEncrypt(int aes_key_len, string mod, string exp);
DTEncrypt();
/**
* @brief init 重新初始化key
* @param aes_key_len key长度
* @param mod RSA公钥modulus
* @param exp RSA公钥exponent
*/
void init(int aes_key_len, string mod, string exp);
/**
* aes 加密 key
* @return
*/
string get_encrypt_key();
/**
* 对Content进行AES加密并返回Base64之后的加密字符串
* @param content 待加密内容
* @param content_len 待加密内容长度
* @return
*/
string base64_encrypt_content(const unsigned char *content, size_t content_len);
/**
* 对content内容进行AES加密
* @param content 加密内容
* @return base64之后的加密字符串
*/
string base64_encrypt_content(const string &content);
/**
* @brief DTEncrypt::encrypt_content 对content内容进行AES加密
* @param content
* @param content_len
* @param output_len
* @return
*/
unsigned char *encrypt_content(const unsigned char *content, size_t content_len, size_t &output_len);
/**
* 对加密且base64之后的字符串进行解密,并做base64返回
* @param encrypt_content 待解密字符串
* @return 解密之后base64内容
*/
string base64_decrypt_content(const string &encrypt_content);
private:
/**
* AES 加密秘钥
*/
string aes_key;
/**
* RSA 对 AES 加密后数据
*/
string encrypt_base64_key;
/**
* AES IV信息
*/
string giv;
};
}
#endif // VERIFY_DTENCRYPT_H
@@ -0,0 +1,67 @@
//
// Created on 2024/4/7.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".
#ifndef HARMONYFACEVERIFY_FACEBLOBTYPES_H
#define HARMONYFACEVERIFY_FACEBLOBTYPES_H
#include "BlobTypes.h"
namespace dtf {
struct FaceAttr {
Rect face_region;
float quality;
float confidence;
};
struct FaceInfo {
Rect rect;
std::vector<Point> points;
float confidence;
float quality;
std::string feature;
std::string feaVersion;
};
struct FaceFrame {
Image image;
Image jpegImage;
Image encryptImage;
FaceAttr attr;
std::map<std::string, std::string> extras;
};
#ifdef DT_REQUEST_BLOB
struct FaceBlobElem : public BlobElem {
std::vector<FaceInfo> face_infos;
std::string return_image; //不加密的返照图
};
struct FaceBlob {
std::string blob_version;
std::vector<FaceBlobElem> blob_elem;
};
struct FaceBlobContent {
FaceBlob blob;
BlobMeta meta;
};
struct FaceBlobContentResult {
FaceBlobContent blob;
std::vector<std::string> blob_content;
std::vector<std::string> return_image;
};
#endif
}
class FaceBlobTypes {
};
#endif //HARMONYFACEVERIFY_FACEBLOBTYPES_H
@@ -0,0 +1,232 @@
/* json11
*
* json11 is a tiny JSON library for C++11, providing JSON parsing and serialization.
*
* The core object provided by the library is json11::Json. A Json object represents any JSON
* value: null, bool, number (int or double), string (std::string), array (std::vector), or
* object (std::map).
*
* Json objects act like values: they can be assigned, copied, moved, compared for equality or
* order, etc. There are also helper methods Json::dump, to serialize a Json to a string, and
* Json::parse (static) to parse a std::string as a Json object.
*
* Internally, the various types of Json object are represented by the JsonValue class
* hierarchy.
*
* A note on numbers - JSON specifies the syntax of number formatting but not its semantics,
* so some JSON implementations distinguish between integers and floating-point numbers, while
* some don't. In json11, we choose the latter. Because some JSON implementations (namely
* Javascript itself) treat all numbers as the same type, distinguishing the two leads
* to JSON that will be *silently* changed by a round-trip through those implementations.
* Dangerous! To avoid that risk, json11 stores all numbers as double internally, but also
* provides integer helpers.
*
* Fortunately, double-precision IEEE754 ('double') can precisely store any integer in the
* range +/-2^53, which includes every 'int' on most systems. (Timestamps often use int64
* or long long to avoid the Y2038K problem; a double storing microseconds since some epoch
* will be exact for +/- 275 years.)
*/
/* Copyright (c) 2013 Dropbox, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#pragma once
#include <string>
#include <vector>
#include <map>
#include <memory>
#include <initializer_list>
#ifdef _MSC_VER
#if _MSC_VER <= 1800 // VS 2013
#ifndef noexcept
#define noexcept throw()
#endif
#ifndef snprintf
#define snprintf _snprintf_s
#endif
#endif
#endif
namespace dtf {
enum JsonParse {
STANDARD, COMMENTS
};
class JsonValue;
class Json final {
public:
// Types
enum Type {
NUL, NUMBER, BOOL, STRING, ARRAY, OBJECT
};
// Array and object typedefs
typedef std::vector<Json> array;
typedef std::map<std::string, Json> object;
// Constructors for the various types of JSON value.
Json() noexcept; // NUL
Json(std::nullptr_t) noexcept; // NUL
Json(double value); // NUMBER
Json(int value); // NUMBER
Json(bool value); // BOOL
Json(const std::string &value); // STRING
Json(std::string &&value); // STRING
Json(const char * value); // STRING
Json(const array &values); // ARRAY
Json(array &&values); // ARRAY
Json(const object &values); // OBJECT
Json(object &&values); // OBJECT
// Implicit constructor: anything with a to_json() function.
template <class T, class = decltype(&T::to_json)>
Json(const T & t) : Json(t.to_json()) {}
// Implicit constructor: map-like objects (std::map, std::unordered_map, etc)
template <class M, typename std::enable_if<
std::is_constructible<std::string, decltype(std::declval<M>().begin()->first)>::value
&& std::is_constructible<Json, decltype(std::declval<M>().begin()->second)>::value,
int>::type = 0>
Json(const M & m) : Json(object(m.begin(), m.end())) {}
// Implicit constructor: vector-like objects (std::list, std::vector, std::set, etc)
template <class V, typename std::enable_if<
std::is_constructible<Json, decltype(*std::declval<V>().begin())>::value,
int>::type = 0>
Json(const V & v) : Json(array(v.begin(), v.end())) {}
// This prevents Json(some_pointer) from accidentally producing a bool. Use
// Json(bool(some_pointer)) if that behavior is desired.
Json(void *) = delete;
// Accessors
Type type() const;
bool is_null() const { return type() == NUL; }
bool is_number() const { return type() == NUMBER; }
bool is_bool() const { return type() == BOOL; }
bool is_string() const { return type() == STRING; }
bool is_array() const { return type() == ARRAY; }
bool is_object() const { return type() == OBJECT; }
// Return the enclosed value if this is a number, 0 otherwise. Note that json11 does not
// distinguish between integer and non-integer numbers - number_value() and int_value()
// can both be applied to a NUMBER-typed object.
double number_value() const;
int int_value() const;
// Return the enclosed value if this is a boolean, false otherwise.
bool bool_value() const;
// Return the enclosed string if this is a string, "" otherwise.
const std::string &string_value() const;
// Return the enclosed std::vector if this is an array, or an empty vector otherwise.
const array &array_items() const;
// Return the enclosed std::map if this is an object, or an empty map otherwise.
const object &object_items() const;
// Return a reference to arr[i] if this is an array, Json() otherwise.
const Json & operator[](size_t i) const;
// Return a reference to obj[key] if this is an object, Json() otherwise.
const Json & operator[](const std::string &key) const;
// Serialize.
void dump(std::string &out) const;
std::string dump() const {
std::string out;
dump(out);
return out;
}
// Parse. If parse fails, return Json() and assign an error message to err.
static Json parse(const std::string & in,
std::string & err,
JsonParse strategy = JsonParse::STANDARD);
static Json parse(const char * in,
std::string & err,
JsonParse strategy = JsonParse::STANDARD) {
if (in) {
return parse(std::string(in), err, strategy);
} else {
err = "null input";
return nullptr;
}
}
// Parse multiple objects, concatenated or separated by whitespace
static std::vector<Json> parse_multi(
const std::string & in,
std::string::size_type & parser_stop_pos,
std::string & err,
JsonParse strategy = JsonParse::STANDARD);
static inline std::vector<Json> parse_multi(
const std::string & in,
std::string & err,
JsonParse strategy = JsonParse::STANDARD) {
std::string::size_type parser_stop_pos;
return parse_multi(in, parser_stop_pos, err, strategy);
}
bool operator== (const Json &rhs) const;
bool operator< (const Json &rhs) const;
bool operator!= (const Json &rhs) const { return !(*this == rhs); }
bool operator<= (const Json &rhs) const { return !(rhs < *this); }
bool operator> (const Json &rhs) const { return (rhs < *this); }
bool operator>= (const Json &rhs) const { return !(*this < rhs); }
/* has_shape(types, err)
*
* Return true if this is a JSON object and, for each item in types, has a field of
* the given type. If not, return false and set err to a descriptive message.
*/
typedef std::initializer_list<std::pair<std::string, Type>> shape;
bool has_shape(const shape & types, std::string & err) const;
private:
std::shared_ptr<JsonValue> m_ptr;
};
// Internal class hierarchy - JsonValue objects are not exposed to users of this API.
class JsonValue {
protected:
friend class Json;
friend class JsonInt;
friend class JsonDouble;
virtual Json::Type type() const = 0;
virtual bool equals(const JsonValue * other) const = 0;
virtual bool less(const JsonValue * other) const = 0;
virtual void dump(std::string &out) const = 0;
virtual double number_value() const;
virtual int int_value() const;
virtual bool bool_value() const;
virtual const std::string &string_value() const;
virtual const Json::array &array_items() const;
virtual const Json &operator[](size_t i) const;
virtual const Json::object &object_items() const;
virtual const Json &operator[](const std::string &key) const;
virtual ~JsonValue() {}
};
} // namespace dtf