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

Dependencies:   AsciiFont

Information

Please see here for Japanese version.
日本語版はこちらを参照ください。

What is this ?

This is a sample that runs OMRON HVC-P2 with GR-PEACH. In this sample, you can try following among the functions of HVC-P2 : Human Body Detection, Face Detection, Age Estimation, Gender Estimation, Expression Estimation and Face Recognition.
Both GR-PEACH and HVC-P2 use Renesas RZ/A1H included ARM® Cortex™-A9 processor.

/media/uploads/dkato/hvcp2_demo_img3.jpg

HVC-P2 (Human Vision Components B5T-007001) is a human-sensing component that recognizes people. It is an integrated module that is built into other device and provides both the OKAO Vision's ten types of image sensing and a camera module.
For details, please refer to the following link.

In the HVCApi folder of this sample, the code of the following link destination Sample Code "SampleCode_rev.2.0.2" is used. (You can download from "Product Information" -> "Sample Code" in the middle of the following page.)
http://www.omron.com/ecb/products/mobile/hvc_p2/

Constitution

  1. HVC-P2 x 1
  2. USBA-microUSB conversion cable x 2
  3. USBA-microUSB conversion adapter x 1
  4. GR-PEACH x 1
  5. 4.3inc LCD shield x 1

/media/uploads/dkato/composition_hvcp2_demo.jpg

/media/uploads/dkato/composition_hvcp2_demo_2.jpg

Please close JP3 of GR-PEACH.
/media/uploads/RyoheiHagimoto/usb.jpg

How to use

It starts when connecting the power supply USB cable. At startup, all functions are turned off. By pressing the button on the right of the screen you can switch the function on / off.

  • Function ON : orange or green
  • Function OFF : blue or gray

Only the FACE button changes to "FACE (blue) -> FACE (orange) -> RECOGNITION (green)". When FACE (blue), following buttons are gray and can not be operated : AGE, GENDER and EXPRESSION.
"Response time" at the bottom left of the screen indicates "image processing + USB transfer time". It is not pure image processing time.

Register Data (Face Recognition)

Set the FACE button to RECOGNITION (green), and touch the screen with one person on the screen to register the face. In this sample, face registration will record up to 10 people. Delete the old registrant when registering after 11 people. Registration information is stored in the RAM on the HVC-P2 side. It is discarded by power off and reset.

/media/uploads/dkato/hvcp2_demo_img2.jpg

Change parameters

When you press Config icon at the bottom right of the screen, the parameter setting screen is displayed. You can change threshold value, detection size and face angle parameters.

/media/uploads/dkato/hvcp2_demo_config_icon.jpg
/media/uploads/dkato/hvcp2_demo_config.jpg

Change transfer image size

By pressing USER_BUTTON0 on the back of the board, the image transfer size switches in the order of "160 x 120 -> 320 x 240 -> no image".
/media/uploads/dkato/gr-peach_switch2.jpg

Committer:
dkato
Date:
Tue Sep 05 10:01:51 2017 +0000
Revision:
5:49a61433290a
Parent:
3:0760680f06d8
Child:
6:8c0c70710090
Add HVC sensing result stabilizing library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:f5de229c9a00 1 #include "mbed.h"
dkato 0:f5de229c9a00 2 #include "DisplayBace.h"
dkato 0:f5de229c9a00 3 #include "rtos.h"
dkato 0:f5de229c9a00 4 #include "AsciiFont.h"
dkato 0:f5de229c9a00 5 #include "USBHostSerial.h"
dkato 0:f5de229c9a00 6 #include "LCD_shield_config_4_3inch.h"
dkato 0:f5de229c9a00 7 #include "recognition_proc.h"
dkato 5:49a61433290a 8 #include "STBWrap.h"
dkato 0:f5de229c9a00 9
dkato 0:f5de229c9a00 10 #define UART_SETTING_TIMEOUT 1000 /* HVC setting command signal timeout period */
dkato 0:f5de229c9a00 11 #define UART_REGIST_EXECUTE_TIMEOUT 7000 /* HVC registration command signal timeout period */
dkato 0:f5de229c9a00 12 #define UART_EXECUTE_TIMEOUT 10000 /* HVC execute command signal timeout period */
dkato 0:f5de229c9a00 13
dkato 3:0760680f06d8 14 #define SENSOR_ROLL_ANGLE_DEFAULT 0 /* Camera angle setting */
dkato 0:f5de229c9a00 15 #define USER_ID_NUM_MAX 10
dkato 0:f5de229c9a00 16
dkato 1:11be006960b1 17 #define ERROR_02 "Error: Number of detected faces is 2 or more"
dkato 1:11be006960b1 18
dkato 5:49a61433290a 19 #define STB_RETRYCOUNT_DEFAULT 25 /* Retry Count for STB */
dkato 5:49a61433290a 20 #define STB_POSSTEADINESS_DEFAULT 30 /* Position Steadiness for STB */
dkato 5:49a61433290a 21 #define STB_SIZESTEADINESS_DEFAULT 30 /* Size Steadiness for STB */
dkato 5:49a61433290a 22 #define STB_PE_FRAME_DEFAULT 10 /* Complete Frame Count for property estimation in STB */
dkato 5:49a61433290a 23 #define STB_PE_ANGLEUDMIN_DEFAULT -15 /* Up/Down face angle minimum value for property estimation in STB */
dkato 5:49a61433290a 24 #define STB_PE_ANGLEUDMAX_DEFAULT 20 /* Up/Down face angle maximum value for property estimation in STB */
dkato 5:49a61433290a 25 #define STB_PE_ANGLELRMIN_DEFAULT -20 /* Left/Right face angle minimum value for property estimation in STB */
dkato 5:49a61433290a 26 #define STB_PE_ANGLELRMAX_DEFAULT 20 /* Left/Right face angle maximum value for property estimation in STB */
dkato 5:49a61433290a 27 #define STB_PE_THRESHOLD_DEFAULT 300 /* Threshold for property estimation in STB */
dkato 5:49a61433290a 28
dkato 0:f5de229c9a00 29 #define DISP_PIXEL_WIDTH (320)
dkato 0:f5de229c9a00 30 #define DISP_PIXEL_HEIGHT (240)
dkato 0:f5de229c9a00 31
dkato 0:f5de229c9a00 32 /*! Frame buffer stride: Frame buffer stride should be set to a multiple of 32 or 128
dkato 0:f5de229c9a00 33 in accordance with the frame buffer burst transfer mode. */
dkato 0:f5de229c9a00 34 /* FRAME BUFFER Parameter GRAPHICS_LAYER_0 */
dkato 0:f5de229c9a00 35 #define FRAME_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:f5de229c9a00 36 #define FRAME_BUFFER_STRIDE (((DISP_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:f5de229c9a00 37
dkato 0:f5de229c9a00 38 /* RESULT BUFFER Parameter GRAPHICS_LAYER_1 */
dkato 0:f5de229c9a00 39 #define RESULT_BUFFER_BYTE_PER_PIXEL (2u)
dkato 0:f5de229c9a00 40 #define RESULT_BUFFER_STRIDE (((DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
dkato 0:f5de229c9a00 41
dkato 0:f5de229c9a00 42 static bool registrationr_req = false;
dkato 0:f5de229c9a00 43 static bool setting_req = false;
dkato 0:f5de229c9a00 44 static recognition_setting_t setting = {
dkato 0:f5de229c9a00 45 0,
dkato 0:f5de229c9a00 46 { BODY_THRESHOLD_DEFAULT, HAND_THRESHOLD_DEFAULT, FACE_THRESHOLD_DEFAULT, REC_THRESHOLD_DEFAULT},
dkato 0:f5de229c9a00 47 { BODY_SIZE_RANGE_MIN_DEFAULT, BODY_SIZE_RANGE_MAX_DEFAULT, HAND_SIZE_RANGE_MIN_DEFAULT,
dkato 0:f5de229c9a00 48 HAND_SIZE_RANGE_MAX_DEFAULT, FACE_SIZE_RANGE_MIN_DEFAULT, FACE_SIZE_RANGE_MAX_DEFAULT},
dkato 0:f5de229c9a00 49 FACE_POSE_DEFAULT,
dkato 0:f5de229c9a00 50 FACE_ANGLE_DEFAULT
dkato 0:f5de229c9a00 51 };
dkato 0:f5de229c9a00 52 static USBHostSerial serial;
dkato 0:f5de229c9a00 53 static InterruptIn button(USER_BUTTON0);
dkato 0:f5de229c9a00 54
dkato 0:f5de229c9a00 55 #if defined(__ICCARM__)
dkato 0:f5de229c9a00 56 /* 32 bytes aligned */
dkato 0:f5de229c9a00 57 #pragma data_alignment=32
dkato 0:f5de229c9a00 58 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * DISP_PIXEL_HEIGHT]@ ".mirrorram";
dkato 0:f5de229c9a00 59 #pragma data_alignment=32
dkato 0:f5de229c9a00 60 static uint8_t user_frame_buffer_result[RESULT_BUFFER_STRIDE * DISP_PIXEL_HEIGHT]@ ".mirrorram";
dkato 0:f5de229c9a00 61 #else
dkato 0:f5de229c9a00 62 /* 32 bytes aligned */
dkato 0:f5de229c9a00 63 static uint8_t user_frame_buffer0[FRAME_BUFFER_STRIDE * DISP_PIXEL_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));
dkato 0:f5de229c9a00 64 static uint8_t user_frame_buffer_result[RESULT_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((section("NC_BSS"),aligned(32)));
dkato 0:f5de229c9a00 65 #endif
dkato 0:f5de229c9a00 66
dkato 0:f5de229c9a00 67 static AsciiFont ascii_font(user_frame_buffer_result, DISP_PIXEL_WIDTH, LCD_PIXEL_HEIGHT,
dkato 0:f5de229c9a00 68 RESULT_BUFFER_STRIDE, RESULT_BUFFER_BYTE_PER_PIXEL, 0x00000090);
dkato 0:f5de229c9a00 69 static INT32 imageNo_setting = HVC_EXECUTE_IMAGE_QVGA_HALF;
dkato 0:f5de229c9a00 70 static int str_draw_x = 0;
dkato 0:f5de229c9a00 71 static int str_draw_y = 0;
dkato 0:f5de229c9a00 72
dkato 0:f5de229c9a00 73 /****** Image Recognition ******/
dkato 0:f5de229c9a00 74 extern "C" int UART_SendData(int inDataSize, UINT8 *inData) {
dkato 0:f5de229c9a00 75 return serial.writeBuf((char *)inData, inDataSize);
dkato 0:f5de229c9a00 76 }
dkato 0:f5de229c9a00 77
dkato 0:f5de229c9a00 78 extern "C" int UART_ReceiveData(int inTimeOutTime, int inDataSize, UINT8 *outResult) {
dkato 0:f5de229c9a00 79 return serial.readBuf((char *)outResult, inDataSize, inTimeOutTime);
dkato 0:f5de229c9a00 80 }
dkato 0:f5de229c9a00 81
dkato 0:f5de229c9a00 82 void SetRegistrationrReq(void) {
dkato 0:f5de229c9a00 83 registrationr_req = true;
dkato 0:f5de229c9a00 84 }
dkato 0:f5de229c9a00 85
dkato 0:f5de229c9a00 86 void SetSettingReq(void) {
dkato 0:f5de229c9a00 87 setting_req = true;
dkato 0:f5de229c9a00 88 }
dkato 0:f5de229c9a00 89
dkato 0:f5de229c9a00 90 recognition_setting_t * GetRecognitionSettingPointer(void) {
dkato 0:f5de229c9a00 91 return &setting;
dkato 0:f5de229c9a00 92 }
dkato 0:f5de229c9a00 93
dkato 0:f5de229c9a00 94 static void EraseImage(void) {
dkato 0:f5de229c9a00 95 uint32_t i = 0;
dkato 0:f5de229c9a00 96 while (i < sizeof(user_frame_buffer0)) {
dkato 0:f5de229c9a00 97 user_frame_buffer0[i++] = 0x10;
dkato 0:f5de229c9a00 98 user_frame_buffer0[i++] = 0x80;
dkato 0:f5de229c9a00 99 }
dkato 0:f5de229c9a00 100 }
dkato 0:f5de229c9a00 101
dkato 0:f5de229c9a00 102 static void DrawImage(int x, int y, int nWidth, int nHeight, UINT8 *unImageBuffer, int magnification) {
dkato 0:f5de229c9a00 103 int idx_base;
dkato 0:f5de229c9a00 104 int idx_w = 0;
dkato 0:f5de229c9a00 105 int wk_tmp = 0;
dkato 0:f5de229c9a00 106 int i;
dkato 0:f5de229c9a00 107 int j;
dkato 0:f5de229c9a00 108 int k;
dkato 0:f5de229c9a00 109 int idx_r = 0;
dkato 0:f5de229c9a00 110
dkato 0:f5de229c9a00 111 if (magnification <= 0) {
dkato 0:f5de229c9a00 112 return;
dkato 0:f5de229c9a00 113 }
dkato 0:f5de229c9a00 114
dkato 0:f5de229c9a00 115 idx_base = (x + (DISP_PIXEL_WIDTH * y)) * RESULT_BUFFER_BYTE_PER_PIXEL;
dkato 0:f5de229c9a00 116
dkato 0:f5de229c9a00 117 for (i = 0; i < nHeight; i++) {
dkato 0:f5de229c9a00 118 idx_w = idx_base + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * i) * magnification;
dkato 0:f5de229c9a00 119 wk_tmp = idx_w;
dkato 0:f5de229c9a00 120 for (j = 0; j < nWidth; j++) {
dkato 0:f5de229c9a00 121 for (k = 0; k < magnification; k++) {
dkato 0:f5de229c9a00 122 user_frame_buffer0[idx_w] = unImageBuffer[idx_r];
dkato 0:f5de229c9a00 123 idx_w += 2;
dkato 0:f5de229c9a00 124 }
dkato 0:f5de229c9a00 125 idx_r++;
dkato 0:f5de229c9a00 126 }
dkato 3:0760680f06d8 127 for (k = 1; k < magnification; k++) {
dkato 3:0760680f06d8 128 memcpy(&user_frame_buffer0[wk_tmp + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * k)], &user_frame_buffer0[wk_tmp], idx_w - wk_tmp);
dkato 0:f5de229c9a00 129 }
dkato 0:f5de229c9a00 130 }
dkato 0:f5de229c9a00 131 }
dkato 0:f5de229c9a00 132
dkato 0:f5de229c9a00 133 static void DrawSquare(int x, int y, int size, uint32_t const colour) {
dkato 0:f5de229c9a00 134 int wk_x;
dkato 0:f5de229c9a00 135 int wk_y;
dkato 0:f5de229c9a00 136 int wk_w = 0;
dkato 0:f5de229c9a00 137 int wk_h = 0;
dkato 0:f5de229c9a00 138 int idx_base;
dkato 0:f5de229c9a00 139 int wk_idx;
dkato 0:f5de229c9a00 140 int i;
dkato 0:f5de229c9a00 141 int j;
dkato 0:f5de229c9a00 142 uint8_t coller_pix[RESULT_BUFFER_BYTE_PER_PIXEL]; /* ARGB4444 */
dkato 0:f5de229c9a00 143 bool l_draw = true;
dkato 0:f5de229c9a00 144 bool r_draw = true;
dkato 0:f5de229c9a00 145 bool t_draw = true;
dkato 0:f5de229c9a00 146 bool b_draw = true;
dkato 0:f5de229c9a00 147
dkato 0:f5de229c9a00 148 if ((x - (size / 2)) < 0) {
dkato 0:f5de229c9a00 149 l_draw = false;
dkato 0:f5de229c9a00 150 wk_w += x;
dkato 0:f5de229c9a00 151 wk_x = 0;
dkato 0:f5de229c9a00 152 } else {
dkato 0:f5de229c9a00 153 wk_w += (size / 2);
dkato 0:f5de229c9a00 154 wk_x = x - (size / 2);
dkato 0:f5de229c9a00 155 }
dkato 0:f5de229c9a00 156
dkato 0:f5de229c9a00 157 if ((x + (size / 2)) >= 1600) {
dkato 0:f5de229c9a00 158 r_draw = false;
dkato 0:f5de229c9a00 159 wk_w += (1600 - x);
dkato 0:f5de229c9a00 160 } else {
dkato 0:f5de229c9a00 161 wk_w += (size / 2);
dkato 0:f5de229c9a00 162 }
dkato 0:f5de229c9a00 163
dkato 0:f5de229c9a00 164 if ((y - (size / 2)) < 0) {
dkato 0:f5de229c9a00 165 t_draw = false;
dkato 0:f5de229c9a00 166 wk_h += y;
dkato 0:f5de229c9a00 167 wk_y = 0;
dkato 0:f5de229c9a00 168 } else {
dkato 0:f5de229c9a00 169 wk_h += (size / 2);
dkato 0:f5de229c9a00 170 wk_y = y - (size / 2);
dkato 0:f5de229c9a00 171 }
dkato 0:f5de229c9a00 172
dkato 0:f5de229c9a00 173 if ((y + (size / 2)) >= 1200) {
dkato 0:f5de229c9a00 174 b_draw = false;
dkato 0:f5de229c9a00 175 wk_h += (1200 - y);
dkato 0:f5de229c9a00 176 } else {
dkato 0:f5de229c9a00 177 wk_h += (size / 2);
dkato 0:f5de229c9a00 178 }
dkato 0:f5de229c9a00 179
dkato 0:f5de229c9a00 180 wk_x = wk_x / 5;
dkato 0:f5de229c9a00 181 wk_y = wk_y / 5;
dkato 0:f5de229c9a00 182 wk_w = wk_w / 5;
dkato 0:f5de229c9a00 183 wk_h = wk_h / 5;
dkato 0:f5de229c9a00 184
dkato 0:f5de229c9a00 185 if ((colour == 0x0000f0f0) || (colour == 0x0000fff4)) {
dkato 0:f5de229c9a00 186 str_draw_x = wk_x;
dkato 0:f5de229c9a00 187 str_draw_y = wk_y + wk_h + 1;
dkato 0:f5de229c9a00 188 }
dkato 0:f5de229c9a00 189
dkato 0:f5de229c9a00 190 idx_base = (wk_x + (DISP_PIXEL_WIDTH * wk_y)) * RESULT_BUFFER_BYTE_PER_PIXEL;
dkato 0:f5de229c9a00 191
dkato 0:f5de229c9a00 192 /* Select color */
dkato 0:f5de229c9a00 193 coller_pix[0] = (colour >> 8) & 0xff; /* 4:Green 4:Blue */
dkato 0:f5de229c9a00 194 coller_pix[1] = colour & 0xff; /* 4:Alpha 4:Red */
dkato 0:f5de229c9a00 195
dkato 0:f5de229c9a00 196 /* top */
dkato 0:f5de229c9a00 197 if (t_draw) {
dkato 0:f5de229c9a00 198 wk_idx = idx_base;
dkato 0:f5de229c9a00 199 for (j = 0; j < wk_w; j++) {
dkato 0:f5de229c9a00 200 user_frame_buffer_result[wk_idx++] = coller_pix[0];
dkato 0:f5de229c9a00 201 user_frame_buffer_result[wk_idx++] = coller_pix[1];
dkato 0:f5de229c9a00 202 }
dkato 0:f5de229c9a00 203 }
dkato 0:f5de229c9a00 204
dkato 0:f5de229c9a00 205 /* middle */
dkato 0:f5de229c9a00 206 for (i = 1; i < (wk_h - 1); i++) {
dkato 0:f5de229c9a00 207 wk_idx = idx_base + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * i);
dkato 0:f5de229c9a00 208 if (l_draw) {
dkato 0:f5de229c9a00 209 user_frame_buffer_result[wk_idx + 0] = coller_pix[0];
dkato 0:f5de229c9a00 210 user_frame_buffer_result[wk_idx + 1] = coller_pix[1];
dkato 0:f5de229c9a00 211 }
dkato 0:f5de229c9a00 212 wk_idx += (wk_w - 1) * 2;
dkato 0:f5de229c9a00 213 if (r_draw) {
dkato 0:f5de229c9a00 214 user_frame_buffer_result[wk_idx + 0] = coller_pix[0];
dkato 0:f5de229c9a00 215 user_frame_buffer_result[wk_idx + 1] = coller_pix[1];
dkato 0:f5de229c9a00 216 }
dkato 0:f5de229c9a00 217 }
dkato 0:f5de229c9a00 218
dkato 0:f5de229c9a00 219 /* bottom */
dkato 0:f5de229c9a00 220 if (b_draw) {
dkato 0:f5de229c9a00 221 wk_idx = idx_base + (DISP_PIXEL_WIDTH * RESULT_BUFFER_BYTE_PER_PIXEL * (wk_h - 1));
dkato 0:f5de229c9a00 222 for (j = 0; j < wk_w; j++) {
dkato 0:f5de229c9a00 223 user_frame_buffer_result[wk_idx++] = coller_pix[0];
dkato 0:f5de229c9a00 224 user_frame_buffer_result[wk_idx++] = coller_pix[1];
dkato 0:f5de229c9a00 225 }
dkato 0:f5de229c9a00 226 }
dkato 0:f5de229c9a00 227 }
dkato 0:f5de229c9a00 228
dkato 0:f5de229c9a00 229 static void DrawString(const char * str, uint32_t const colour) {
dkato 0:f5de229c9a00 230 ascii_font.Erase(0x00000090, str_draw_x, str_draw_y,
dkato 0:f5de229c9a00 231 (AsciiFont::CHAR_PIX_WIDTH * strlen(str) + 2),
dkato 0:f5de229c9a00 232 (AsciiFont::CHAR_PIX_HEIGHT + 2));
dkato 0:f5de229c9a00 233 ascii_font.DrawStr(str, str_draw_x + 1, str_draw_y + 1, colour, 1);
dkato 0:f5de229c9a00 234 str_draw_y += AsciiFont::CHAR_PIX_HEIGHT + 1;
dkato 0:f5de229c9a00 235 }
dkato 0:f5de229c9a00 236
dkato 0:f5de229c9a00 237 static void button_fall(void) {
dkato 0:f5de229c9a00 238 if (imageNo_setting == HVC_EXECUTE_IMAGE_NONE) {
dkato 0:f5de229c9a00 239 imageNo_setting = HVC_EXECUTE_IMAGE_QVGA_HALF;
dkato 0:f5de229c9a00 240 } else if (imageNo_setting == HVC_EXECUTE_IMAGE_QVGA_HALF) {
dkato 0:f5de229c9a00 241 imageNo_setting = HVC_EXECUTE_IMAGE_QVGA;
dkato 0:f5de229c9a00 242 } else {
dkato 0:f5de229c9a00 243 imageNo_setting = HVC_EXECUTE_IMAGE_NONE;
dkato 0:f5de229c9a00 244 }
dkato 0:f5de229c9a00 245 }
dkato 0:f5de229c9a00 246
dkato 0:f5de229c9a00 247 void init_recognition_layers(DisplayBase * p_display) {
dkato 0:f5de229c9a00 248 DisplayBase::rect_t rect;
dkato 0:f5de229c9a00 249
dkato 0:f5de229c9a00 250 /* The layer by which the image is drawn */
dkato 0:f5de229c9a00 251 rect.vs = 0;
dkato 0:f5de229c9a00 252 rect.vw = DISP_PIXEL_HEIGHT;
dkato 0:f5de229c9a00 253 rect.hs = 0;
dkato 0:f5de229c9a00 254 rect.hw = DISP_PIXEL_WIDTH;
dkato 0:f5de229c9a00 255 p_display->Graphics_Read_Setting(
dkato 0:f5de229c9a00 256 DisplayBase::GRAPHICS_LAYER_0,
dkato 0:f5de229c9a00 257 (void *)user_frame_buffer0,
dkato 0:f5de229c9a00 258 FRAME_BUFFER_STRIDE,
dkato 0:f5de229c9a00 259 DisplayBase::GRAPHICS_FORMAT_YCBCR422,
dkato 0:f5de229c9a00 260 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:f5de229c9a00 261 &rect
dkato 0:f5de229c9a00 262 );
dkato 0:f5de229c9a00 263 p_display->Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
dkato 0:f5de229c9a00 264
dkato 0:f5de229c9a00 265 /* The layer by which the image recognition is drawn */
dkato 0:f5de229c9a00 266 rect.vs = 0;
dkato 0:f5de229c9a00 267 rect.vw = LCD_PIXEL_HEIGHT;
dkato 0:f5de229c9a00 268 rect.hs = 0;
dkato 0:f5de229c9a00 269 rect.hw = DISP_PIXEL_WIDTH;
dkato 0:f5de229c9a00 270 p_display->Graphics_Read_Setting(
dkato 0:f5de229c9a00 271 DisplayBase::GRAPHICS_LAYER_1,
dkato 0:f5de229c9a00 272 (void *)user_frame_buffer_result,
dkato 0:f5de229c9a00 273 RESULT_BUFFER_STRIDE,
dkato 0:f5de229c9a00 274 DisplayBase::GRAPHICS_FORMAT_ARGB4444,
dkato 0:f5de229c9a00 275 DisplayBase::WR_RD_WRSWA_32_16BIT,
dkato 0:f5de229c9a00 276 &rect
dkato 0:f5de229c9a00 277 );
dkato 0:f5de229c9a00 278 p_display->Graphics_Start(DisplayBase::GRAPHICS_LAYER_1);
dkato 0:f5de229c9a00 279 }
dkato 0:f5de229c9a00 280
dkato 0:f5de229c9a00 281 void recognition_task(DisplayBase * p_display) {
dkato 0:f5de229c9a00 282 INT32 ret = 0;
dkato 0:f5de229c9a00 283 UINT8 status;
dkato 0:f5de229c9a00 284 HVC_VERSION version;
dkato 0:f5de229c9a00 285 HVC_RESULT *pHVCResult = NULL;
dkato 5:49a61433290a 286
dkato 5:49a61433290a 287 int nSTBFaceCount;
dkato 5:49a61433290a 288 STB_FACE *pSTBFaceResult;
dkato 5:49a61433290a 289 int nSTBBodyCount;
dkato 5:49a61433290a 290 STB_BODY *pSTBBodyResult;
dkato 5:49a61433290a 291 int nIndex;
dkato 5:49a61433290a 292
dkato 0:f5de229c9a00 293 HVC_IMAGE *pImage = NULL;
dkato 0:f5de229c9a00 294 INT32 execFlag;
dkato 0:f5de229c9a00 295 INT32 imageNo;
dkato 0:f5de229c9a00 296 INT32 userID;
dkato 0:f5de229c9a00 297 INT32 next_userID;
dkato 0:f5de229c9a00 298 INT32 dataID;
dkato 0:f5de229c9a00 299 const char *pExStr[] = {"?", "Neutral", "Happiness", "Surprise", "Anger", "Sadness"};
dkato 0:f5de229c9a00 300 uint32_t i;
dkato 3:0760680f06d8 301 char Str_disp[32];
dkato 0:f5de229c9a00 302 Timer resp_time;
dkato 5:49a61433290a 303 INT32 TrackingID;
dkato 0:f5de229c9a00 304
dkato 0:f5de229c9a00 305 /* Register the button */
dkato 0:f5de229c9a00 306 button.fall(&button_fall);
dkato 0:f5de229c9a00 307
dkato 0:f5de229c9a00 308 /* Initializing Recognition layers */
dkato 0:f5de229c9a00 309 EraseImage();
dkato 0:f5de229c9a00 310 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 311 init_recognition_layers(p_display);
dkato 0:f5de229c9a00 312
dkato 0:f5de229c9a00 313 /* Result Structure Allocation */
dkato 0:f5de229c9a00 314 pHVCResult = (HVC_RESULT *)malloc(sizeof(HVC_RESULT));
dkato 0:f5de229c9a00 315 if (pHVCResult == NULL) {
dkato 0:f5de229c9a00 316 printf("Memory Allocation Error : %08x\n", sizeof(HVC_RESULT));
dkato 0:f5de229c9a00 317 mbed_die();
dkato 0:f5de229c9a00 318 }
dkato 0:f5de229c9a00 319
dkato 5:49a61433290a 320 /* STB Initialize */
dkato 5:49a61433290a 321 ret = STB_Init(STB_FUNC_BD | STB_FUNC_DT | STB_FUNC_PT | STB_FUNC_AG | STB_FUNC_GN);
dkato 5:49a61433290a 322 if (ret != 0) {
dkato 5:49a61433290a 323 printf("STB_Init Error : %d\n", ret);
dkato 5:49a61433290a 324 mbed_die();
dkato 5:49a61433290a 325 }
dkato 5:49a61433290a 326
dkato 0:f5de229c9a00 327 /* Image Structure allocation */
dkato 0:f5de229c9a00 328 pImage = (HVC_IMAGE *)malloc(sizeof(HVC_IMAGE));
dkato 0:f5de229c9a00 329 if (pImage == NULL) {
dkato 0:f5de229c9a00 330 printf("Memory Allocation Error : %08x\n", sizeof(HVC_RESULT));
dkato 0:f5de229c9a00 331 mbed_die();
dkato 0:f5de229c9a00 332 }
dkato 0:f5de229c9a00 333
dkato 0:f5de229c9a00 334 while (1) {
dkato 0:f5de229c9a00 335 /* try to connect a serial device */
dkato 0:f5de229c9a00 336 while (!serial.connect()) {
dkato 0:f5de229c9a00 337 Thread::wait(500);
dkato 0:f5de229c9a00 338 }
dkato 0:f5de229c9a00 339 serial.baud(921600);
dkato 0:f5de229c9a00 340 setting_req = true;
dkato 0:f5de229c9a00 341
dkato 0:f5de229c9a00 342 do {
dkato 0:f5de229c9a00 343 /* Initializing variables */
dkato 0:f5de229c9a00 344 next_userID = 0;
dkato 0:f5de229c9a00 345 dataID = 0;
dkato 0:f5de229c9a00 346
dkato 0:f5de229c9a00 347 /* Get Model and Version */
dkato 0:f5de229c9a00 348 ret = HVC_GetVersion(UART_SETTING_TIMEOUT, &version, &status);
dkato 0:f5de229c9a00 349 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 350 break;
dkato 0:f5de229c9a00 351 }
dkato 0:f5de229c9a00 352
dkato 0:f5de229c9a00 353 while (1) {
dkato 0:f5de229c9a00 354 if (!serial.connected()) {
dkato 0:f5de229c9a00 355 break;
dkato 0:f5de229c9a00 356 }
dkato 0:f5de229c9a00 357
dkato 0:f5de229c9a00 358 /* Execute Setting */
dkato 0:f5de229c9a00 359 if (setting_req) {
dkato 0:f5de229c9a00 360 setting_req = false;
dkato 0:f5de229c9a00 361 /* Set Camera Angle */
dkato 0:f5de229c9a00 362 ret = HVC_SetCameraAngle(UART_SETTING_TIMEOUT, SENSOR_ROLL_ANGLE_DEFAULT, &status);
dkato 0:f5de229c9a00 363 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 364 break;
dkato 0:f5de229c9a00 365 }
dkato 0:f5de229c9a00 366 /* Set Threshold Values */
dkato 0:f5de229c9a00 367 ret = HVC_SetThreshold(UART_SETTING_TIMEOUT, &setting.threshold, &status);
dkato 0:f5de229c9a00 368 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 369 break;
dkato 0:f5de229c9a00 370 }
dkato 0:f5de229c9a00 371 ret = HVC_GetThreshold(UART_SETTING_TIMEOUT, &setting.threshold, &status);
dkato 0:f5de229c9a00 372 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 373 break;
dkato 0:f5de229c9a00 374 }
dkato 0:f5de229c9a00 375 /* Set Detection Size */
dkato 0:f5de229c9a00 376 ret = HVC_SetSizeRange(UART_SETTING_TIMEOUT, &setting.sizeRange, &status);
dkato 0:f5de229c9a00 377 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 378 break;
dkato 0:f5de229c9a00 379 }
dkato 0:f5de229c9a00 380 ret = HVC_GetSizeRange(UART_SETTING_TIMEOUT, &setting.sizeRange, &status);
dkato 0:f5de229c9a00 381 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 382 break;
dkato 0:f5de229c9a00 383 }
dkato 0:f5de229c9a00 384 /* Set Face Angle */
dkato 0:f5de229c9a00 385 ret = HVC_SetFaceDetectionAngle(UART_SETTING_TIMEOUT, setting.pose, setting.angle, &status);
dkato 0:f5de229c9a00 386 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 387 break;
dkato 0:f5de229c9a00 388 }
dkato 0:f5de229c9a00 389 ret = HVC_GetFaceDetectionAngle(UART_SETTING_TIMEOUT, &setting.pose, &setting.angle, &status);
dkato 0:f5de229c9a00 390 if ((ret != 0) || (status != 0)) {
dkato 0:f5de229c9a00 391 break;
dkato 0:f5de229c9a00 392 }
dkato 5:49a61433290a 393
dkato 5:49a61433290a 394 /* Set STB Parameters */
dkato 5:49a61433290a 395 ret = STB_SetTrParam(STB_RETRYCOUNT_DEFAULT, STB_POSSTEADINESS_DEFAULT, STB_SIZESTEADINESS_DEFAULT);
dkato 5:49a61433290a 396 if (ret != 0) {
dkato 5:49a61433290a 397 break;
dkato 5:49a61433290a 398 }
dkato 5:49a61433290a 399 ret = STB_SetPeParam(STB_PE_THRESHOLD_DEFAULT, STB_PE_ANGLEUDMIN_DEFAULT, STB_PE_ANGLEUDMAX_DEFAULT,
dkato 5:49a61433290a 400 STB_PE_ANGLELRMIN_DEFAULT, STB_PE_ANGLELRMAX_DEFAULT, STB_PE_FRAME_DEFAULT);
dkato 5:49a61433290a 401 if (ret != 0) {
dkato 5:49a61433290a 402 break;
dkato 5:49a61433290a 403 }
dkato 0:f5de229c9a00 404 }
dkato 0:f5de229c9a00 405
dkato 0:f5de229c9a00 406 /* Execute Registration */
dkato 0:f5de229c9a00 407 if (registrationr_req) {
dkato 1:11be006960b1 408 int wk_width;
dkato 1:11be006960b1 409
dkato 0:f5de229c9a00 410 if ((pHVCResult->fdResult.num == 1) && (pHVCResult->fdResult.fcResult[0].recognitionResult.uid >= 0)) {
dkato 0:f5de229c9a00 411 userID = pHVCResult->fdResult.fcResult[0].recognitionResult.uid;
dkato 0:f5de229c9a00 412 } else {
dkato 0:f5de229c9a00 413 userID = next_userID;
dkato 0:f5de229c9a00 414 }
dkato 0:f5de229c9a00 415 ret = HVC_Registration(UART_REGIST_EXECUTE_TIMEOUT, userID, dataID, pImage, &status);
dkato 0:f5de229c9a00 416 if ((ret == 0) && (status == 0)) {
dkato 0:f5de229c9a00 417 if (userID == next_userID) {
dkato 0:f5de229c9a00 418 next_userID++;
dkato 0:f5de229c9a00 419 if (next_userID >= USER_ID_NUM_MAX) {
dkato 0:f5de229c9a00 420 next_userID = 0;
dkato 0:f5de229c9a00 421 }
dkato 0:f5de229c9a00 422 }
dkato 0:f5de229c9a00 423 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 424 DrawImage(128, 88, pImage->width, pImage->height, pImage->image, 1);
dkato 0:f5de229c9a00 425 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 426 sprintf(Str_disp, "USER%03d", userID + 1);
dkato 1:11be006960b1 427 wk_width = (AsciiFont::CHAR_PIX_WIDTH * strlen(Str_disp)) + 2;
dkato 0:f5de229c9a00 428 ascii_font.Erase(0x00000090, (DISP_PIXEL_WIDTH - wk_width) / 2, 153, wk_width, (AsciiFont::CHAR_PIX_HEIGHT + 2));
dkato 1:11be006960b1 429 ascii_font.DrawStr(Str_disp, (DISP_PIXEL_WIDTH - wk_width) / 2 + 1, 154, 0x0000ffff, 1);
dkato 0:f5de229c9a00 430 Thread::wait(1200);
dkato 1:11be006960b1 431 } else {
dkato 1:11be006960b1 432 if (status == 0x02) {
dkato 1:11be006960b1 433 wk_width = (AsciiFont::CHAR_PIX_WIDTH * (sizeof(ERROR_02) - 1)) + 4;
dkato 1:11be006960b1 434 ascii_font.Erase(0x00000090, (DISP_PIXEL_WIDTH - wk_width) / 2, 120, wk_width, (AsciiFont::CHAR_PIX_HEIGHT + 3));
dkato 1:11be006960b1 435 ascii_font.DrawStr(ERROR_02, (DISP_PIXEL_WIDTH - wk_width) / 2 + 2, 121, 0x0000ffff, 1);
dkato 1:11be006960b1 436 Thread::wait(1500);
dkato 1:11be006960b1 437 }
dkato 0:f5de229c9a00 438 }
dkato 0:f5de229c9a00 439 registrationr_req = false;
dkato 0:f5de229c9a00 440 }
dkato 0:f5de229c9a00 441
dkato 0:f5de229c9a00 442 /* Execute Detection */
dkato 0:f5de229c9a00 443 execFlag = setting.execFlag;
dkato 0:f5de229c9a00 444 if ((execFlag & HVC_ACTIV_FACE_DETECTION) == 0) {
dkato 0:f5de229c9a00 445 execFlag &= ~(HVC_ACTIV_AGE_ESTIMATION | HVC_ACTIV_GENDER_ESTIMATION | HVC_ACTIV_EXPRESSION_ESTIMATION);
dkato 0:f5de229c9a00 446 }
dkato 5:49a61433290a 447 if (execFlag != 0) { // for STB
dkato 5:49a61433290a 448 execFlag |= HVC_ACTIV_FACE_DIRECTION;
dkato 5:49a61433290a 449 }
dkato 0:f5de229c9a00 450 imageNo = imageNo_setting;
dkato 0:f5de229c9a00 451 resp_time.reset();
dkato 0:f5de229c9a00 452 resp_time.start();
dkato 0:f5de229c9a00 453 ret = HVC_ExecuteEx(UART_EXECUTE_TIMEOUT, execFlag, imageNo, pHVCResult, &status);
dkato 0:f5de229c9a00 454 resp_time.stop();
dkato 5:49a61433290a 455
dkato 5:49a61433290a 456 /* STB */
dkato 5:49a61433290a 457 if (STB_Exec(pHVCResult->executedFunc, pHVCResult, &nSTBFaceCount, &pSTBFaceResult, &nSTBBodyCount, &pSTBBodyResult) == 0) {
dkato 5:49a61433290a 458 for ( i = 0; i < nSTBBodyCount; i++ )
dkato 5:49a61433290a 459 {
dkato 5:49a61433290a 460 if ( pHVCResult->bdResult.num <= i ) break;
dkato 5:49a61433290a 461
dkato 5:49a61433290a 462 nIndex = pSTBBodyResult[i].nDetectID;
dkato 5:49a61433290a 463 pHVCResult->bdResult.bdResult[nIndex].posX = (short)pSTBBodyResult[i].center.x;
dkato 5:49a61433290a 464 pHVCResult->bdResult.bdResult[nIndex].posY = (short)pSTBBodyResult[i].center.y;
dkato 5:49a61433290a 465 pHVCResult->bdResult.bdResult[nIndex].size = pSTBBodyResult[i].nSize;
dkato 5:49a61433290a 466 }
dkato 5:49a61433290a 467 for (i = 0; i < nSTBFaceCount; i++)
dkato 5:49a61433290a 468 {
dkato 5:49a61433290a 469 if (pHVCResult->fdResult.num <= i) break;
dkato 5:49a61433290a 470
dkato 5:49a61433290a 471 nIndex = pSTBFaceResult[i].nDetectID;
dkato 5:49a61433290a 472 pHVCResult->fdResult.fcResult[nIndex].dtResult.posX = (short)pSTBFaceResult[i].center.x;
dkato 5:49a61433290a 473 pHVCResult->fdResult.fcResult[nIndex].dtResult.posY = (short)pSTBFaceResult[i].center.y;
dkato 5:49a61433290a 474 pHVCResult->fdResult.fcResult[nIndex].dtResult.size = pSTBFaceResult[i].nSize;
dkato 5:49a61433290a 475
dkato 5:49a61433290a 476 if (pHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION) {
dkato 5:49a61433290a 477 pHVCResult->fdResult.fcResult[nIndex].ageResult.confidence += 10000; // During
dkato 5:49a61433290a 478 if (pSTBFaceResult[i].age.status >= STB_STATUS_COMPLETE) {
dkato 5:49a61433290a 479 pHVCResult->fdResult.fcResult[nIndex].ageResult.age = pSTBFaceResult[i].age.value;
dkato 5:49a61433290a 480 pHVCResult->fdResult.fcResult[nIndex].ageResult.confidence += 10000; // Complete
dkato 5:49a61433290a 481 }
dkato 5:49a61433290a 482 }
dkato 5:49a61433290a 483 if (pHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION) {
dkato 5:49a61433290a 484 pHVCResult->fdResult.fcResult[nIndex].genderResult.confidence += 10000; // During
dkato 5:49a61433290a 485 if (pSTBFaceResult[i].gender.status >= STB_STATUS_COMPLETE) {
dkato 5:49a61433290a 486 pHVCResult->fdResult.fcResult[nIndex].genderResult.gender = pSTBFaceResult[i].gender.value;
dkato 5:49a61433290a 487 pHVCResult->fdResult.fcResult[nIndex].genderResult.confidence += 10000; // Complete
dkato 5:49a61433290a 488 }
dkato 5:49a61433290a 489 }
dkato 5:49a61433290a 490 }
dkato 5:49a61433290a 491 }
dkato 5:49a61433290a 492
dkato 0:f5de229c9a00 493 if ((ret == 0) && (status == 0)) {
dkato 0:f5de229c9a00 494 if (imageNo == HVC_EXECUTE_IMAGE_QVGA_HALF) {
dkato 0:f5de229c9a00 495 DrawImage(0, 0, pHVCResult->image.width, pHVCResult->image.height, pHVCResult->image.image, 2);
dkato 0:f5de229c9a00 496 } else if (imageNo == HVC_EXECUTE_IMAGE_QVGA) {
dkato 0:f5de229c9a00 497 DrawImage(0, 0, pHVCResult->image.width, pHVCResult->image.height, pHVCResult->image.image, 1);
dkato 0:f5de229c9a00 498 } else {
dkato 0:f5de229c9a00 499 EraseImage();
dkato 0:f5de229c9a00 500 }
dkato 0:f5de229c9a00 501 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 502 if (pHVCResult->executedFunc & HVC_ACTIV_BODY_DETECTION) {
dkato 0:f5de229c9a00 503 /* Body Detection result */
dkato 0:f5de229c9a00 504 for (i = 0; i < pHVCResult->bdResult.num; i++) {
dkato 0:f5de229c9a00 505 DrawSquare(pHVCResult->bdResult.bdResult[i].posX,
dkato 0:f5de229c9a00 506 pHVCResult->bdResult.bdResult[i].posY,
dkato 0:f5de229c9a00 507 pHVCResult->bdResult.bdResult[i].size,
dkato 0:f5de229c9a00 508 0x000000ff);
dkato 0:f5de229c9a00 509 }
dkato 0:f5de229c9a00 510 }
dkato 0:f5de229c9a00 511
dkato 0:f5de229c9a00 512 /* Face Detection result */
dkato 0:f5de229c9a00 513 if (pHVCResult->executedFunc &
dkato 0:f5de229c9a00 514 (HVC_ACTIV_FACE_DETECTION | HVC_ACTIV_FACE_DIRECTION |
dkato 0:f5de229c9a00 515 HVC_ACTIV_AGE_ESTIMATION | HVC_ACTIV_GENDER_ESTIMATION |
dkato 0:f5de229c9a00 516 HVC_ACTIV_GAZE_ESTIMATION | HVC_ACTIV_BLINK_ESTIMATION |
dkato 0:f5de229c9a00 517 HVC_ACTIV_EXPRESSION_ESTIMATION | HVC_ACTIV_FACE_RECOGNITION)){
dkato 0:f5de229c9a00 518 for (i = 0; i < pHVCResult->fdResult.num; i++) {
dkato 0:f5de229c9a00 519 if (pHVCResult->executedFunc & HVC_ACTIV_FACE_DETECTION) {
dkato 0:f5de229c9a00 520 uint32_t detection_colour = 0x0000f0f0; /* green */
dkato 0:f5de229c9a00 521
dkato 0:f5de229c9a00 522 if (pHVCResult->executedFunc & HVC_ACTIV_FACE_RECOGNITION) {
dkato 0:f5de229c9a00 523 if (pHVCResult->fdResult.fcResult[i].recognitionResult.uid >= 0) {
dkato 0:f5de229c9a00 524 detection_colour = 0x0000fff4; /* blue */
dkato 0:f5de229c9a00 525 }
dkato 0:f5de229c9a00 526 }
dkato 0:f5de229c9a00 527 /* Detection */
dkato 0:f5de229c9a00 528 DrawSquare(pHVCResult->fdResult.fcResult[i].dtResult.posX,
dkato 0:f5de229c9a00 529 pHVCResult->fdResult.fcResult[i].dtResult.posY,
dkato 0:f5de229c9a00 530 pHVCResult->fdResult.fcResult[i].dtResult.size,
dkato 0:f5de229c9a00 531 detection_colour);
dkato 0:f5de229c9a00 532 }
dkato 5:49a61433290a 533 TrackingID = 0;
dkato 5:49a61433290a 534 for (int j = 0; j < nSTBFaceCount; j++)
dkato 5:49a61433290a 535 {
dkato 5:49a61433290a 536 if (pSTBFaceResult[j].nDetectID == i) {
dkato 5:49a61433290a 537 TrackingID = pSTBFaceResult[j].nTrackingID;
dkato 5:49a61433290a 538 break;
dkato 5:49a61433290a 539 }
dkato 5:49a61433290a 540 }
dkato 5:49a61433290a 541 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 542 if (pHVCResult->executedFunc & HVC_ACTIV_FACE_RECOGNITION) {
dkato 0:f5de229c9a00 543 /* Recognition */
dkato 5:49a61433290a 544 if (pHVCResult->fdResult.fcResult[i].recognitionResult.uid < 0) {
dkato 5:49a61433290a 545 sprintf(Str_disp, "ID:%d", TrackingID);
dkato 0:f5de229c9a00 546 } else {
dkato 0:f5de229c9a00 547 sprintf(Str_disp, "USER%03d", pHVCResult->fdResult.fcResult[i].recognitionResult.uid + 1);
dkato 0:f5de229c9a00 548 }
dkato 5:49a61433290a 549 } else {
dkato 5:49a61433290a 550 sprintf(Str_disp, "ID:%d", TrackingID);
dkato 0:f5de229c9a00 551 }
dkato 5:49a61433290a 552 DrawString(Str_disp, 0x0000f0ff);
dkato 0:f5de229c9a00 553 if (pHVCResult->executedFunc & HVC_ACTIV_AGE_ESTIMATION) {
dkato 0:f5de229c9a00 554 /* Age */
dkato 0:f5de229c9a00 555 if (-128 != pHVCResult->fdResult.fcResult[i].ageResult.age) {
dkato 0:f5de229c9a00 556 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 557 sprintf(Str_disp, "Age:%d", pHVCResult->fdResult.fcResult[i].ageResult.age);
dkato 5:49a61433290a 558 if (pHVCResult->fdResult.fcResult[i].ageResult.confidence < 20000) {
dkato 5:49a61433290a 559 strcat(Str_disp, " (?)");
dkato 5:49a61433290a 560 }
dkato 0:f5de229c9a00 561 DrawString(Str_disp, 0x0000f0ff);
dkato 0:f5de229c9a00 562 }
dkato 0:f5de229c9a00 563 }
dkato 0:f5de229c9a00 564 if (pHVCResult->executedFunc & HVC_ACTIV_GENDER_ESTIMATION) {
dkato 0:f5de229c9a00 565 /* Gender */
dkato 0:f5de229c9a00 566 if (-128 != pHVCResult->fdResult.fcResult[i].genderResult.gender) {
dkato 5:49a61433290a 567 uint32_t wk_color;
dkato 5:49a61433290a 568 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 569 if (1 == pHVCResult->fdResult.fcResult[i].genderResult.gender) {
dkato 5:49a61433290a 570 sprintf(Str_disp, "Male");
dkato 5:49a61433290a 571 wk_color = 0x0000fff4;
dkato 0:f5de229c9a00 572 } else {
dkato 5:49a61433290a 573 sprintf(Str_disp, "Female");
dkato 5:49a61433290a 574 wk_color = 0x00006dff;
dkato 0:f5de229c9a00 575 }
dkato 5:49a61433290a 576 if ( pHVCResult->fdResult.fcResult[i].genderResult.confidence < 20000 ) {
dkato 5:49a61433290a 577 strcat(Str_disp, " (?)");
dkato 5:49a61433290a 578 }
dkato 5:49a61433290a 579 DrawString(Str_disp, wk_color);
dkato 0:f5de229c9a00 580 }
dkato 0:f5de229c9a00 581 }
dkato 0:f5de229c9a00 582 if (pHVCResult->executedFunc & HVC_ACTIV_EXPRESSION_ESTIMATION) {
dkato 0:f5de229c9a00 583 /* Expression */
dkato 0:f5de229c9a00 584 if (-128 != pHVCResult->fdResult.fcResult[i].expressionResult.score[0]) {
dkato 0:f5de229c9a00 585 uint32_t colour;
dkato 0:f5de229c9a00 586
dkato 0:f5de229c9a00 587 if (pHVCResult->fdResult.fcResult[i].expressionResult.topExpression > EX_SADNESS) {
dkato 0:f5de229c9a00 588 pHVCResult->fdResult.fcResult[i].expressionResult.topExpression = 0;
dkato 0:f5de229c9a00 589 }
dkato 0:f5de229c9a00 590 switch (pHVCResult->fdResult.fcResult[i].expressionResult.topExpression) {
dkato 0:f5de229c9a00 591 case 1: colour = 0x0000ffff; break; /* white */
dkato 0:f5de229c9a00 592 case 2: colour = 0x0000f0ff; break; /* yellow */
dkato 0:f5de229c9a00 593 case 3: colour = 0x000060ff; break; /* orange */
dkato 0:f5de229c9a00 594 case 4: colour = 0x00000fff; break; /* purple */
dkato 0:f5de229c9a00 595 case 5: colour = 0x0000fff4; break; /* blue */
dkato 0:f5de229c9a00 596 default: colour = 0x0000ffff; break; /* white */
dkato 0:f5de229c9a00 597 }
dkato 0:f5de229c9a00 598 DrawString(pExStr[pHVCResult->fdResult.fcResult[i].expressionResult.topExpression], colour);
dkato 0:f5de229c9a00 599 }
dkato 0:f5de229c9a00 600 }
dkato 0:f5de229c9a00 601 }
dkato 0:f5de229c9a00 602 }
dkato 0:f5de229c9a00 603 }
dkato 0:f5de229c9a00 604 /* Response time */
dkato 0:f5de229c9a00 605 memset(Str_disp, 0, sizeof(Str_disp));
dkato 0:f5de229c9a00 606 sprintf(Str_disp, "Response time:%dms", resp_time.read_ms());
dkato 0:f5de229c9a00 607 ascii_font.Erase(0, 0, 0, 0, 0);
dkato 0:f5de229c9a00 608 ascii_font.DrawStr(Str_disp, 0, LCD_PIXEL_HEIGHT - AsciiFont::CHAR_PIX_HEIGHT, 0x0000ffff, 1);
dkato 0:f5de229c9a00 609 }
dkato 0:f5de229c9a00 610 } while(0);
dkato 0:f5de229c9a00 611
dkato 0:f5de229c9a00 612 EraseImage();
dkato 0:f5de229c9a00 613 memset(user_frame_buffer_result, 0, sizeof(user_frame_buffer_result));
dkato 0:f5de229c9a00 614 }
dkato 0:f5de229c9a00 615 }