17f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/*
27f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
37f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
47f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
57f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * you may not use this file except in compliance with the License.
67f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * You may obtain a copy of the License at
77f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
87f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
97f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * See the License for the specific language governing permissions and
147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project * limitations under the License.
157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#ifndef bbf_SCAN_DETECTOR_EM_H
187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#define bbf_SCAN_DETECTOR_EM_H
197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- includes ----------------------------------------------------------- */
217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Context.h"
237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Basic.h"
247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/UInt32Arr.h"
257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/Int16Arr.h"
267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BasicEm/MemTbl.h"
277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_TensorEm/IdCluster2D.h"
287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BitFeatureEm/Sequence.h"
297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BitFeatureEm/BitParam.h"
307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#include "b_BitFeatureEm/Scanner.h"
317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- related objects  --------------------------------------------------- */
337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- typedefs ----------------------------------------------------------- */
357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- constants ---------------------------------------------------------- */
377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* data format version number */
397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#define bbf_SCAN_DETECTOR_VERSION 100
407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* maximum number of features in scan detector */
427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#define bbf_SCAN_DETECTOR_MAX_FEATURES 4
437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- object definition -------------------------------------------------- */
457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** discrete feature set */
477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectstruct bbf_ScanDetector
487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project{
497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* ---- private data --------------------------------------------------- */
507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** minimum scale (12.20) */
527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 minScaleE;
537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** maximum scale (0: unlimited) (12.20) */
557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 maxScaleE;
567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** maximum image width (this variable must be specified before reading the parameter file) */
587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 maxImageWidthE;
597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** maximum image height (this variable must be specified before reading the parameter file) */
617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 maxImageHeightE;
627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** scanner */
647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbf_Scanner scannerE;
657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/* ---- public data ---------------------------------------------------- */
677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** patch width */
697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 patchWidthE;
707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** patch height */
727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 patchHeightE;
737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** minimum default scale (12.20) */
757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 minDefScaleE;
767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** maximum default scale (0: unlimited) (12.20) */
787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 maxDefScaleE;
797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** scale step factor (1.32) (leading bit is always one and therefore ignored) */
817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 scaleStepE;
827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** overlap threshold (16.16) */
847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 overlapThrE;
857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** border width in pixels (refers to scaled image) */
877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 borderWidthE;
887f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
897f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** border height in pixels (refers to scaled image) */
907f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 borderHeightE;
917f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
927f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** number of features */
937f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 featuresE;
947f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
957f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** bit param array */
967f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbf_BitParam bitParamArrE[ bbf_SCAN_DETECTOR_MAX_FEATURES ];
977f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
987f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** feature array */
997f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bbf_Sequence featureArrE[ bbf_SCAN_DETECTOR_MAX_FEATURES ];
1007f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1017f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** reference cluster */
1027f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	struct bts_IdCluster2D refClusterE;
1037f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1047f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	/** reference distance (e.g. eye distance) in ref cluster (16.16) */
1057f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project	uint32 refDistanceE;
1067f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1077f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project};
1087f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1097f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- associated objects ------------------------------------------------- */
1107f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1117f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- external functions ------------------------------------------------- */
1127f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1137f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ constructor/destructor } ------------------------------------- */
1147f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1157f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** initializes bbf_ScanDetector  */
1167f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_ScanDetector_init( struct bbs_Context* cpA,
1177f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbf_ScanDetector* ptrA );
1187f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1197f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** resets bbf_ScanDetector  */
1207f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_ScanDetector_exit( struct bbs_Context* cpA,
1217f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbf_ScanDetector* ptrA );
1227f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1237f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ operators } -------------------------------------------------- */
1247f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1257f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** copy operator */
1267f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectvoid bbf_ScanDetector_copy( struct bbs_Context* cpA,
1277f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    struct bbf_ScanDetector* ptrA,
1287f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						    const struct bbf_ScanDetector* srcPtrA );
1297f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1307f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** equal operator */
1317f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectflag bbf_ScanDetector_equal( struct bbs_Context* cpA,
1327f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     const struct bbf_ScanDetector* ptrA,
1337f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project						     const struct bbf_ScanDetector* srcPtrA );
1347f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1357f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ query functions } -------------------------------------------- */
1367f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1377f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ modify functions } ------------------------------------------- */
1387f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1397f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ memory I/O } ------------------------------------------------- */
1407f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1417f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** word size (16-bit) object needs when written to memory */
1427f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_ScanDetector_memSize( struct bbs_Context* cpA,
1437f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     const struct bbf_ScanDetector* ptrA );
1447f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1457f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** writes object to memory; returns number of words (16-bit) written */
1467f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_ScanDetector_memWrite( struct bbs_Context* cpA,
1477f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							      const struct bbf_ScanDetector* ptrA, uint16* memPtrA );
1487f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1497f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** reads object from memory; returns number of words (16-bit) read */
1507f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_ScanDetector_memRead( struct bbs_Context* cpA,
1517f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     struct bbf_ScanDetector* ptrA,
1527f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     const uint16* memPtrA,
1537f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     struct bbs_MemTbl* mtpA );
1547f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1557f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/* ---- \ghd{ exec functions } --------------------------------------------- */
1567f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1577f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project/** Scans over image returns number of detected positions
1587f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  After processing the output data are stored in composite format
1597f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  in scannerPtrA->outArrE.
1607f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
1617f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  The output data array is located after execution at *outArrPtrPtrA.
1627f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  The output data are organized as follows:
1637f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *     x(16.16) y(16.16), scale(12.20), confidence(4.28),   x(16.16)....
1647f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
1657f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  All positions are sorted by descending confidence
1667f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
1677f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  If no faces were found, the function returns 0 but the output contains
1687f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  one valid position with the highest confidence; the associated activity
1697f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  value is negative (or 0) in that case.
1707f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *
1717f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  If roiPtrA is NULL, the whole image is considered for processsing
1727f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  otherwise *roiPtrA specifies a section of the original image to which
1737f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  processing is limited. All coordinates refer to that section and must
1747f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  eventually be adjusted externally.
1757f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  The roi rectangle must not include pixels outside of the original image
1767f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project *  (checked -> error). The rectangle may be of uneven width.
1777f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project */
1787f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Projectuint32 bbf_ScanDetector_process( struct bbs_Context* cpA,
1797f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     struct bbf_ScanDetector* ptrA,
1807f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project							     const void* imagePtrA,
1817f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 uint32 imageWidthA,
1827f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 uint32 imageHeightA,
1837f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 const struct bts_Int16Rect* roiPtrA,
1847f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project								 int32** outArrPtrPtrA );
1857f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
1867f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project#endif /* bbf_SCAN_DETECTOR_EM_H */
1877f81d9b6fa7f2ec161b682622db577a28c90b49fThe Android Open Source Project
188