Sample to operate omron HVC-P2 on GR-PEACH.
Dependencies: AsciiFont
STBFaceInfo.c
00001 /*---------------------------------------------------------------------------*/ 00002 /* Copyright(C) 2017 OMRON Corporation */ 00003 /* */ 00004 /* Licensed under the Apache License, Version 2.0 (the "License"); */ 00005 /* you may not use this file except in compliance with the License. */ 00006 /* You may obtain a copy of the License at */ 00007 /* */ 00008 /* http://www.apache.org/licenses/LICENSE-2.0 */ 00009 /* */ 00010 /* Unless required by applicable law or agreed to in writing, software */ 00011 /* distributed under the License is distributed on an "AS IS" BASIS, */ 00012 /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ 00013 /* See the License for the specific language governing permissions and */ 00014 /* limitations under the License. */ 00015 /*---------------------------------------------------------------------------*/ 00016 00017 #include "STBCommonDef.h" 00018 #include "STBFaceInfo.h" 00019 #include "STB_Debug.h" 00020 #include "STBValidValue.h" 00021 00022 00023 00024 00025 /*------------------------------------------------------------------------------------------------------------------*/ 00026 /*CopyFace : Face information all copy*/ 00027 /*------------------------------------------------------------------------------------------------------------------*/ 00028 static VOID CopyFace(FaceObj *faceSrc,FaceObj *faceDst, const STBExecFlg *execFlg ) 00029 { 00030 00031 STB_INT32 j; 00032 00033 faceDst->nDetID = faceSrc->nDetID ; 00034 faceDst->nTraID = faceSrc->nTraID ; 00035 if( execFlg->gen == STB_TRUE ) 00036 { 00037 faceDst->genConf = faceSrc->genConf ; 00038 faceDst->genStatus = faceSrc->genStatus ; 00039 faceDst->genVal = faceSrc->genVal ; 00040 } 00041 if( execFlg->age == STB_TRUE ) 00042 { 00043 faceDst->ageConf = faceSrc->ageConf ; 00044 faceDst->ageStatus = faceSrc->ageStatus ; 00045 faceDst->ageVal = faceSrc->ageVal ; 00046 } 00047 if( execFlg->fr == STB_TRUE ) 00048 { 00049 faceDst->frConf = faceSrc->frConf ; 00050 faceDst->frStatus = faceSrc->frStatus ; 00051 faceDst->frVal = faceSrc->frVal ; 00052 } 00053 if( execFlg->exp == STB_TRUE ) 00054 { 00055 faceDst->expConf = faceSrc->expConf ; 00056 faceDst->expStatus = faceSrc->expStatus ; 00057 faceDst->expVal = faceSrc->expVal ; 00058 for( j = 0 ; j < STB_EX_MAX ;j++) 00059 { 00060 faceDst->expScore[j] = faceSrc->expScore[j]; 00061 } 00062 } 00063 if( execFlg->gaz == STB_TRUE ) 00064 { 00065 faceDst->gazConf = faceSrc->gazConf ; 00066 faceDst->gazStatus = faceSrc->gazStatus ; 00067 faceDst->gazLR = faceSrc->gazLR ; 00068 faceDst->gazUD = faceSrc->gazUD ; 00069 } 00070 if( execFlg->dir == STB_TRUE ) 00071 { 00072 faceDst->dirConf = faceSrc->dirConf ; 00073 faceDst->dirYaw = faceSrc->dirYaw ; 00074 faceDst->dirRoll = faceSrc->dirRoll ; 00075 faceDst->dirPitch = faceSrc->dirPitch ; 00076 faceDst->dirStatus = faceSrc->dirStatus ; 00077 } 00078 if( execFlg->bli == STB_TRUE ) 00079 { 00080 faceDst->bliL = faceSrc->bliL ; 00081 faceDst->bliR = faceSrc->bliR ; 00082 faceDst->bliStatus = faceSrc->bliStatus ; 00083 } 00084 00085 00086 00087 } 00088 /*------------------------------------------------------------------------------------------------------------------*/ 00089 /* ClearFace */ 00090 /*------------------------------------------------------------------------------------------------------------------*/ 00091 static VOID ClearFace ( FaceObj *face , int i , const STBExecFlg *execFlg ) 00092 { 00093 STB_INT32 j; 00094 00095 face[i].nDetID = -1 ; 00096 face[i].nTraID = -1 ; 00097 00098 if( execFlg->gen == STB_TRUE ) 00099 { 00100 face[i].genConf = STB_ERR_PE_CANNOT ; 00101 face[i].genStatus = STB_STATUS_NO_DATA ; 00102 face[i].genVal = STB_ERR_PE_CANNOT ; 00103 } 00104 if( execFlg->age == STB_TRUE ) 00105 { 00106 face[i].ageConf = STB_ERR_PE_CANNOT ; 00107 face[i].ageStatus = STB_STATUS_NO_DATA ; 00108 face[i].ageVal = STB_ERR_PE_CANNOT ; 00109 } 00110 if( execFlg->fr == STB_TRUE ) 00111 { 00112 face[i].frConf = STB_ERR_PE_CANNOT ; 00113 face[i].frStatus = STB_STATUS_NO_DATA ; 00114 face[i].frVal = STB_ERR_FR_CANNOT ; 00115 } 00116 if( execFlg->exp == STB_TRUE ) 00117 { 00118 face[i].expConf = STB_ERR_PE_CANNOT ; 00119 for (j = STB_EX_NEUTRAL; j < STB_EX_MAX;j++) 00120 { 00121 face[i].expScore[j] = STB_ERR_PE_CANNOT ; 00122 } 00123 face[i].expStatus = STB_STATUS_NO_DATA ; 00124 face[i].expVal = STB_ERR_PE_CANNOT ; 00125 } 00126 if( execFlg->gaz == STB_TRUE ) 00127 { 00128 face[i].gazConf = STB_ERR_PE_CANNOT ; 00129 face[i].gazStatus = STB_STATUS_NO_DATA ; 00130 face[i].gazLR = STB_ERR_PE_CANNOT ; 00131 face[i].gazUD = STB_ERR_PE_CANNOT ; 00132 } 00133 if( execFlg->dir == STB_TRUE ) 00134 { 00135 face[i].dirConf = STB_ERR_PE_CANNOT ; 00136 face[i].dirStatus = STB_STATUS_NO_DATA ; 00137 face[i].dirYaw = STB_ERR_DIR_CANNOT ; 00138 face[i].dirRoll = STB_ERR_DIR_CANNOT ; 00139 face[i].dirPitch = STB_ERR_DIR_CANNOT ; 00140 } 00141 if( execFlg->bli == STB_TRUE ) 00142 { 00143 face[i].bliL = STB_ERR_PE_CANNOT ; 00144 face[i].bliR = STB_ERR_PE_CANNOT ; 00145 face[i].bliStatus = STB_STATUS_NO_DATA ; 00146 } 00147 00148 } 00149 /*------------------------------------------------------------------------------------------------------------------*/ 00150 /* SetFaceObject : Copy the tracking information */ 00151 /*------------------------------------------------------------------------------------------------------------------*/ 00152 VOID SetFaceObject( const STB_FRAME_RESULT_FACES* stbINPUTfaces ,FaceObj *faces , const STBExecFlg *execFlg , const STB_INT32 nTraCntMax) 00153 { 00154 STB_INT32 nCount; 00155 STB_INT32 i,nIdx1; 00156 00157 00158 nCount = stbINPUTfaces->nCount; 00159 00160 00161 for (i = 0; i < nCount; i++) 00162 { 00163 faces[i].nDetID = i; 00164 faces[i].nTraID = STB_STATUS_NO_DATA; 00165 } 00166 00167 if( execFlg->dir == STB_TRUE ) /*Face direction*/ 00168 { 00169 for (i = 0; i < nCount; i++) 00170 { 00171 faces[i].dirConf = stbINPUTfaces->face[i].direction.nConfidence; 00172 faces[i].dirYaw = stbINPUTfaces->face[i].direction.nLR; 00173 faces[i].dirRoll = stbINPUTfaces->face[i].direction.nRoll; 00174 faces[i].dirPitch = stbINPUTfaces->face[i].direction.nUD; 00175 } 00176 } 00177 if( execFlg->age == STB_TRUE ) /*Age*/ 00178 { 00179 for (i = 0; i < nCount; i++) 00180 { 00181 faces[i].ageConf = stbINPUTfaces->face[i].age.nConfidence; 00182 faces[i].ageStatus = STB_STATUS_NO_DATA; 00183 faces[i].ageVal = stbINPUTfaces->face[i].age.nAge; 00184 } 00185 } 00186 if( execFlg->exp == STB_TRUE ) /*Facial expression*/ 00187 { 00188 for (i = 0; i < nCount; i++) 00189 { 00190 faces[i].expConf = -1;// not degree 00191 for (nIdx1 = STB_EX_NEUTRAL; nIdx1 < STB_EX_MAX;nIdx1++) 00192 { 00193 faces[i].expScore[ nIdx1] = stbINPUTfaces->face[i].expression.anScore[nIdx1]; 00194 } 00195 faces[i].expStatus = STB_STATUS_NO_DATA; 00196 faces[i].expVal = STB_EX_UNKNOWN; 00197 } 00198 } 00199 if( execFlg->gen == STB_TRUE ) /*Gender*/ 00200 { 00201 for (i = 0; i < nCount; i++) 00202 { 00203 faces[i].genConf = stbINPUTfaces->face[i].gender.nConfidence; 00204 faces[i].genStatus = STB_STATUS_NO_DATA; 00205 faces[i].genVal = stbINPUTfaces->face[i].gender.nGender; 00206 } 00207 } 00208 if( execFlg->gaz == STB_TRUE ) /*Gaze*/ 00209 { 00210 for (i = 0; i < nCount; i++) 00211 { 00212 faces[i].gazConf = stbINPUTfaces->face[i].direction.nConfidence; 00213 faces[i].gazStatus = STB_STATUS_NO_DATA; 00214 faces[i].gazLR = stbINPUTfaces->face[i].gaze.nLR; 00215 faces[i].gazUD = stbINPUTfaces->face[i].gaze.nUD; 00216 } 00217 } 00218 if( execFlg->fr == STB_TRUE ) /*Face recognition*/ 00219 { 00220 for (i = 0; i < nCount; i++) 00221 { 00222 faces[i].frConf = stbINPUTfaces->face[i].recognition.nScore; 00223 faces[i].frStatus = STB_STATUS_NO_DATA; 00224 faces[i].frVal = stbINPUTfaces->face[i].recognition.nUID; 00225 } 00226 } 00227 if( execFlg->bli == STB_TRUE ) //blink 00228 { 00229 for (i = 0; i < nCount; i++) 00230 { 00231 faces[i].bliL = stbINPUTfaces->face[i].blink.nLeftEye; 00232 faces[i].bliR = stbINPUTfaces->face[i].blink.nRightEye; 00233 } 00234 } 00235 00236 /*The results exceeding the detection number are initialized*/ 00237 for ( i = nCount; i < nTraCntMax; i++) 00238 { 00239 ClearFace ( faces , i , execFlg ); 00240 } 00241 00242 } 00243 00244 00245 /*------------------------------------------------------------------------------------------------------------------*/ 00246 /* SetTrackingIDToFace : Tracking result ID is linked to face information */ 00247 /*------------------------------------------------------------------------------------------------------------------*/ 00248 VOID SetTrackingIDToFace(STB_INT32 TrackingNum,STB_INT32 DetectNum, TraObj *track,FaceObj *faces , const STBExecFlg *execFlg ) 00249 { 00250 STB_INT32 i,j; 00251 00252 00253 /*If there is a detection result erased in the tracking result, it is deleted from the face information.*/ 00254 for( i = 0 ; i < DetectNum; i++) 00255 { 00256 /*termination if no more detected results*/ 00257 if(faces[i].nDetID < 0) 00258 { 00259 break; 00260 } 00261 00262 /*Search for the same ID as the detection result from the tracking result*/ 00263 for( j = 0; j < TrackingNum ; j++) 00264 { 00265 if(track[j].nDetID == faces[i].nDetID) 00266 { 00267 faces[i].nTraID = track[j].nTraID; 00268 break; 00269 } 00270 } 00271 00272 if( j >= TrackingNum){ 00273 /*If the detection ID is not included in the ID under tracking*/ 00274 ClearFace ( faces , i , execFlg); 00275 for(j = j + 1 ; j < DetectNum; j++) 00276 { 00277 if(faces[j].nDetID < 0) 00278 { 00279 /*Repeat until detection result disappears*/ 00280 break; 00281 } 00282 /*Stuff up ahead of erasure*/ 00283 CopyFace ( (faces+j),(faces+j-1), execFlg ); 00284 } 00285 } 00286 } 00287 /*After that, the processing for the face only during tracking (retry status)*/ 00288 for( j = 0 ; j < TrackingNum; j++) 00289 { 00290 if( track[j].nDetID < 0) 00291 { 00292 ClearFace ( faces , i , execFlg );/*It should have been cleared but just in case*/ 00293 faces[i].nDetID = track[j].nDetID; 00294 faces[i].nTraID = track[j].nTraID; 00295 i++; 00296 } 00297 } 00298 00299 return; 00300 } 00301 /*------------------------------------------------------------------------------------------------------------------*/ 00302 /* SetFaceToPeInfo : Create input data for stabilization of property estimation from face information */ 00303 /*------------------------------------------------------------------------------------------------------------------*/ 00304 VOID SetFaceToPeInfo(STB_INT32 TrackingNum,FaceObj *faces,STB_PE_DET *peInfo) 00305 { 00306 STB_INT32 nIdx,nIdx1; 00307 00308 peInfo->num = TrackingNum; 00309 for(nIdx=0 ; nIdx < TrackingNum;nIdx++) 00310 { 00311 /*tracking result*/ 00312 peInfo->fcDet[nIdx].nDetID = faces[nIdx].nDetID ; 00313 peInfo->fcDet[nIdx].nTraID = faces[nIdx].nTraID ; 00314 /*Face direction estimation*/ 00315 peInfo->fcDet[nIdx].dirDetConf = faces[nIdx].dirConf ; 00316 peInfo->fcDet[nIdx].dirDetYaw = faces[nIdx].dirYaw ; 00317 peInfo->fcDet[nIdx].dirDetPitch = faces[nIdx].dirPitch ; 00318 peInfo->fcDet[nIdx].dirDetRoll = faces[nIdx].dirRoll ; 00319 /*Age estimation*/ 00320 peInfo->fcDet[nIdx].ageDetVal = faces[nIdx].ageVal ; 00321 peInfo->fcDet[nIdx].ageDetConf = faces[nIdx].ageConf ; 00322 /*Gaze estimation*/ 00323 peInfo->fcDet[nIdx].gazDetLR = faces[nIdx].gazLR ; 00324 peInfo->fcDet[nIdx].gazDetUD = faces[nIdx].gazUD ; 00325 /*Gender estimation*/ 00326 peInfo->fcDet[nIdx].genDetVal = faces[nIdx].genVal ; 00327 peInfo->fcDet[nIdx].genDetConf = faces[nIdx].genConf ; 00328 /*estimation of facial expression*/ 00329 peInfo->fcDet[nIdx].expDetConf = faces[nIdx].expConf ; 00330 for( nIdx1 = 0; nIdx1 < STB_EX_MAX; nIdx1++) 00331 { 00332 peInfo->fcDet[nIdx].expDetVal[nIdx1] = faces[nIdx].expScore[nIdx1]; 00333 } 00334 //blink 00335 peInfo->fcDet[nIdx].bliDetL = faces[nIdx].bliL ; 00336 peInfo->fcDet[nIdx].bliDetR = faces[nIdx].bliR ; 00337 00338 00339 } 00340 return; 00341 } 00342 /*------------------------------------------------------------------------------------------------------------------*/ 00343 /* SetFaceToFrInfo : Create input data for stabilization of face recognition from face information */ 00344 /*------------------------------------------------------------------------------------------------------------------*/ 00345 VOID SetFaceToFrInfo(STB_INT32 TrackingNum,FaceObj *faces,STB_FR_DET *frInfo) 00346 { 00347 STB_INT32 nIdx; 00348 00349 00350 frInfo->num = TrackingNum; 00351 for(nIdx=0 ; nIdx < TrackingNum;nIdx++) 00352 { 00353 /*tracking result*/ 00354 frInfo->fcDet[nIdx].nDetID = faces[nIdx].nDetID ; 00355 frInfo->fcDet[nIdx].nTraID = faces[nIdx].nTraID ; 00356 00357 /*Face direction estimation*/ 00358 frInfo->fcDet[nIdx].dirDetConf = faces[nIdx].dirConf ; 00359 frInfo->fcDet[nIdx].dirDetYaw = faces[nIdx].dirYaw ; 00360 frInfo->fcDet[nIdx].dirDetPitch = faces[nIdx].dirPitch ; 00361 frInfo->fcDet[nIdx].dirDetRoll = faces[nIdx].dirRoll ; 00362 00363 /*recognition result*/ 00364 frInfo->fcDet[nIdx].frDetConf = faces[nIdx].frConf ; 00365 frInfo->fcDet[nIdx].frDetID = faces[nIdx].frVal ; 00366 00367 } 00368 return; 00369 } 00370 /*------------------------------------------------------------------------------------------------------------------*/ 00371 /* SetPeInfoToFace : Copy stabilization result of property estimation to face information */ 00372 /*------------------------------------------------------------------------------------------------------------------*/ 00373 VOID SetPeInfoToFace(STB_INT32 TrackingNum,STB_PE_RES *peInfo,FaceObj *faces, const STBExecFlg *execFlg ) 00374 { 00375 STB_INT32 i,j; 00376 00377 for( i = 0 ; i < TrackingNum; i++) 00378 { 00379 for( j = 0 ; j < TrackingNum; j++) 00380 { 00381 if(peInfo->peFace[j].nTraID == faces[i].nTraID ) 00382 { 00383 if( execFlg->gen == STB_TRUE ) 00384 { 00385 faces[i].genStatus = peInfo->peFace[j].gen.status ; 00386 faces[i].genVal = peInfo->peFace[j].gen.value ; 00387 faces[i].genConf = peInfo->peFace[j].gen.conf ; 00388 } 00389 if( execFlg->age == STB_TRUE ) 00390 { 00391 faces[i].ageStatus = peInfo->peFace[j].age.status ; 00392 faces[i].ageVal = peInfo->peFace[j].age.value ; 00393 faces[i].ageConf = peInfo->peFace[j].age.conf ; 00394 } 00395 if( execFlg->exp == STB_TRUE ) 00396 { 00397 faces[i].expStatus = peInfo->peFace[j].exp.status ; 00398 faces[i].expVal = peInfo->peFace[j].exp.value ; 00399 faces[i].expConf = peInfo->peFace[j].exp.conf ; 00400 } 00401 if( execFlg->gaz == STB_TRUE ) 00402 { 00403 faces[i].gazStatus = peInfo->peFace[j].gaz.status ; 00404 faces[i].gazConf = peInfo->peFace[j].gaz.conf ; 00405 faces[i].gazLR = peInfo->peFace[j].gaz.LR ; 00406 faces[i].gazUD = peInfo->peFace[j].gaz.UD ; 00407 } 00408 if( execFlg->dir == STB_TRUE ) 00409 { 00410 faces[i].dirPitch = peInfo->peFace[j].dir.pitch ; 00411 faces[i].dirRoll = peInfo->peFace[j].dir.roll ; 00412 faces[i].dirYaw = peInfo->peFace[j].dir.yaw ; 00413 faces[i].dirStatus = peInfo->peFace[j].dir.status ; 00414 faces[i].dirConf = peInfo->peFace[j].dir.conf ; 00415 } 00416 if( execFlg->bli == STB_TRUE ) 00417 { 00418 faces[i].bliL = peInfo->peFace[j].bli.ratioL ; 00419 faces[i].bliR = peInfo->peFace[j].bli.ratioR ; 00420 faces[i].bliStatus = peInfo->peFace[j].bli.status ; 00421 } 00422 break; 00423 } 00424 } 00425 } 00426 00427 return; 00428 } 00429 /*------------------------------------------------------------------------------------------------------------------*/ 00430 /* SetFrInfoToFace : Copy stabilization result of face recognition to face information */ 00431 /*------------------------------------------------------------------------------------------------------------------*/ 00432 VOID SetFrInfoToFace(STB_INT32 TrackingNum,STB_FR_RES *frInfo,FaceObj *faces) 00433 { 00434 STB_INT32 i,j; 00435 00436 for( i = 0 ; i < TrackingNum; i++) 00437 { 00438 for( j = 0 ; j < TrackingNum; j++) 00439 { 00440 if(frInfo->frFace[j].nTraID == faces[i].nTraID) 00441 { 00442 faces[i].frStatus = frInfo->frFace[j].frRecog.status ; 00443 faces[i].frVal = frInfo->frFace[j].frRecog.value ; 00444 faces[i].frConf = frInfo->frFace[j].frRecog.conf ; 00445 break; 00446 } 00447 } 00448 } 00449 return; 00450 }
Generated on Fri Jul 15 2022 01:15:47 by 1.7.2