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 bbf_SCAN_DETECTOR_EM_H
18#define bbf_SCAN_DETECTOR_EM_H
19
20/* ---- includes ----------------------------------------------------------- */
21
22#include "b_BasicEm/Context.h"
23#include "b_BasicEm/Basic.h"
24#include "b_BasicEm/UInt32Arr.h"
25#include "b_BasicEm/Int16Arr.h"
26#include "b_BasicEm/MemTbl.h"
27#include "b_TensorEm/IdCluster2D.h"
28#include "b_BitFeatureEm/Sequence.h"
29#include "b_BitFeatureEm/BitParam.h"
30#include "b_BitFeatureEm/Scanner.h"
31
32/* ---- related objects  --------------------------------------------------- */
33
34/* ---- typedefs ----------------------------------------------------------- */
35
36/* ---- constants ---------------------------------------------------------- */
37
38/* data format version number */
39#define bbf_SCAN_DETECTOR_VERSION 100
40
41/* maximum number of features in scan detector */
42#define bbf_SCAN_DETECTOR_MAX_FEATURES 4
43
44/* ---- object definition -------------------------------------------------- */
45
46/** discrete feature set */
47struct bbf_ScanDetector
48{
49	/* ---- private data --------------------------------------------------- */
50
51	/** minimum scale (12.20) */
52	uint32 minScaleE;
53
54	/** maximum scale (0: unlimited) (12.20) */
55	uint32 maxScaleE;
56
57	/** maximum image width (this variable must be specified before reading the parameter file) */
58	uint32 maxImageWidthE;
59
60	/** maximum image height (this variable must be specified before reading the parameter file) */
61	uint32 maxImageHeightE;
62
63	/** scanner */
64	struct bbf_Scanner scannerE;
65
66	/* ---- public data ---------------------------------------------------- */
67
68	/** patch width */
69	uint32 patchWidthE;
70
71	/** patch height */
72	uint32 patchHeightE;
73
74	/** minimum default scale (12.20) */
75	uint32 minDefScaleE;
76
77	/** maximum default scale (0: unlimited) (12.20) */
78	uint32 maxDefScaleE;
79
80	/** scale step factor (1.32) (leading bit is always one and therefore ignored) */
81	uint32 scaleStepE;
82
83	/** overlap threshold (16.16) */
84	uint32 overlapThrE;
85
86	/** border width in pixels (refers to scaled image) */
87	uint32 borderWidthE;
88
89	/** border height in pixels (refers to scaled image) */
90	uint32 borderHeightE;
91
92	/** number of features */
93	uint32 featuresE;
94
95	/** bit param array */
96	struct bbf_BitParam bitParamArrE[ bbf_SCAN_DETECTOR_MAX_FEATURES ];
97
98	/** feature array */
99	struct bbf_Sequence featureArrE[ bbf_SCAN_DETECTOR_MAX_FEATURES ];
100
101	/** reference cluster */
102	struct bts_IdCluster2D refClusterE;
103
104	/** reference distance (e.g. eye distance) in ref cluster (16.16) */
105	uint32 refDistanceE;
106
107};
108
109/* ---- associated objects ------------------------------------------------- */
110
111/* ---- external functions ------------------------------------------------- */
112
113/* ---- \ghd{ constructor/destructor } ------------------------------------- */
114
115/** initializes bbf_ScanDetector  */
116void bbf_ScanDetector_init( struct bbs_Context* cpA,
117						    struct bbf_ScanDetector* ptrA );
118
119/** resets bbf_ScanDetector  */
120void bbf_ScanDetector_exit( struct bbs_Context* cpA,
121						    struct bbf_ScanDetector* ptrA );
122
123/* ---- \ghd{ operators } -------------------------------------------------- */
124
125/** copy operator */
126void bbf_ScanDetector_copy( struct bbs_Context* cpA,
127						    struct bbf_ScanDetector* ptrA,
128						    const struct bbf_ScanDetector* srcPtrA );
129
130/** equal operator */
131flag bbf_ScanDetector_equal( struct bbs_Context* cpA,
132						     const struct bbf_ScanDetector* ptrA,
133						     const struct bbf_ScanDetector* srcPtrA );
134
135/* ---- \ghd{ query functions } -------------------------------------------- */
136
137/* ---- \ghd{ modify functions } ------------------------------------------- */
138
139/* ---- \ghd{ memory I/O } ------------------------------------------------- */
140
141/** word size (16-bit) object needs when written to memory */
142uint32 bbf_ScanDetector_memSize( struct bbs_Context* cpA,
143							     const struct bbf_ScanDetector* ptrA );
144
145/** writes object to memory; returns number of words (16-bit) written */
146uint32 bbf_ScanDetector_memWrite( struct bbs_Context* cpA,
147							      const struct bbf_ScanDetector* ptrA, uint16* memPtrA );
148
149/** reads object from memory; returns number of words (16-bit) read */
150uint32 bbf_ScanDetector_memRead( struct bbs_Context* cpA,
151							     struct bbf_ScanDetector* ptrA,
152							     const uint16* memPtrA,
153							     struct bbs_MemTbl* mtpA );
154
155/* ---- \ghd{ exec functions } --------------------------------------------- */
156
157/** Scans over image returns number of detected positions
158 *  After processing the output data are stored in composite format
159 *  in scannerPtrA->outArrE.
160 *
161 *  The output data array is located after execution at *outArrPtrPtrA.
162 *  The output data are organized as follows:
163 *     x(16.16) y(16.16), scale(12.20), confidence(4.28),   x(16.16)....
164 *
165 *  All positions are sorted by descending confidence
166 *
167 *  If no faces were found, the function returns 0 but the output contains
168 *  one valid position with the highest confidence; the associated activity
169 *  value is negative (or 0) in that case.
170 *
171 *  If roiPtrA is NULL, the whole image is considered for processsing
172 *  otherwise *roiPtrA specifies a section of the original image to which
173 *  processing is limited. All coordinates refer to that section and must
174 *  eventually be adjusted externally.
175 *  The roi rectangle must not include pixels outside of the original image
176 *  (checked -> error). The rectangle may be of uneven width.
177 */
178uint32 bbf_ScanDetector_process( struct bbs_Context* cpA,
179							     struct bbf_ScanDetector* ptrA,
180							     const void* imagePtrA,
181								 uint32 imageWidthA,
182								 uint32 imageHeightA,
183								 const struct bts_Int16Rect* roiPtrA,
184								 int32** outArrPtrPtrA );
185
186#endif /* bbf_SCAN_DETECTOR_EM_H */
187
188