00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __MATCHER_H__
00023 #define __MATCHER_H__
00024
00025 #include <stdio.h>
00026 #include <stdlib.h>
00027 #include <string.h>
00028 #include <iostream>
00029 #include <math.h>
00030 #include <emmintrin.h>
00031 #include <algorithm>
00032 #include <vector>
00033
00034 #include "matrix.h"
00035
00036 class Matcher {
00037
00038 public:
00039
00040
00041 struct parameters {
00042
00043 int32_t nms_n;
00044 int32_t nms_tau;
00045 int32_t match_binsize;
00046 int32_t match_radius;
00047 int32_t match_disp_tolerance;
00048 int32_t outlier_disp_tolerance;
00049 int32_t outlier_flow_tolerance;
00050 int32_t multi_stage;
00051 int32_t half_resolution;
00052 int32_t refinement;
00053
00054
00055 parameters () {
00056 nms_n = 3;
00057 nms_tau = 50;
00058 match_binsize = 50;
00059 match_radius = 200;
00060 match_disp_tolerance = 2;
00061 outlier_disp_tolerance = 5;
00062 outlier_flow_tolerance = 5;
00063 multi_stage = 1;
00064 half_resolution = 1;
00065 refinement = 1;
00066 }
00067 };
00068
00069
00070 Matcher(parameters param);
00071
00072
00073 ~Matcher();
00074
00075
00076 struct p_match {
00077 float u1p,v1p;
00078 int32_t i1p;
00079 float u2p,v2p;
00080 int32_t i2p;
00081 float u1c,v1c;
00082 int32_t i1c;
00083 float u2c,v2c;
00084 int32_t i2c;
00085 p_match(){}
00086 p_match(float u1p,float v1p,int32_t i1p,float u2p,float v2p,int32_t i2p,
00087 float u1c,float v1c,int32_t i1c,float u2c,float v2c,int32_t i2c):
00088 u1p(u1p),v1p(v1p),i1p(i1p),u2p(u2p),v2p(v2p),i2p(i2p),
00089 u1c(u1c),v1c(v1c),i1c(i1c),u2c(u2c),v2c(v2c),i2c(i2c) {}
00090 };
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 void pushBack (uint8_t *I1,uint8_t* I2,int32_t* dims,const bool replace);
00103
00104
00105
00106
00107
00108 void pushBack (uint8_t *I1,int32_t* dims,const bool replace) { pushBack(I1,0,dims,replace); }
00109
00110
00111
00112 void matchFeatures(int32_t method);
00113
00114
00115
00116 void bucketFeatures(int32_t max_features,float bucket_width,float bucket_height);
00117
00118
00119 std::vector<Matcher::p_match> getMatches() { return p_matched_2; }
00120
00121
00122
00123
00124 float getGain (std::vector<int32_t> inliers);
00125
00126 private:
00127
00128
00129 struct maximum {
00130 int32_t u;
00131 int32_t v;
00132 int32_t val;
00133 int32_t c;
00134 int32_t d1,d2,d3,d4,d5,d6,d7,d8;
00135 maximum() {}
00136 maximum(int32_t u,int32_t v,int32_t val,int32_t c):u(u),v(v),val(val),c(c) {}
00137 };
00138
00139
00140 struct range {
00141 float u_min[4];
00142 float u_max[4];
00143 float v_min[4];
00144 float v_max[4];
00145 };
00146
00147 struct delta {
00148 float val[8];
00149 delta () {}
00150 delta (float v) {
00151 for (int32_t i=0; i<8; i++)
00152 val[i] = v;
00153 }
00154 };
00155
00156
00157 inline int32_t getAddressOffsetImage (const int32_t& u,const int32_t& v,const int32_t& width) {
00158 return v*width+u;
00159 }
00160
00161
00162 void nonMaximumSuppression (int16_t* I_f1,int16_t* I_f2,const int32_t* dims,std::vector<Matcher::maximum> &maxima,int32_t nms_n);
00163
00164
00165 inline uint8_t saturate(int16_t in);
00166 void filterImageAll (uint8_t* I,uint8_t* I_du,uint8_t* I_dv,int16_t* I_f1,int16_t* I_f2,const int* dims);
00167 void filterImageSobel (uint8_t* I,uint8_t* I_du,uint8_t* I_dv,const int* dims);
00168 inline void computeDescriptor (const uint8_t* I_du,const uint8_t* I_dv,const int32_t &bpl,const int32_t &u,const int32_t &v,uint8_t *desc_addr);
00169 inline void computeSmallDescriptor (const uint8_t* I_du,const uint8_t* I_dv,const int32_t &bpl,const int32_t &u,const int32_t &v,uint8_t *desc_addr);
00170 void computeDescriptors (uint8_t* I_du,uint8_t* I_dv,const int32_t bpl,std::vector<Matcher::maximum> &maxima);
00171
00172 void getHalfResolutionDimensions(const int32_t *dims,int32_t *dims_half);
00173 uint8_t* createHalfResolutionImage(uint8_t *I,const int32_t* dims);
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 void computeFeatures (uint8_t *I,const int32_t* dims,int32_t* &max1,int32_t &num1,int32_t* &max2,int32_t &num2,uint8_t* &I_du,uint8_t* &I_dv,uint8_t* &I_du_full,uint8_t* &I_dv_full);
00185
00186
00187 void computePriorStatistics (std::vector<Matcher::p_match> &p_matched,int32_t method);
00188 void createIndexVector (int32_t* m,int32_t n,std::vector<int32_t> *k,const int32_t &u_bin_num,const int32_t &v_bin_num);
00189 inline void findMatch (int32_t* m1,const int32_t &i1,int32_t* m2,const int32_t &step_size,
00190 std::vector<int32_t> *k2,const int32_t &u_bin_num,const int32_t &v_bin_num,const int32_t &stat_bin,
00191 int32_t& min_ind,int32_t stage,bool flow,bool use_prior);
00192 void matching (int32_t *m1p,int32_t *m2p,int32_t *m1c,int32_t *m2c,
00193 int32_t n1p,int32_t n2p,int32_t n1c,int32_t n2c,
00194 std::vector<Matcher::p_match> &p_matched,int32_t method,bool use_prior);
00195
00196
00197 void removeOutliers (std::vector<Matcher::p_match> &p_matched,int32_t method);
00198
00199
00200 bool parabolicFitting(const uint8_t* I1_du,const uint8_t* I1_dv,const int32_t* dims1,
00201 const uint8_t* I2_du,const uint8_t* I2_dv,const int32_t* dims2,
00202 const float &u1,const float &v1,
00203 float &u2,float &v2,
00204 Matrix At,Matrix AtA,
00205 uint8_t* desc_buffer);
00206 void relocateMinimum(const uint8_t* I1_du,const uint8_t* I1_dv,const int32_t* dims1,
00207 const uint8_t* I2_du,const uint8_t* I2_dv,const int32_t* dims2,
00208 const float &u1,const float &v1,
00209 float &u2,float &v2,
00210 uint8_t* desc_buffer);
00211 void refinement (std::vector<Matcher::p_match> &p_matched,int32_t method);
00212
00213
00214 inline float mean(const uint8_t* I,const int32_t &bpl,const int32_t &u_min,const int32_t &u_max,const int32_t &v_min,const int32_t &v_max);
00215
00216
00217 parameters param;
00218 int32_t margin;
00219
00220 int32_t *m1p1,*m2p1,*m1c1,*m2c1;
00221 int32_t *m1p2,*m2p2,*m1c2,*m2c2;
00222 int32_t n1p1,n2p1,n1c1,n2c1;
00223 int32_t n1p2,n2p2,n1c2,n2c2;
00224 uint8_t *I1p,*I2p,*I1c,*I2c;
00225 uint8_t *I1p_du,*I2p_du,*I1c_du,*I2c_du;
00226 uint8_t *I1p_dv,*I2p_dv,*I1c_dv,*I2c_dv;
00227 uint8_t *I1p_du_full,*I2p_du_full,*I1c_du_full,*I2c_du_full;
00228 uint8_t *I1p_dv_full,*I2p_dv_full,*I1c_dv_full,*I2c_dv_full;
00229 int32_t dims_p[3],dims_c[3];
00230
00231 std::vector<Matcher::p_match> p_matched_1;
00232 std::vector<Matcher::p_match> p_matched_2;
00233 std::vector<Matcher::range> ranges;
00234 };
00235
00236 #endif
00237