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