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_matching.h,v 1.3 2011/06/17 14:03:30 mbansal Exp $*/ 18e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 19e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#ifndef DB_FEATURE_MATCHING_H 20e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#define DB_FEATURE_MATCHING_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 FeatureMatching Feature Matching 27e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 28e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities.h" 29e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#include "db_utilities_constants.h" 30e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 31e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_SignedSquareNormCorr21x21_PreAlign_u(short *patch,const unsigned char * const *f_img,int x_f,int y_f,float *sum,float *recip); 32e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta ChenDB_API void db_SignedSquareNormCorr11x11_PreAlign_u(short *patch,const unsigned char * const *f_img,int x_f,int y_f,float *sum,float *recip); 33e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenfloat db_SignedSquareNormCorr21x21Aligned_Post_s(const short *f_patch,const short *g_patch,float fsum_gsum,float f_recip_g_recip); 34e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenfloat db_SignedSquareNormCorr11x11Aligned_Post_s(const short *f_patch,const short *g_patch,float fsum_gsum,float f_recip_g_recip); 35e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 36e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass db_PointInfo_f 37e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 38e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 39e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Coordinates of point*/ 40e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int x; 41e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int y; 42e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Id nr of point*/ 43e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int id; 44e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Best match score*/ 45e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double s; 46e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Best match candidate*/ 47e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_PointInfo_f *pir; 48e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Precomputed coefficients 49e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen of image patch*/ 50e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen float sum; 51e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen float recip; 52e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Pointer to patch layout*/ 53e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const float *patch; 54e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 55e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 56e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass db_Bucket_f 57e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 58e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 59e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_PointInfo_f *ptr; 60e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int nr; 61e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 62e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 63e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass db_PointInfo_u 64e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 65e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 66e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Coordinates of point*/ 67e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int x; 68e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int y; 69e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Id nr of point*/ 70e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int id; 71e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Best match score*/ 72e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double s; 73e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Best match candidate*/ 74e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_PointInfo_u *pir; 75e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Precomputed coefficients 76e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen of image patch*/ 77e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen float sum; 78e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen float recip; 79e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*Pointer to patch layout*/ 80e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const short *patch; 81e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 82e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 83e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass db_Bucket_u 84e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 85e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 86e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_PointInfo_u *ptr; 87e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int nr; 88e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 89e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*! 90e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \class db_Matcher_f 91e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \ingroup FeatureMatching 92e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \brief Feature matcher for float images. 93e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 94e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Normalized correlation feature matcher for <b>float</b> images. 95e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Correlation window size is constant and set to 11x11. 96e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * See \ref FeatureDetection to detect Harris corners. 97e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Images are managed with functions in \ref LMImageBasicUtilities. 98e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 99e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass DB_API db_Matcher_f 100e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 101e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 102e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Matcher_f(); 103e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen ~db_Matcher_f(); 104e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 105e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*! 106e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Set parameters and pre-allocate memory. Return an upper bound 107e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * on the number of matches. 108e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param im_width width 109e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param im_height height 110e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param max_disparity maximum distance (as fraction of image size) between matches 111e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param target_nr_corners maximum number of matches 112e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return maximum number of matches 113e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 114e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned long Init(int im_width,int im_height, 115e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double max_disparity=DB_DEFAULT_MAX_DISPARITY, 116e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int target_nr_corners=DB_DEFAULT_TARGET_NR_CORNERS); 117e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 118e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*! 119e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Match two sets of features. 120e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * If the prewarp H is not NULL it will be applied to the features 121e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * in the right image before matching. 122e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Parameters id_l and id_r must point to arrays of size target_nr_corners 123e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * (returned by Init()). 124e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * The results of matching are in id_l and id_r. 125e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Interpretaqtion of results: if id_l[i] = m and id_r[i] = n, 126e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * feature at (x_l[m],y_l[m]) matched to (x_r[n],y_r[n]). 127e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param l_img left image 128e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param r_img right image 129e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param x_l left x coordinates of features 130e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param y_l left y coordinates of features 131e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param nr_l number of features in left image 132e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param x_r right x coordinates of features 133e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param y_r right y coordinates of features 134e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param nr_r number of features in right image 135e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param id_l indices of left features that matched 136e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param id_r indices of right features that matched 137e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param nr_matches number of features actually matched 138e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param H image homography (prewarp) to be applied to right image features 139e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 140e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen void Match(const float * const *l_img,const float * const *r_img, 141e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const double *x_l,const double *y_l,int nr_l,const double *x_r,const double *y_r,int nr_r, 142e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int *id_l,int *id_r,int *nr_matches,const double H[9]=0); 143e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 144e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenprotected: 145e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen void Clean(); 146e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 147e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int m_w,m_h,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,m_target; 148e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned long m_kA,m_kB; 149e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Bucket_f **m_bp_l; 150e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Bucket_f **m_bp_r; 151e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen float *m_patch_space,*m_aligned_patch_space; 152e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 153e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen/*! 154e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \class db_Matcher_u 155e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \ingroup FeatureMatching 156e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \brief Feature matcher for byte images. 157e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 158e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Normalized correlation feature matcher for <b>byte</b> images. 159e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Correlation window size is constant and set to 11x11. 160e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * See \ref FeatureDetection to detect Harris corners. 161e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Images are managed with functions in \ref LMImageBasicUtilities. 162e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * 163e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * If the prewarp matrix H is supplied, the feature coordinates are warped by H before being placed in 164e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * appropriate buckets. If H is an affine transform and the "affine" parameter is set to 1 or 2, 165e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * then the correlation patches themselves are warped before being placed in the patch space. 166e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 167e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenclass DB_API db_Matcher_u 168e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen{ 169e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenpublic: 170e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Matcher_u(); 171e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 172e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int GetPatchSize(){return 11;}; 173e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 174e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen virtual ~db_Matcher_u(); 175e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 176e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*! 177e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Copy ctor duplicates settings. 178e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Memory not copied. 179e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 180e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Matcher_u(const db_Matcher_u& cm); 181e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 182e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*! 183e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Assignment optor duplicates settings 184e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen Memory not copied. 185e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 186e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Matcher_u& operator= (const db_Matcher_u& cm); 187e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 188e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*! 189e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Set parameters and pre-allocate memory. Return an upper bound 190e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * on the number of matches. 191e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * If max_disparity_v is DB_DEFAULT_NO_DISPARITY, look for matches 192e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * in a ellipse around a feature of radius max_disparity*im_width by max_disparity*im_height. 193e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * If max_disparity_v is specified, use a rectangle max_disparity*im_width by max_disparity_v*im_height. 194e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param im_width width 195e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param im_height height 196e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param max_disparity maximum distance (as fraction of image size) between matches 197e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param target_nr_corners maximum number of matches 198e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param max_disparity_v maximum vertical disparity (distance between matches) 199e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param use_smaller_matching_window if set to true, uses a correlation window of 5x5 instead of the default 11x11 200e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return maximum number of matches 201e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 202e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen virtual unsigned long Init(int im_width,int im_height, 203e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double max_disparity=DB_DEFAULT_MAX_DISPARITY, 204e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int target_nr_corners=DB_DEFAULT_TARGET_NR_CORNERS, 205e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double max_disparity_v=DB_DEFAULT_NO_DISPARITY, 206e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool use_smaller_matching_window=false, int use_21=0); 207e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 208e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*! 209e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Match two sets of features. 210e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * If the prewarp H is not NULL it will be applied to the features 211e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * in the right image before matching. 212e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Parameters id_l and id_r must point to arrays of size target_nr_corners 213e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * (returned by Init()). 214e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * The results of matching are in id_l and id_r. 215e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Interpretaqtion of results: if id_l[i] = m and id_r[i] = n, 216e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * feature at (x_l[m],y_l[m]) matched to (x_r[n],y_r[n]). 217e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param l_img left image 218e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param r_img right image 219e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param x_l left x coordinates of features 220e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param y_l left y coordinates of features 221e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param nr_l number of features in left image 222e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param x_r right x coordinates of features 223e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param y_r right y coordinates of features 224e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param nr_r number of features in right image 225e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param id_l indices of left features that matched 226e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param id_r indices of right features that matched 227e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param nr_matches number of features actually matched 228e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param H image homography (prewarp) to be applied to right image features 229e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \param affine prewarp the 11x11 patches by given affine transform. 0 means no warping, 230e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 1 means nearest neighbor, 2 means bilinear warping. 231e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 232e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen virtual void Match(const unsigned char * const *l_img,const unsigned char * const *r_img, 233e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen const double *x_l,const double *y_l,int nr_l,const double *x_r,const double *y_r,int nr_r, 234e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int *id_l,int *id_r,int *nr_matches,const double H[9]=0,int affine=0); 235e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 236e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen /*! 237e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * Checks if Init() was called. 238e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen * \return 1 if Init() was called, 0 otherwise. 239e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen */ 240e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int IsAllocated(); 241e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 242e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chenprotected: 243e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen virtual void Clean(); 244e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 245e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 246e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int m_w,m_h,m_bw,m_bh,m_nr_h,m_nr_v,m_bd,m_target; 247e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen unsigned long m_kA,m_kB; 248e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Bucket_u **m_bp_l; 249e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen db_Bucket_u **m_bp_r; 250e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen short *m_patch_space,*m_aligned_patch_space; 251e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 252e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen double m_max_disparity, m_max_disparity_v; 253e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int m_rect_window; 254e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen bool m_use_smaller_matching_window; 255e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen int m_use_21; 256e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen}; 257e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 258e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 259e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen 260e295e32b68cf04f0d99138bf4a6d25555f3aef99Wei-Ta Chen#endif /*DB_FEATURE_MATCHING_H*/ 261