Sample to operate omron HVC-P2 on GR-PEACH.

Dependencies:   AsciiFont

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers STBFaceInfo.c Source File

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 }