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:
Mon Feb 06 02:59:14 2017 +0000
Revision:
1:11be006960b1
Parent:
0:f5de229c9a00
Child:
3:0760680f06d8
Added error message for face registration.

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