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:
Fri Sep 28 05:16:44 2018 +0000
Revision:
8:92c19be0aced
Parent:
6:8c0c70710090
Supports mbed-os-5.10

Who changed what in which revision?

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