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