/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /*$Id: db_feature_detection.h,v 1.3 2011/06/17 14:03:30 mbansal Exp $*/ #ifndef DB_FEATURE_DETECTION_H #define DB_FEATURE_DETECTION_H /***************************************************************** * Lean and mean begins here * *****************************************************************/ /*! * \defgroup FeatureDetection Feature Detection */ #include "db_utilities.h" #include "db_utilities_constants.h" #include //for NULL /*! * \class db_CornerDetector_f * \ingroup FeatureDetection * \brief Harris corner detector for float images. * * This class performs Harris corner extraction on *float* images managed * with functions in \ref LMImageBasicUtilities. */ class DB_API db_CornerDetector_f { public: db_CornerDetector_f(); ~db_CornerDetector_f(); /*! * Set parameters and pre-allocate memory. Return an upper bound * on the number of corners detected in one frame. * \param im_width width * \param im_height height * \param target_nr_corners * \param nr_horizontal_blocks * \param nr_vertical_blocks * \param absolute_threshold * \param relative_threshold */ unsigned long Init(int im_width,int im_height, int target_nr_corners=DB_DEFAULT_TARGET_NR_CORNERS, int nr_horizontal_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS, int nr_vertical_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS, double absolute_threshold=DB_DEFAULT_ABS_CORNER_THRESHOLD, double relative_threshold=DB_DEFAULT_REL_CORNER_THRESHOLD); /*! * Detect the corners. * x_coord and y_coord should be pre-allocated arrays of length returned by Init(). * \param img row array pointer * \param x_coord corner locations * \param y_coord corner locations * \param nr_corners actual number of corners computed */ void DetectCorners(const float * const *img,double *x_coord,double *y_coord,int *nr_corners) const; void SetAbsoluteThreshold(double a_thresh) { m_a_thresh = a_thresh; }; void SetRelativeThreshold(double r_thresh) { m_r_thresh = r_thresh; }; protected: void Clean(); unsigned long Start(int im_width,int im_height, int block_width,int block_height,unsigned long area_factor, double absolute_threshold,double relative_threshold,int chunkwidth); int m_w,m_h,m_cw,m_bw,m_bh; /*Area factor holds the maximum number of corners to detect per 10000 pixels*/ unsigned long m_area_factor,m_max_nr; double m_a_thresh,m_r_thresh; float *m_temp_f; double *m_temp_d; float **m_strength,*m_strength_mem; }; /*! * \class db_CornerDetector_u * \ingroup FeatureDetection * \brief Harris corner detector for byte images. * * This class performs Harris corner extraction on *byte* images managed * with functions in \ref LMImageBasicUtilities. */ class DB_API db_CornerDetector_u { public: db_CornerDetector_u(); virtual ~db_CornerDetector_u(); /*! Copy ctor duplicates settings. Memory is not copied. */ db_CornerDetector_u(const db_CornerDetector_u& cd); /*! Assignment optor duplicates settings. Memory not copied. */ db_CornerDetector_u& operator=(const db_CornerDetector_u& cd); /*! * Set parameters and pre-allocate memory. Return an upper bound * on the number of corners detected in one frame */ virtual unsigned long Init(int im_width,int im_height, int target_nr_corners=DB_DEFAULT_TARGET_NR_CORNERS, int nr_horizontal_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS, int nr_vertical_blocks=DB_DEFAULT_NR_FEATURE_BLOCKS, double absolute_threshold=DB_DEFAULT_ABS_CORNER_THRESHOLD, double relative_threshold=DB_DEFAULT_REL_CORNER_THRESHOLD); /*! * Detect the corners. * Observe that the image should be overallocated by at least 256 bytes * at the end. * x_coord and y_coord should be pre-allocated arrays of length returned by Init(). * Specifying image mask will restrict corner output to foreground regions. * Foreground value can be specified using fgnd. By default any >0 mask value * is considered to be foreground * \param img row array pointer * \param x_coord corner locations * \param y_coord corner locations * \param nr_corners actual number of corners computed * \param msk row array pointer to mask image * \param fgnd foreground value in the mask */ virtual void DetectCorners(const unsigned char * const *img,double *x_coord,double *y_coord,int *nr_corners, const unsigned char * const * msk=NULL, unsigned char fgnd=255) const; /*! Set absolute feature threshold */ virtual void SetAbsoluteThreshold(double a_thresh) { m_a_thresh = a_thresh; }; /*! Set relative feature threshold */ virtual void SetRelativeThreshold(double r_thresh) { m_r_thresh = r_thresh; }; /*! Extract corners from a pre-computed strength image. \param strength Harris strength image \param x_coord corner locations \param y_coord corner locations \param nr_corners actual number of corners computed */ virtual void ExtractCorners(float ** strength, double *x_coord, double *y_coord, int *nr_corners); protected: virtual void Clean(); /*The absolute threshold to this function should be 16.0 times normal*/ unsigned long Start(int im_width,int im_height, int block_width,int block_height,unsigned long area_factor, double absolute_threshold,double relative_threshold); int m_w,m_h,m_bw,m_bh; /*Area factor holds the maximum number of corners to detect per 10000 pixels*/ unsigned long m_area_factor,m_max_nr; double m_a_thresh,m_r_thresh; int *m_temp_i; double *m_temp_d; float **m_strength,*m_strength_mem; }; #endif /*DB_FEATURE_DETECTION_H*/