1/*
2 * Copyright (C) 2011 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/*$Id: db_feature_detection.h,v 1.3 2011/06/17 14:03:30 mbansal Exp $*/
18
19#ifndef DB_FEATURE_DETECTION_H
20#define DB_FEATURE_DETECTION_H
21
22/*****************************************************************
23*    Lean and mean begins here                                   *
24*****************************************************************/
25/*!
26 * \defgroup FeatureDetection Feature Detection
27 */
28#include "db_utilities.h"
29#include "db_utilities_constants.h"
30#include <stdlib.h> //for NULL
31
32/*!
33 * \class db_CornerDetector_f
34 * \ingroup FeatureDetection
35 * \brief Harris corner detector for float images.
36 *
37 *  This class performs Harris corner extraction on *float* images managed
38 * with functions in \ref LMImageBasicUtilities.
39 */
40class DB_API db_CornerDetector_f
41{
42public:
43    db_CornerDetector_f();
44    ~db_CornerDetector_f();
45
46    /*!
47     * Set parameters and pre-allocate memory. Return an upper bound
48     * on the number of corners detected in one frame.
49     * \param im_width      width
50     * \param im_height     height
51     * \param target_nr_corners
52     * \param nr_horizontal_blocks
53     * \param nr_vertical_blocks
54     * \param absolute_threshold
55     * \param relative_threshold
56     */
57    unsigned long Init(int im_width,int im_height,
58                            int target_nr_corners=DB_DEFAULT_TARGET_NR_CORNERS,
59                            int nr_horizontal_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS,
60                            int nr_vertical_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS,
61                            double absolute_threshold=DB_DEFAULT_ABS_CORNER_THRESHOLD,
62                            double relative_threshold=DB_DEFAULT_REL_CORNER_THRESHOLD);
63
64    /*!
65     * Detect the corners.
66     * x_coord and y_coord should be pre-allocated arrays of length returned by Init().
67     * \param img   row array pointer
68     * \param x_coord   corner locations
69     * \param y_coord   corner locations
70     * \param nr_corners    actual number of corners computed
71     */
72    void DetectCorners(const float * const *img,double *x_coord,double *y_coord,int *nr_corners) const;
73    void SetAbsoluteThreshold(double a_thresh) { m_a_thresh = a_thresh; };
74    void SetRelativeThreshold(double r_thresh) { m_r_thresh = r_thresh; };
75protected:
76    void Clean();
77    unsigned long Start(int im_width,int im_height,
78            int block_width,int block_height,unsigned long area_factor,
79            double absolute_threshold,double relative_threshold,int chunkwidth);
80
81    int m_w,m_h,m_cw,m_bw,m_bh;
82    /*Area factor holds the maximum number of corners to detect
83    per 10000 pixels*/
84    unsigned long m_area_factor,m_max_nr;
85    double m_a_thresh,m_r_thresh;
86    float *m_temp_f;
87    double *m_temp_d;
88    float **m_strength,*m_strength_mem;
89};
90/*!
91 * \class db_CornerDetector_u
92 * \ingroup FeatureDetection
93 * \brief Harris corner detector for byte images.
94 *
95 *  This class performs Harris corner extraction on *byte* images managed
96 * with functions in \ref LMImageBasicUtilities.
97 */
98class DB_API db_CornerDetector_u
99{
100public:
101    db_CornerDetector_u();
102    virtual ~db_CornerDetector_u();
103
104    /*!
105     Copy ctor duplicates settings.
106     Memory is not copied.
107     */
108    db_CornerDetector_u(const db_CornerDetector_u& cd);
109    /*!
110     Assignment optor duplicates settings.
111     Memory not copied.
112     */
113    db_CornerDetector_u& operator=(const db_CornerDetector_u& cd);
114
115    /*!
116     * Set parameters and pre-allocate memory. Return an upper bound
117     * on the number of corners detected in one frame
118     */
119    virtual unsigned long Init(int im_width,int im_height,
120                            int target_nr_corners=DB_DEFAULT_TARGET_NR_CORNERS,
121                            int nr_horizontal_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS,
122                            int nr_vertical_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS,
123                            double absolute_threshold=DB_DEFAULT_ABS_CORNER_THRESHOLD,
124                            double relative_threshold=DB_DEFAULT_REL_CORNER_THRESHOLD);
125
126    /*!
127     * Detect the corners.
128     * Observe that the image should be overallocated by at least 256 bytes
129     * at the end.
130     * x_coord and y_coord should be pre-allocated arrays of length returned by Init().
131     * Specifying image mask will restrict corner output to foreground regions.
132     * Foreground value can be specified using fgnd. By default any >0 mask value
133     * is considered to be foreground
134     * \param img   row array pointer
135     * \param x_coord   corner locations
136     * \param y_coord   corner locations
137     * \param nr_corners    actual number of corners computed
138     * \param msk       row array pointer to mask image
139     * \param fgnd      foreground value in the mask
140     */
141    virtual void DetectCorners(const unsigned char * const *img,double *x_coord,double *y_coord,int *nr_corners,
142        const unsigned char * const * msk=NULL, unsigned char fgnd=255) const;
143
144    /*!
145     Set absolute feature threshold
146     */
147    virtual void SetAbsoluteThreshold(double a_thresh) { m_a_thresh = a_thresh; };
148    /*!
149     Set relative feature threshold
150     */
151    virtual void SetRelativeThreshold(double r_thresh) { m_r_thresh = r_thresh; };
152
153    /*!
154     Extract corners from a pre-computed strength image.
155     \param strength    Harris strength image
156     \param x_coord corner locations
157     \param y_coord corner locations
158     \param nr_corners  actual number of corners computed
159     */
160    virtual void ExtractCorners(float ** strength, double *x_coord, double *y_coord, int *nr_corners);
161protected:
162    virtual void Clean();
163    /*The absolute threshold to this function should be 16.0 times
164    normal*/
165    unsigned long Start(int im_width,int im_height,
166            int block_width,int block_height,unsigned long area_factor,
167            double absolute_threshold,double relative_threshold);
168
169    int m_w,m_h,m_bw,m_bh;
170    /*Area factor holds the maximum number of corners to detect
171    per 10000 pixels*/
172    unsigned long m_area_factor,m_max_nr;
173    double m_a_thresh,m_r_thresh;
174    int *m_temp_i;
175    double *m_temp_d;
176    float **m_strength,*m_strength_mem;
177};
178
179#endif /*DB_FEATURE_DETECTION_H*/
180