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 26 09:19:48 2017 +0000
Revision:
7:85ba09eb46b3
Parent:
6:8c0c70710090
Child:
8:92c19be0aced
The number of STB retries has been changed

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