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