32 #include <emmintrin.h>
44 enum setting {ROBOTICS,MIDDLEBURY};
50 float support_threshold;
51 int32_t support_texture;
52 int32_t candidate_stepsize;
53 int32_t incon_window_size;
54 int32_t incon_threshold;
55 int32_t incon_min_support;
62 int32_t match_texture;
64 float speckle_sim_threshold;
66 int32_t ipol_gap_width;
68 bool filter_adaptive_mean;
69 bool postprocess_only_left;
75 parameters (setting s=ROBOTICS) {
83 support_threshold = 0.85;
85 candidate_stepsize = 5;
86 incon_window_size = 5;
88 incon_min_support = 5;
97 speckle_sim_threshold = 1;
101 filter_adaptive_mean = 1;
102 postprocess_only_left = 1;
110 support_threshold = 0.95;
111 support_texture = 10;
112 candidate_stepsize = 5;
113 incon_window_size = 5;
115 incon_min_support = 5;
124 speckle_sim_threshold = 1;
126 ipol_gap_width = 5000;
128 filter_adaptive_mean = 0;
129 postprocess_only_left = 0;
136 Elas (parameters param) : param(param) {}
150 bool process (uint8_t* I1,uint8_t* I2,
float* D1,
float* D2,
const int32_t* dims);
158 support_pt(int32_t u,int32_t v,int32_t d):u(u),v(v),d(d){}
165 triangle(int32_t c1,int32_t c2,int32_t c3):c1(c1),c2(c2),c3(c3){}
168 inline uint32_t getAddressOffsetImage (
const int32_t& u,
const int32_t& v,
const int32_t& width) {
172 inline uint32_t getAddressOffsetGrid (
const int32_t& x,
const int32_t& y,
const int32_t& d,
const int32_t& width,
const int32_t& disp_num) {
173 return (y*width+x)*disp_num+d;
177 void removeInconsistentSupportPoints (int16_t* D_can,int32_t D_can_width,int32_t D_can_height);
178 void removeRedundantSupportPoints (int16_t* D_can,int32_t D_can_width,int32_t D_can_height,
179 int32_t redun_max_dist, int32_t redun_threshold,
bool vertical);
180 void addCornerSupportPoints (std::vector<support_pt> &p_support);
181 inline int16_t computeMatchingDisparity (
const int32_t &u,
const int32_t &v,uint8_t* I1_desc,uint8_t* I2_desc,
const bool &right_image);
182 std::vector<support_pt> computeSupportMatches (uint8_t* I1_desc,uint8_t* I2_desc);
185 std::vector<triangle> computeDelaunayTriangulation (std::vector<support_pt> p_support,int32_t right_image);
186 void computeDisparityPlanes (std::vector<support_pt> p_support,std::vector<triangle> &tri,int32_t right_image);
187 void createGrid (std::vector<support_pt> p_support,int32_t* disparity_grid,int32_t* grid_dims,
bool right_image);
190 inline void updatePosteriorMinimum (__m128i* I2_block_addr,
const int32_t &d,
const int32_t &w,
191 const __m128i &xmm1,__m128i &xmm2,int32_t &val,int32_t &min_val,int32_t &min_d);
192 inline void updatePosteriorMinimum (__m128i* I2_block_addr,
const int32_t &d,
193 const __m128i &xmm1,__m128i &xmm2,int32_t &val,int32_t &min_val,int32_t &min_d);
194 inline void findMatch (int32_t &u,int32_t &v,
float &plane_a,
float &plane_b,
float &plane_c,
195 int32_t* disparity_grid,int32_t *grid_dims,uint8_t* I1_desc,uint8_t* I2_desc,
196 int32_t *P,int32_t &plane_radius,
bool &valid,
bool &right_image,
float* D);
197 void computeDisparity (std::vector<support_pt> p_support,std::vector<triangle> tri,int32_t* disparity_grid,int32_t* grid_dims,
198 uint8_t* I1_desc,uint8_t* I2_desc,
bool right_image,
float* D);
201 void leftRightConsistencyCheck (
float* D1,
float* D2);
204 void removeSmallSegments (
float* D);
205 void gapInterpolation (
float* D);
208 void adaptiveMean (
float* D);
209 void median (
float* D);
218 int32_t width,height,bpl;