/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef bpi_BF_FACE_FINDER_EM_H
#define bpi_BF_FACE_FINDER_EM_H
/* ---- includes ----------------------------------------------------------- */
#include "b_BasicEm/Context.h"
#include "b_APIEm/FaceFinder.h"
#include "b_BitFeatureEm/ScanDetector.h"
/* ---- related objects --------------------------------------------------- */
struct bpi_DCR;
/* ---- typedefs ----------------------------------------------------------- */
/* ---- constants ---------------------------------------------------------- */
/* data format version number */
#define bpi_BF_FACE_FINDER_VERSION 100
/* ---- object definition -------------------------------------------------- */
/** Face Finder using ractangle features */
struct bpi_BFFaceFinder
{
/* ---- private data --------------------------------------------------- */
/** base object */
struct bpi_FaceFinder baseE;
/* number of detected faces in last call of multiProcess in face data buffer */
uint32 detectedFacesE;
/* number of available faces in last call of multiProcess in face data buffer */
uint32 availableFacesE;
/* pointer to face data buffer */
int32* faceDataBufferE;
/* ---- public data ---------------------------------------------------- */
/* detector */
struct bbf_ScanDetector detectorE;
};
/* ---- associated objects ------------------------------------------------- */
/* ---- external functions ------------------------------------------------- */
/* ---- \ghd{ constructor/destructor } ------------------------------------- */
/** initializes module */
void bpi_BFFaceFinder_init( struct bbs_Context* cpA,
struct bpi_BFFaceFinder* ptrA );
/** destroys module */
void bpi_BFFaceFinder_exit( struct bbs_Context* cpA,
struct bpi_BFFaceFinder* ptrA );
/* ---- \ghd{ operators } -------------------------------------------------- */
/** copies module */
void bpi_BFFaceFinder_copy( struct bbs_Context* cpA,
struct bpi_BFFaceFinder* ptrA,
const struct bpi_BFFaceFinder* srcPtrA );
/** determines equality of parameters */
flag bpi_BFFaceFinder_equal( struct bbs_Context* cpA,
const struct bpi_BFFaceFinder* ptrA,
const struct bpi_BFFaceFinder* srcPtrA );
/* ---- \ghd{ query functions } -------------------------------------------- */
/** minimum eye distance (pixel) */
uint32 bpi_BFFaceFinder_getMinEyeDistance( const struct bpi_BFFaceFinder* ptrA );
/** maximum eye distance (pixel) */
uint32 bpi_BFFaceFinder_getMaxEyeDistance( const struct bpi_BFFaceFinder* ptrA );
/* ---- \ghd{ modify functions } ------------------------------------------- */
/** minimum eye distance (pixel) */
void bpi_BFFaceFinder_setMinEyeDistance( struct bbs_Context* cpA,
struct bpi_BFFaceFinder* ptrA,
uint32 distA );
/** maximum eye distance (pixel) */
void bpi_BFFaceFinder_setMaxEyeDistance( struct bbs_Context* cpA,
struct bpi_BFFaceFinder* ptrA,
uint32 distA );
/* ---- \ghd{ memory I/O } ------------------------------------------------- */
/** size object needs when written to memory */
uint32 bpi_BFFaceFinder_memSize( struct bbs_Context* cpA,
const struct bpi_BFFaceFinder* ptrA );
/** writes object to memory; returns number of 16-bit words written */
uint32 bpi_BFFaceFinder_memWrite( struct bbs_Context* cpA,
const struct bpi_BFFaceFinder* ptrA,
uint16* memPtrA );
/** reads object from memory; returns number of 16-bit words read
* Note: Before executing this function the maximum image dimensions must be specified
* through function bpi_BFFaceFinder_setMaxImageSize. This is to ensure proper allocation
* of internal memory. Otherwise this function will cause an exception.
*/
uint32 bpi_BFFaceFinder_memRead( struct bbs_Context* cpA,
struct bpi_BFFaceFinder* ptrA,
const uint16* memPtrA,
struct bbs_MemTbl* mtpA );
/* ---- \ghd{ exec functions } --------------------------------------------- */
/** processes image for single face detection;
* returns confidence ( 8.24 )
* fills external id cluster with node positions and ids
*
* If roiPtrA is NULL, the whole image is considered for processsing
* otherwise *roiPtrA specifies a section of the original image to which
* processing is limited. All coordinates refer to that section and must
* eventually be adjusted externally.
* The roi rectangle must not include pixels outside of the original image
* (checked -> error). The rectangle may be of uneven width.
*
* offsPtrA points to an offset vector (whole pixels) that is to be added to
* cluster coordinates in order to obtain image coordinates
*
*/
int32 bpi_BFFaceFinder_process( struct bbs_Context* cpA,
const struct bpi_BFFaceFinder* ptrA,
void* imagePtrA,
uint32 imageWidthA,
uint32 imageHeightA,
const struct bts_Int16Rect* roiPtrA,
struct bts_Int16Vec2D* offsPtrA,
struct bts_IdCluster2D* idClusterPtrA );
/** Processes integral image for multiple face detection;
* returns number of faces detected
* return pointer to faceBuffer (intermediate data format)
* call getFace() to retrieve face information from buffer.
* *faceDataBufferPtrA is set to the address of an internal buffer that is valid until the next image processing
*
* Positions are sorted by confidence (highest confidence first)
*
* When this function returns 0 (no face detected) faceDataBuffer
* still contains one valid entry retrievable by getFace() that
* represents the most likely position. The confidence is then below
* or equal 0.5.
*
* If roiPtrA is NULL, the whole image is considered for processsing
* otherwise *roiPtrA specifies a section of the original image to which
* processing is limited. All coordinates refer to that section and must
* eventually be adjusted externally.
* The roi rectangle must not include pixels outside of the original image
* (checked -> error). The rectangle may be of uneven width.
*/
uint32 bpi_BFFaceFinder_multiProcess( struct bbs_Context* cpA,
const struct bpi_BFFaceFinder* ptrA,
void* imagePtrA,
uint32 imageWidthA,
uint32 imageHeightA,
const struct bts_Int16Rect* roiPtrA );
/** Extracts a single face from a face buffer that was previously filled with face data by function
* multiProcess().
* returns confidence ( 8.24 )
* Fills external id cluster with node positions and ids
*
* offsPtrA points to an offset vector (whole pixels) that is to be added to
* cluster coordinates in order to obtain image coordinates
*/
uint32 bpi_BFFaceFinder_getFace( struct bbs_Context* cpA,
const struct bpi_BFFaceFinder* ptrA,
uint32 indexA,
struct bts_Int16Vec2D* offsPtrA,
struct bts_IdCluster2D* idClusterPtrA );
/** Extracts a single face from a face buffer that was previously filled with face data by function
* multiProcess().
* returns confidence ( 8.24 )
* provides
* - id cluster with node positions and ids
* - confidence
*/
void bpi_BFFaceFinder_getFaceDCR( struct bbs_Context* cpA,
const struct bpi_BFFaceFinder* ptrA,
uint32 indexA,
struct bpi_DCR* dcrPtrA );
/** this function must be executed before calling _memRead */
void bpi_BFFaceFinder_setMaxImageSize( struct bbs_Context* cpA,
struct bpi_BFFaceFinder* ptrA,
uint32 maxImageWidthA,
uint32 maxImageHeightA );
/** initializes some parameters prior to reading
* Overload of vpSetParams
* wraps function setMaxImageSize
*/
void bpi_BFFaceFinder_setParams( struct bbs_Context* cpA,
struct bpi_FaceFinder* ptrA,
uint32 maxImageWidthA,
uint32 maxImageHeightA );
/** sets detection range
* Overload of vpSetParams
*/
void bpi_BFFaceFinder_setRange( struct bbs_Context* cpA,
struct bpi_FaceFinder* ptrA,
uint32 minEyeDistanceA,
uint32 maxEyeDistanceA );
/** Single face processing function; returns confidence (8.24)
* Overload of vpProcess
* wraps function process
*/
int32 bpi_BFFaceFinder_processDcr( struct bbs_Context* cpA,
const struct bpi_FaceFinder* ptrA,
struct bpi_DCR* dcrPtrA );
/** Multiple face processing function; returns number of faces detected
* Overload of vpPutDcr
* wraps function multiProcess
*/
int32 bpi_BFFaceFinder_putDcr( struct bbs_Context* cpA,
const struct bpi_FaceFinder* ptrA,
struct bpi_DCR* dcrPtrA );
/** Retrieves indexed face from face finder after calling PutDCR
* Overload of vpGetDcr
* wraps function getFaceDCR
*/
void bpi_BFFaceFinder_getDcr( struct bbs_Context* cpA,
const struct bpi_FaceFinder* ptrA,
uint32 indexA,
struct bpi_DCR* dcrPtrA );
#endif /* bpi_BF_FACE_FINDER_EM_H */