fix: 修复特征提取失败(错误码81929)

问题: extractFaceFeature 返回错误码 81929 (MERR_FSDK_FACEFEATURE_FACEDATA)

根本原因: detectFaces 返回的人脸信息缺少 faceData 字段,
而虹软 SDK 的 extractFaceFeature 必须要有这个字段才能提取特征

修复:
- FaceEngineManager.convertFaceInfoToList: 添加返回 faceData
- ArcPlugin.handleExtractFaceFeature: 接收并传递 faceData 参数
- Dart API: extractFaceFeature 添加 faceData 参数
- example: 传递 faceData 到特征提取调用

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-30 16:58:12 +08:00
parent c9d57d160c
commit 86e268ae1c
7 changed files with 1611 additions and 3 deletions

174
lib/arc.dart Normal file
View File

@@ -0,0 +1,174 @@
import 'dart:typed_data';
import 'arc_platform_interface.dart';
class Arc {
/// 获取平台版本
Future<String?> getPlatformVersion() {
return ArcPlatform.instance.getPlatformVersion();
}
/// 激活 SDK在线激活
/// [appId] 应用 ID从虹软控制台获取
/// [sdkKey] SDK 密钥(从虹软控制台获取)
/// [activeKey] 激活密钥
/// 返回包含 success, errorCode, message 的 Map
Future<Map<String, dynamic>?> activeOnline({
required String appId,
required String sdkKey,
required String activeKey,
}) {
return ArcPlatform.instance.activeOnline(
appId: appId,
sdkKey: sdkKey,
activeKey: activeKey,
);
}
/// 初始化人脸识别引擎
/// [detectMode] 检测模式0=VIDEO 视频流模式1=IMAGE 图像模式)
/// [orient] 检测角度0/90/180/270/360
/// [maxFaceNum] 最大可检测人脸数量
/// [combinedMask] 功能组合掩码
/// 返回包含 success, errorCode, message 的 Map
Future<Map<String, dynamic>?> init({
int? detectMode,
int? orient,
int? maxFaceNum,
int? combinedMask,
}) {
return ArcPlatform.instance.init(
detectMode: detectMode,
orient: orient,
maxFaceNum: maxFaceNum,
combinedMask: combinedMask,
);
}
/// 检测人脸(同时进行 RGB 活体检测)
/// [data] NV21 格式的图像数据
/// [width] 图像宽度
/// [height] 图像高度
/// [format] 图像格式2050=NV21默认
/// 返回包含 success, errorCode, message, faceList, rgbLiveness, isRgbAlive 的 Map
/// rgbLiveness: -1=未知, 0=非真人, 1=真人
Future<Map<String, dynamic>?> detectFaces({
required Uint8List data,
required int width,
required int height,
int format = 2050,
}) {
return ArcPlatform.instance.detectFaces(
data: data,
width: width,
height: height,
format: format,
);
}
/// 提取人脸特征
/// [data] NV21 格式的图像数据
/// [width] 图像宽度
/// [height] 图像高度
/// [rectLeft] 人脸框左边界从detectFaces获取
/// [rectTop] 人脸框上边界从detectFaces获取
/// [rectRight] 人脸框右边界从detectFaces获取
/// [rectBottom] 人脸框下边界从detectFaces获取
/// [format] 图像格式2050=NV21默认
/// [faceOrientation] 人脸角度从detectFaces获取
/// [faceId] 人脸ID从detectFaces获取
/// [faceData] 人脸数据从detectFaces获取必需这是虹软SDK进行特征提取的关键数据
/// [extractType] 特征提取类型0=注册, 1=识别,默认为识别)
/// [mask] 口罩状态0=未佩戴, 1=已佩戴,默认为未佩戴)
/// 返回包含 success, errorCode, message, featureData 的 Map
Future<Map<String, dynamic>?> extractFaceFeature({
required Uint8List data,
required int width,
required int height,
required int rectLeft,
required int rectTop,
required int rectRight,
required int rectBottom,
int format = 2050,
int faceOrientation = 0,
int faceId = -1,
Uint8List? faceData,
int extractType = 1,
int mask = 0,
}) {
return ArcPlatform.instance.extractFaceFeature(
data: data,
width: width,
height: height,
rectLeft: rectLeft,
rectTop: rectTop,
rectRight: rectRight,
rectBottom: rectBottom,
format: format,
faceOrientation: faceOrientation,
faceId: faceId,
faceData: faceData,
extractType: extractType,
mask: mask,
);
}
/// 比对人脸特征
/// [featureData1] 第一个人脸特征数据从extractFaceFeature获取
/// [featureData2] 第二个人脸特征数据从extractFaceFeature获取
/// [compareModel] 比对模型0=生活照, 1=证件照,默认为生活照)
/// 返回包含 success, errorCode, message, similarity 的 Map
/// similarity: 相似度分数0-1之间推荐阈值生活照0.8证件照0.82
Future<Map<String, dynamic>?> compareFaceFeature({
required Uint8List featureData1,
required Uint8List featureData2,
int compareModel = 0,
}) {
return ArcPlatform.instance.compareFaceFeature(
featureData1: featureData1,
featureData2: featureData2,
compareModel: compareModel,
);
}
/// 注册单张人脸特征到人脸库用于1:N搜索
/// [searchId] 唯一标识符用于后续搜索匹配建议使用用户ID
/// [featureData] 人脸特征数据从extractFaceFeature获取建议使用extractType=0注册模式
/// [faceTag] 附属信息可选如用户名、员工ID等
/// 返回包含 success, errorCode, message 的 Map
/// 注意如果底库中已存在相同searchIdSDK会忽略此次注册
Future<Map<String, dynamic>?> registerFaceFeature({
required int searchId,
required Uint8List featureData,
String? faceTag,
}) {
return ArcPlatform.instance.registerFaceFeature(
searchId: searchId,
featureData: featureData,
faceTag: faceTag,
);
}
/// 批量注册人脸特征到人脸库用于1:N搜索
/// [faceList] 人脸列表,每项需包含:
/// - searchId: 唯一标识符int必填
/// - featureData: 人脸特征数据Uint8List必填
/// - faceTag: 附属信息String可选
/// 返回包含 success, errorCode, message 的 Map
/// 示例:
/// ```dart
/// await arc.registerFaceFeatureBatch(
/// faceList: [
/// {'searchId': 1, 'featureData': feature1, 'faceTag': '张三'},
/// {'searchId': 2, 'featureData': feature2, 'faceTag': '李四'},
/// ],
/// );
/// ```
Future<Map<String, dynamic>?> registerFaceFeatureBatch({
required List<Map<String, dynamic>> faceList,
}) {
return ArcPlatform.instance.registerFaceFeatureBatch(
faceList: faceList,
);
}
}