@@ -62,6 +62,8 @@ int32_t FaceContext::FaceDetectAndTrack(CameraStream &image) {
6262 m_yaw_results_cache_.clear ();
6363 m_pitch_results_cache_.clear ();
6464 m_quality_score_results_cache_.clear ();
65+ m_react_left_eye_results_cache_.clear ();
66+ m_react_right_eye_results_cache_.clear ();
6567 if (m_face_track_ == nullptr ) {
6668 return HERR_SESS_TRACKER_FAILURE;
6769 }
@@ -129,6 +131,8 @@ int32_t FaceContext::FacesProcess(CameraStream &image, const std::vector<HyperFa
129131 std::lock_guard<std::mutex> lock (m_mtx_);
130132 m_mask_results_cache_.resize (faces.size (), -1 .0f );
131133 m_rgb_liveness_results_cache_.resize (faces.size (), -1 .0f );
134+ m_react_left_eye_results_cache_.resize (faces.size (), -1 .0f );
135+ m_react_right_eye_results_cache_.resize (faces.size (), -1 .0f );
132136 for (int i = 0 ; i < faces.size (); ++i) {
133137 const auto &face = faces[i];
134138 // RGB Liveness Detect
@@ -161,6 +165,38 @@ int32_t FaceContext::FacesProcess(CameraStream &image, const std::vector<HyperFa
161165 return ret;
162166 }
163167 }
168+ // Face interaction
169+ if (param.enable_interaction_liveness ) {
170+ auto ret = m_face_pipeline_->Process (image, face, PROCESS_INTERACTION);
171+ if (ret != HSUCCEED) {
172+ return ret;
173+ }
174+ // Get eyes status
175+ m_react_left_eye_results_cache_[i] = m_face_pipeline_->eyesStatusCache [0 ];
176+ m_react_right_eye_results_cache_[i] = m_face_pipeline_->eyesStatusCache [1 ];
177+ // Special handling: ff it is a tracking state, it needs to be filtered
178+ if (face.trackState > 0 )
179+ {
180+ auto idx = face.inGroupIndex ;
181+ if (idx < m_face_track_->trackingFace .size ()) {
182+ auto & target = m_face_track_->trackingFace [idx];
183+ if (target.GetTrackingId () == face.trackId ) {
184+ auto new_eye_left = EmaFilter (m_face_pipeline_->eyesStatusCache [0 ], target.left_eye_status_ , 8 , 0 .2f );
185+ auto new_eye_right = EmaFilter (m_face_pipeline_->eyesStatusCache [1 ], target.right_eye_status_ , 8 , 0 .2f );
186+ if (face.trackState > 1 ) {
187+ // The filtered value can be obtained only in the tracking state
188+ m_react_left_eye_results_cache_[i] = new_eye_left;
189+ m_react_right_eye_results_cache_[i] = new_eye_right;
190+ }
191+
192+ } else {
193+ INSPIRE_LOGD (" Serialized objects cannot connect to trace objects in memory, and there may be some problems" );
194+ }
195+ } else {
196+ INSPIRE_LOGW (" The index of the trace object does not match the trace list in memory, and there may be some problems" );
197+ }
198+ }
199+ }
164200
165201 }
166202
@@ -212,6 +248,13 @@ const std::vector<float>& FaceContext::GetFaceQualityScoresResultsCache() const
212248 return m_quality_score_results_cache_;
213249}
214250
251+ const std::vector<float >& FaceContext::GetFaceInteractionLeftEyeStatusCache () const {
252+ return m_react_left_eye_results_cache_;
253+ }
254+
255+ const std::vector<float >& FaceContext::GetFaceInteractionRightEyeStatusCache () const {
256+ return m_react_right_eye_results_cache_;
257+ }
215258
216259const Embedded& FaceContext::GetFaceFeatureCache () const {
217260 return m_face_feature_cache_;
0 commit comments