1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef bpi_BF_FACE_FINDER_EM_H
18 #define bpi_BF_FACE_FINDER_EM_H
19 
20 /* ---- includes ----------------------------------------------------------- */
21 
22 #include "b_BasicEm/Context.h"
23 #include "b_APIEm/FaceFinder.h"
24 #include "b_BitFeatureEm/ScanDetector.h"
25 
26 /* ---- related objects  --------------------------------------------------- */
27 
28 struct bpi_DCR;
29 
30 /* ---- typedefs ----------------------------------------------------------- */
31 
32 /* ---- constants ---------------------------------------------------------- */
33 
34 /* data format version number */
35 #define bpi_BF_FACE_FINDER_VERSION 100
36 
37 /* ---- object definition -------------------------------------------------- */
38 
39 /** Face Finder using ractangle features */
40 struct bpi_BFFaceFinder
41 {
42 	/* ---- private data --------------------------------------------------- */
43 
44 	/** base object */
45 	struct bpi_FaceFinder baseE;
46 
47 	/* number of detected faces in last call of multiProcess in face data buffer */
48 	uint32 detectedFacesE;
49 
50 	/* number of available faces in last call of multiProcess in face data buffer */
51 	uint32 availableFacesE;
52 
53 	/* pointer to face data buffer */
54 	int32* faceDataBufferE;
55 
56 	/* ---- public data ---------------------------------------------------- */
57 
58 	/* detector */
59 	struct bbf_ScanDetector detectorE;
60 };
61 
62 /* ---- associated objects ------------------------------------------------- */
63 
64 /* ---- external functions ------------------------------------------------- */
65 
66 /* ---- \ghd{ constructor/destructor } ------------------------------------- */
67 
68 /** initializes module */
69 void bpi_BFFaceFinder_init( struct bbs_Context* cpA,
70 						    struct bpi_BFFaceFinder* ptrA );
71 
72 /** destroys module */
73 void bpi_BFFaceFinder_exit( struct bbs_Context* cpA,
74 						    struct bpi_BFFaceFinder* ptrA );
75 
76 /* ---- \ghd{ operators } -------------------------------------------------- */
77 
78 /** copies module */
79 void bpi_BFFaceFinder_copy( struct bbs_Context* cpA,
80 						    struct bpi_BFFaceFinder* ptrA,
81 							const struct bpi_BFFaceFinder* srcPtrA );
82 
83 /** determines equality of parameters */
84 flag bpi_BFFaceFinder_equal( struct bbs_Context* cpA,
85 							 const struct bpi_BFFaceFinder* ptrA,
86 							 const struct bpi_BFFaceFinder* srcPtrA );
87 
88 /* ---- \ghd{ query functions } -------------------------------------------- */
89 
90 /** minimum eye distance (pixel) */
91 uint32 bpi_BFFaceFinder_getMinEyeDistance( const struct bpi_BFFaceFinder* ptrA );
92 
93 /** maximum eye distance (pixel) */
94 uint32 bpi_BFFaceFinder_getMaxEyeDistance( const struct bpi_BFFaceFinder* ptrA );
95 
96 /* ---- \ghd{ modify functions } ------------------------------------------- */
97 
98 /** minimum eye distance (pixel) */
99 void bpi_BFFaceFinder_setMinEyeDistance( struct bbs_Context* cpA,
100 										 struct bpi_BFFaceFinder* ptrA,
101 										 uint32 distA );
102 
103 /** maximum eye distance (pixel) */
104 void bpi_BFFaceFinder_setMaxEyeDistance( struct bbs_Context* cpA,
105 										 struct bpi_BFFaceFinder* ptrA,
106 										 uint32 distA );
107 
108 /* ---- \ghd{ memory I/O } ------------------------------------------------- */
109 
110 /** size object needs when written to memory */
111 uint32 bpi_BFFaceFinder_memSize( struct bbs_Context* cpA,
112 								 const struct bpi_BFFaceFinder* ptrA );
113 
114 /** writes object to memory; returns number of 16-bit words written */
115 uint32 bpi_BFFaceFinder_memWrite( struct bbs_Context* cpA,
116 								  const struct bpi_BFFaceFinder* ptrA,
117 							      uint16* memPtrA );
118 
119 /** reads object from memory; returns number of 16-bit words read
120  * Note: Before executing this function the maximum image dimensions must be specified
121  * through function bpi_BFFaceFinder_setMaxImageSize. This is to ensure proper allocation
122  * of internal memory. Otherwise this function will cause an exception.
123  */
124 uint32 bpi_BFFaceFinder_memRead( struct bbs_Context* cpA,
125 								 struct bpi_BFFaceFinder* ptrA,
126 								 const uint16* memPtrA,
127 							     struct bbs_MemTbl* mtpA );
128 
129 /* ---- \ghd{ exec functions } --------------------------------------------- */
130 
131 /** processes image for single face detection;
132  *  returns confidence ( 8.24 )
133  *  fills external id cluster with node positions and ids
134  *
135  *  If roiPtrA is NULL, the whole image is considered for processsing
136  *  otherwise *roiPtrA specifies a section of the original image to which
137  *  processing is limited. All coordinates refer to that section and must
138  *  eventually be adjusted externally.
139  *  The roi rectangle must not include pixels outside of the original image
140  *  (checked -> error). The rectangle may be of uneven width.
141  *
142  *  offsPtrA points to an offset vector (whole pixels) that is to be added to
143  *  cluster coordinates in order to obtain image coordinates
144  *
145  */
146 int32 bpi_BFFaceFinder_process( struct bbs_Context* cpA,
147 							    const struct bpi_BFFaceFinder* ptrA,
148 							    void* imagePtrA,
149 							    uint32 imageWidthA,
150 								uint32 imageHeightA,
151 								const struct bts_Int16Rect* roiPtrA,
152 								struct bts_Int16Vec2D* offsPtrA,
153 								struct bts_IdCluster2D* idClusterPtrA );
154 
155 /** Processes integral image for multiple face detection;
156  *  returns number of faces detected
157  *  return pointer to faceBuffer (intermediate data format)
158  *  call getFace() to retrieve face information from buffer.
159  *  *faceDataBufferPtrA is set to the address of an internal buffer that is valid until the next image processing
160  *
161  *  Positions are sorted by confidence (highest confidence first)
162  *
163  *  When this function returns 0 (no face detected) faceDataBuffer
164  *  still contains one valid entry retrievable by getFace() that
165  *  represents the most likely position. The confidence is then below
166  *  or equal 0.5.
167  *
168  *  If roiPtrA is NULL, the whole image is considered for processsing
169  *  otherwise *roiPtrA specifies a section of the original image to which
170  *  processing is limited. All coordinates refer to that section and must
171  *  eventually be adjusted externally.
172  *  The roi rectangle must not include pixels outside of the original image
173  *  (checked -> error). The rectangle may be of uneven width.
174  */
175 uint32 bpi_BFFaceFinder_multiProcess( struct bbs_Context* cpA,
176 									  const struct bpi_BFFaceFinder* ptrA,
177 									  void* imagePtrA,
178 									  uint32 imageWidthA,
179 									  uint32 imageHeightA,
180 									  const struct bts_Int16Rect* roiPtrA );
181 
182 /** Extracts a single face from a face buffer that was previously filled with face data by function
183  *  multiProcess().
184  *  returns confidence ( 8.24 )
185  *  Fills external id cluster with node positions and ids
186  *
187  *  offsPtrA points to an offset vector (whole pixels) that is to be added to
188  *  cluster coordinates in order to obtain image coordinates
189  */
190 uint32 bpi_BFFaceFinder_getFace( struct bbs_Context* cpA,
191 								 const struct bpi_BFFaceFinder* ptrA,
192 								 uint32 indexA,
193 								 struct bts_Int16Vec2D* offsPtrA,
194 								 struct bts_IdCluster2D* idClusterPtrA );
195 
196 /** Extracts a single face from a face buffer that was previously filled with face data by function
197  *  multiProcess().
198  *  returns confidence ( 8.24 )
199  *  provides
200  *		- id cluster with node positions and ids
201  *		- confidence
202  */
203 void bpi_BFFaceFinder_getFaceDCR( struct bbs_Context* cpA,
204 								  const struct bpi_BFFaceFinder* ptrA,
205 								  uint32 indexA,
206 								  struct bpi_DCR* dcrPtrA );
207 
208 /** this function must be executed before calling _memRead */
209 void bpi_BFFaceFinder_setMaxImageSize( struct bbs_Context* cpA,
210 									   struct bpi_BFFaceFinder* ptrA,
211 									   uint32 maxImageWidthA,
212 									   uint32 maxImageHeightA );
213 
214 /** initializes some parameters prior to reading
215  *  Overload of vpSetParams
216  *  wraps function setMaxImageSize
217  */
218 void bpi_BFFaceFinder_setParams( struct bbs_Context* cpA,
219 								 struct bpi_FaceFinder* ptrA,
220 								 uint32 maxImageWidthA,
221 								 uint32 maxImageHeightA );
222 
223 /** sets detection range
224  *  Overload of vpSetParams
225  */
226 void bpi_BFFaceFinder_setRange( struct bbs_Context* cpA,
227 								struct bpi_FaceFinder* ptrA,
228 								uint32 minEyeDistanceA,
229 								uint32 maxEyeDistanceA );
230 
231 /** Single face processing function; returns confidence (8.24)
232  *  Overload of vpProcess
233  *  wraps function process
234  */
235 int32 bpi_BFFaceFinder_processDcr( struct bbs_Context* cpA,
236 								   const struct bpi_FaceFinder* ptrA,
237 						           struct bpi_DCR* dcrPtrA );
238 
239 /** Multiple face processing function; returns number of faces detected
240  *  Overload of vpPutDcr
241  *  wraps function multiProcess
242  */
243 int32 bpi_BFFaceFinder_putDcr( struct bbs_Context* cpA,
244 							   const struct bpi_FaceFinder* ptrA,
245 							   struct bpi_DCR* dcrPtrA );
246 
247 /** Retrieves indexed face from face finder after calling PutDCR
248  *  Overload of vpGetDcr
249  *  wraps function getFaceDCR
250  */
251 void bpi_BFFaceFinder_getDcr( struct bbs_Context* cpA,
252 							  const struct bpi_FaceFinder* ptrA,
253 							  uint32 indexA,
254 							  struct bpi_DCR* dcrPtrA );
255 
256 #endif /* bpi_BF_FACE_FINDER_EM_H */
257