-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathsample_search_face.cpp
More file actions
130 lines (113 loc) · 4.28 KB
/
sample_search_face.cpp
File metadata and controls
130 lines (113 loc) · 4.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <inspireface.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
if (argc != 4) {
HFLogPrint(HF_LOG_ERROR, "Usage: %s <pack_path> <feature_path> <image_path>", argv[0]);
return -1;
}
char* packPath = argv[1];
char* featurePath = argv[2];
char* imagePath = argv[3];
HResult ret;
ret = HFLaunchInspireFace(packPath);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Load Resource error: %d", ret);
return ret;
}
// 1. Enable feature hub
HFFeatureHubConfiguration featureHubConfiguration;
featureHubConfiguration.primaryKeyMode = HF_PK_AUTO_INCREMENT;
featureHubConfiguration.enablePersistence = 1;
featureHubConfiguration.persistenceDbPath = featurePath;
featureHubConfiguration.searchThreshold = 0.32f;
featureHubConfiguration.searchMode = HF_SEARCH_MODE_EXHAUSTIVE;
ret = HFFeatureHubDataEnable(featureHubConfiguration);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Enable feature hub error: %d", ret);
return ret;
}
// 2. Create session
HFSession session;
ret = HFCreateInspireFaceSessionOptional(HF_ENABLE_FACE_RECOGNITION, HF_DETECT_MODE_ALWAYS_DETECT, 1, 320, -1, &session);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Create session error: %d", ret);
return ret;
}
// 3. Load image
HFImageBitmap image;
ret = HFCreateImageBitmapFromFilePath(imagePath, 3, &image);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Create image bitmap error: %d", ret);
HFReleaseInspireFaceSession(session);
return ret;
}
// 4. Create image stream
HFImageStream imageHandle;
ret = HFCreateImageStreamFromImageBitmap(image, HF_CAMERA_ROTATION_0, &imageHandle);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Create image stream error: %d", ret);
HFReleaseImageBitmap(image);
HFReleaseInspireFaceSession(session);
return ret;
}
// 5. Detect face
HFMultipleFaceData multipleFaceData;
ret = HFExecuteFaceTrack(session, imageHandle, &multipleFaceData);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Execute face track error: %d", ret);
HFReleaseImageStream(imageHandle);
HFReleaseImageBitmap(image);
HFReleaseInspireFaceSession(session);
return ret;
}
if (multipleFaceData.detectedNum == 0) {
HFLogPrint(HF_LOG_WARN, "No face detected in image: %s", imagePath);
HFReleaseImageStream(imageHandle);
HFReleaseImageBitmap(image);
HFReleaseInspireFaceSession(session);
return -1;
}
HFLogPrint(HF_LOG_INFO, "Face detected: %d", multipleFaceData.detectedNum);
// 6. Extract feature
HFFaceFeature feature;
ret = HFCreateFaceFeature(&feature);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Create face feature error: %d", ret);
HFReleaseImageStream(imageHandle);
HFReleaseImageBitmap(image);
HFReleaseInspireFaceSession(session);
return ret;
}
ret = HFFaceFeatureExtractTo(session, imageHandle, multipleFaceData.tokens[0], feature);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Extract feature error: %d", ret);
HFReleaseFaceFeature(&feature);
HFReleaseImageStream(imageHandle);
HFReleaseImageBitmap(image);
HFReleaseInspireFaceSession(session);
return ret;
}
// 7. Search face
HFloat confidence;
HFFaceFeatureIdentity searchResult = {0};
ret = HFFeatureHubFaceSearch(feature, &confidence, &searchResult);
if (ret != HSUCCEED) {
HFLogPrint(HF_LOG_ERROR, "Search face feature error: %d", ret);
} else {
if (searchResult.id != -1) {
HFLogPrint(HF_LOG_INFO, "Search face feature success!");
HFLogPrint(HF_LOG_INFO, "Found matching face ID: %d", searchResult.id);
HFLogPrint(HF_LOG_INFO, "Confidence score: %.4f", confidence);
} else {
HFLogPrint(HF_LOG_INFO, "No matching face found in database");
}
}
// 8. Clean up
HFReleaseFaceFeature(&feature);
HFReleaseImageStream(imageHandle);
HFReleaseImageBitmap(image);
HFReleaseInspireFaceSession(session);
HFDeBugShowResourceStatistics();
return ret;
}