//#DOC Main, program entry and main loop
#include "main.h"
#include <otSerial.h>
#include <otTimer.h>
#include <otPrintf.h>
#include <otCamera.h>
#include <otImageSensor.h>
#include <otImage.h>
#include <otI2cBus.h>
#include <otFILE.h>
#include <otImageDetection.h>
otCamera camera; // Library for the camera control
otImageSensor sensor; // Library for image sensor settings
otImage image; // Image store and processing library
otFILE file; // Library for file access
otImageDetection ai; // Image dtection library
void setup()
{
// Init connection with the console via UART0
UartEnableSignals(UART0);
UartSetBaud(UART0, 115200);
// Init stout used by printf
setStdout(4096, UART0); // printf output is now directed on UART0
// Init the timer for time measure
TimerSetAsCounter(TIMER0);
TimerEnable(TIMER0, true);
// SMB bus init
I2cBusReset();
I2cBusFrequency(100, 30);
// Wait the console has been started
DelayMs(1000); // Wait terminal start
// Init the standard camera based on MT9V032
camera.init(otCamera::CM_STANDARD);
// Init image sensor
if(!sensor.init(otImageSensor::IS_MT9V032, otImageSensor::MT9V03x_00))
{
printf("Can't find image sensor!\n");
IDLE;
}
// Show sensor resolution
printf("Sensor resolution: %dx%d\n", sensor.horPixel(), sensor.verPixel());
printf("Init SD and loading detection definitions\n");
if(!file.init())
{
// Display error message
printf("STATUS: %s\n", file.status());
// Unmount and turn off SD
file.end();
DelayMs(100);
IDLE;
}
if(!ai.init(8, &file))
{
printf("Error on otImageDetection init!\n");
IDLE;
}
sensor.setBinning(4, 4);
image.create(sensor.horPixel(), sensor.verPixel(), 1, otImage::IMG_U8);
}
void loop()
{
U32 et;
// Start measure of time
ElapsedTimeStart(TIMER0);
// Grab an image
camera.grab(image);
// Detect an object if present
U16 objs = ai.detect(&image, 0.0, 1.2, 0.1, 80, 90);
// Get elapsed time
et = ElapsedTimeEnd(TIMER0);
if(objs)
{
int xs, ys, xd, yd;
objs = ai.roiFilter(5.0f);
if(objs)
{
ai.roi(0, xs, ys, xd, yd);
printf("Face[0] : Xs: %d, Ys: %d, Xd: %d, Yd: %d, ET: %u ms\n", xs, ys, xd, yd, et);
}
else
printf("Below minimum threshold, ET: %u ms\n", et);
}
else printf("Not Detected, ET: %u ms\n", et);
}
/* PROGRAM OUTPUT **************************************************************
********************************************************************************
To perform this test an image of a face was placed in front of the camera.
Every now and then he was moved ...
Sensor resolution: 752x480
Init SD and loading detection definitions
Below minimum threshold, ET: 430 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 391 ms
Below minimum threshold, ET: 356 ms
Below minimum threshold, ET: 347 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 388 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 384 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 363 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 366 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 389 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 376 ms
Below minimum threshold, ET: 351 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 311 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 370 ms
Below minimum threshold, ET: 356 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Below minimum threshold, ET: 344 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 395 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 352 ms
Below minimum threshold, ET: 369 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 360 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 333 ms
Below minimum threshold, ET: 386 ms
Below minimum threshold, ET: 393 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 361 ms
Below minimum threshold, ET: 361 ms
Below minimum threshold, ET: 333 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 378 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 318 ms
Below minimum threshold, ET: 377 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 328 ms
Below minimum threshold, ET: 383 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 402 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 371 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 377 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 377 ms
Below minimum threshold, ET: 338 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 404 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 349 ms
Below minimum threshold, ET: 334 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 363 ms
Below minimum threshold, ET: 361 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 349 ms
Not Detected, ET: 301 ms
Not Detected, ET: 189 ms
Below minimum threshold, ET: 186 ms
Not Detected, ET: 137 ms
Not Detected, ET: 58 ms
Not Detected, ET: 73 ms
Not Detected, ET: 58 ms
Not Detected, ET: 64 ms
Not Detected, ET: 62 ms
Not Detected, ET: 69 ms
Not Detected, ET: 65 ms
Not Detected, ET: 55 ms
Not Detected, ET: 74 ms
Not Detected, ET: 228 ms
Below minimum threshold, ET: 338 ms
Below minimum threshold, ET: 346 ms
Below minimum threshold, ET: 377 ms
Below minimum threshold, ET: 309 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 385 ms
Below minimum threshold, ET: 356 ms
Below minimum threshold, ET: 395 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 353 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 371 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 348 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 341 ms
Below minimum threshold, ET: 380 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 406 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 361 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 355 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 330 ms
Below minimum threshold, ET: 393 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 378 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 356 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 382 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 336 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 361 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 326 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 364 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 339 ms
Not Detected, ET: 47 ms
Not Detected, ET: 49 ms
Not Detected, ET: 60 ms
Not Detected, ET: 47 ms
Not Detected, ET: 61 ms
Not Detected, ET: 49 ms
Not Detected, ET: 62 ms
Not Detected, ET: 46 ms
Not Detected, ET: 110 ms
Below minimum threshold, ET: 316 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 375 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 324 ms
Below minimum threshold, ET: 334 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 329 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 349 ms
Below minimum threshold, ET: 373 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 320 ms
Below minimum threshold, ET: 345 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 362 ms
Below minimum threshold, ET: 375 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 373 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 343 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 395 ms
Below minimum threshold, ET: 367 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 335 ms
Below minimum threshold, ET: 381 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 381 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 352 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 317 ms
Below minimum threshold, ET: 371 ms
Below minimum threshold, ET: 339 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 390 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 364 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 346 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 331 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 329 ms
Below minimum threshold, ET: 336 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 370 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 329 ms
Face[0] : Xs: 62, Ys: 21, Xd: 142, Yd: 101, ET: 374 ms
Below minimum threshold, ET: 326 ms
Not Detected, ET: 187 ms
Not Detected, ET: 194 ms
Not Detected, ET: 158 ms
*/