Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: GraphicsFramework GR-PEACH_video LCD_shield_config AsciiFont R_BSP USBHost_custom
Diff: recognition_proc/recognition_proc.cpp
- Revision:
- 5:49a61433290a
- Parent:
- 3:0760680f06d8
- Child:
- 6:8c0c70710090
diff -r 55e0d1f4e55a -r 49a61433290a recognition_proc/recognition_proc.cpp
--- a/recognition_proc/recognition_proc.cpp Tue Aug 08 04:50:44 2017 +0000
+++ b/recognition_proc/recognition_proc.cpp Tue Sep 05 10:01:51 2017 +0000
@@ -5,6 +5,7 @@
#include "USBHostSerial.h"
#include "LCD_shield_config_4_3inch.h"
#include "recognition_proc.h"
+#include "STBWrap.h"
#define UART_SETTING_TIMEOUT 1000 /* HVC setting command signal timeout period */
#define UART_REGIST_EXECUTE_TIMEOUT 7000 /* HVC registration command signal timeout period */
@@ -15,6 +16,16 @@
#define ERROR_02 "Error: Number of detected faces is 2 or more"
+#define STB_RETRYCOUNT_DEFAULT 25 /* Retry Count for STB */
+#define STB_POSSTEADINESS_DEFAULT 30 /* Position Steadiness for STB */
+#define STB_SIZESTEADINESS_DEFAULT 30 /* Size Steadiness for STB */
+#define STB_PE_FRAME_DEFAULT 10 /* Complete Frame Count for property estimation in STB */
+#define STB_PE_ANGLEUDMIN_DEFAULT -15 /* Up/Down face angle minimum value for property estimation in STB */
+#define STB_PE_ANGLEUDMAX_DEFAULT 20 /* Up/Down face angle maximum value for property estimation in STB */
+#define STB_PE_ANGLELRMIN_DEFAULT -20 /* Left/Right face angle minimum value for property estimation in STB */
+#define STB_PE_ANGLELRMAX_DEFAULT 20 /* Left/Right face angle maximum value for property estimation in STB */
+#define STB_PE_THRESHOLD_DEFAULT 300 /* Threshold for property estimation in STB */
+
#define DISP_PIXEL_WIDTH (320)
#define DISP_PIXEL_HEIGHT (240)
@@ -272,6 +283,13 @@
UINT8 status;
HVC_VERSION version;
HVC_RESULT *pHVCResult = NULL;
+
+ int nSTBFaceCount;
+ STB_FACE *pSTBFaceResult;
+ int nSTBBodyCount;
+ STB_BODY *pSTBBodyResult;
+ int nIndex;
+
HVC_IMAGE *pImage = NULL;
INT32 execFlag;
INT32 imageNo;
@@ -282,6 +300,7 @@
uint32_t i;
char Str_disp[32];
Timer resp_time;
+ INT32 TrackingID;
/* Register the button */
button.fall(&button_fall);
@@ -298,6 +317,13 @@
mbed_die();
}
+ /* STB Initialize */
+ ret = STB_Init(STB_FUNC_BD | STB_FUNC_DT | STB_FUNC_PT | STB_FUNC_AG | STB_FUNC_GN);
+ if (ret != 0) {
+ printf("STB_Init Error : %d\n", ret);
+ mbed_die();
+ }
+
/* Image Structure allocation */
pImage = (HVC_IMAGE *)malloc(sizeof(HVC_IMAGE));
if (pImage == NULL) {
@@ -364,6 +390,17 @@
if ((ret != 0) || (status != 0)) {
break;
}
+
+ /* Set STB Parameters */
+ ret = STB_SetTrParam(STB_RETRYCOUNT_DEFAULT, STB_POSSTEADINESS_DEFAULT, STB_SIZESTEADINESS_DEFAULT);
+ if (ret != 0) {
+ break;
+ }
+ ret = STB_SetPeParam(STB_PE_THRESHOLD_DEFAULT, STB_PE_ANGLEUDMIN_DEFAULT, STB_PE_ANGLEUDMAX_DEFAULT,
+ STB_PE_ANGLELRMIN_DEFAULT, STB_PE_ANGLELRMAX_DEFAULT, STB_PE_FRAME_DEFAULT);
+ if (ret != 0) {
+ break;
+ }
}
/* Execute Registration */
@@ -407,11 +444,52 @@
if ((execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
execFlag &= ~(HVC_ACTIV_AGE_ESTIMATION | HVC_ACTIV_GENDER_ESTIMATION | HVC_ACTIV_EXPRESSION_ESTIMATION);
}
+ if (execFlag != 0) { // for STB
+ execFlag |= HVC_ACTIV_FACE_DIRECTION;
+ }
imageNo = imageNo_setting;
resp_time.reset();
resp_time.start();
ret = HVC_ExecuteEx(UART_EXECUTE_TIMEOUT, execFlag, imageNo, pHVCResult, &status);
resp_time.stop();
+
+ /* STB */
+ if (STB_Exec(pHVCResult->executedFunc, pHVCResult, &nSTBFaceCount, &pSTBFaceResult, &nSTBBodyCount, &pSTBBodyResult) == 0) {
+ for ( i = 0; i < nSTBBodyCount; i++ )
+ {
+ if ( pHVCResult->bdResult.num <= i ) break;
+
+ nIndex = pSTBBodyResult[i].nDetectID;
+ pHVCResult->bdResult.bdResult[nIndex].posX = (short)pSTBBodyResult[i].center.x;
+ pHVCResult->bdResult.bdResult[nIndex].posY = (short)pSTBBodyResult[i].center.y;
+ pHVCResult->bdResult.bdResult[nIndex].size = pSTBBodyResult[i].nSize;
+ }
+ for (i = 0; i < nSTBFaceCount; i++)
+ {
+ if (pHVCResult->fdResult.num <= i) break;
+
+ nIndex = pSTBFaceResult[i].nDetectID;
+ pHVCResult->fdResult.fcResult[nIndex].dtResult.posX = (short)pSTBFaceResult[i].center.x;
+ pHVCResult->fdResult.fcResult[nIndex].dtResult.posY = (short)pSTBFaceResult[i].center.y;
+ pHVCResult->fdResult.fcResult[nIndex].dtResult.size = pSTBFaceResult[i].nSize;
+
+ if (pHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION) {
+ pHVCResult->fdResult.fcResult[nIndex].ageResult.confidence += 10000; // During
+ if (pSTBFaceResult[i].age.status >= STB_STATUS_COMPLETE) {
+ pHVCResult->fdResult.fcResult[nIndex].ageResult.age = pSTBFaceResult[i].age.value;
+ pHVCResult->fdResult.fcResult[nIndex].ageResult.confidence += 10000; // Complete
+ }
+ }
+ if (pHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION) {
+ pHVCResult->fdResult.fcResult[nIndex].genderResult.confidence += 10000; // During
+ if (pSTBFaceResult[i].gender.status >= STB_STATUS_COMPLETE) {
+ pHVCResult->fdResult.fcResult[nIndex].genderResult.gender = pSTBFaceResult[i].gender.value;
+ pHVCResult->fdResult.fcResult[nIndex].genderResult.confidence += 10000; // Complete
+ }
+ }
+ }
+ }
+
if ((ret == 0) && (status == 0)) {
if (imageNo == HVC_EXECUTE_IMAGE_QVGA_HALF) {
DrawImage(0, 0, pHVCResult->image.width, pHVCResult->image.height, pHVCResult->image.image, 2);
@@ -452,34 +530,53 @@
pHVCResult->fdResult.fcResult[i].dtResult.size,
detection_colour);
}
+ TrackingID = 0;
+ for (int j = 0; j < nSTBFaceCount; j++)
+ {
+ if (pSTBFaceResult[j].nDetectID == i) {
+ TrackingID = pSTBFaceResult[j].nTrackingID;
+ break;
+ }
+ }
+ memset(Str_disp, 0, sizeof(Str_disp));
if (pHVCResult->executedFunc & HVC_ACTIV_FACE_RECOGNITION) {
/* Recognition */
- if (-128 == pHVCResult->fdResult.fcResult[i].recognitionResult.uid) {
- DrawString("Not possible", 0x0000f0ff);
- } else if (pHVCResult->fdResult.fcResult[i].recognitionResult.uid < 0) {
- DrawString("Not registered", 0x0000f0ff);
+ if (pHVCResult->fdResult.fcResult[i].recognitionResult.uid < 0) {
+ sprintf(Str_disp, "ID:%d", TrackingID);
} else {
- memset(Str_disp, 0, sizeof(Str_disp));
sprintf(Str_disp, "USER%03d", pHVCResult->fdResult.fcResult[i].recognitionResult.uid + 1);
- DrawString(Str_disp, 0x0000f0ff);
}
+ } else {
+ sprintf(Str_disp, "ID:%d", TrackingID);
}
+ DrawString(Str_disp, 0x0000f0ff);
if (pHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION) {
/* Age */
if (-128 != pHVCResult->fdResult.fcResult[i].ageResult.age) {
memset(Str_disp, 0, sizeof(Str_disp));
sprintf(Str_disp, "Age:%d", pHVCResult->fdResult.fcResult[i].ageResult.age);
+ if (pHVCResult->fdResult.fcResult[i].ageResult.confidence < 20000) {
+ strcat(Str_disp, " (?)");
+ }
DrawString(Str_disp, 0x0000f0ff);
}
}
if (pHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION) {
/* Gender */
if (-128 != pHVCResult->fdResult.fcResult[i].genderResult.gender) {
+ uint32_t wk_color;
+ memset(Str_disp, 0, sizeof(Str_disp));
if (1 == pHVCResult->fdResult.fcResult[i].genderResult.gender) {
- DrawString("Male", 0x0000fff4);
+ sprintf(Str_disp, "Male");
+ wk_color = 0x0000fff4;
} else {
- DrawString("Female", 0x00006dff);
+ sprintf(Str_disp, "Female");
+ wk_color = 0x00006dff;
}
+ if ( pHVCResult->fdResult.fcResult[i].genderResult.confidence < 20000 ) {
+ strcat(Str_disp, " (?)");
+ }
+ DrawString(Str_disp, wk_color);
}
}
if (pHVCResult->executedFunc & HVC_ACTIV_EXPRESSION_ESTIMATION) {