PICCANTE  0.4
The hottest HDR imaging library!
stereo.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #ifndef PIC_COMPUTER_VISION_STEREO_HPP
19 #define PIC_COMPUTER_VISION_STEREO_HPP
20 
21 #include <vector>
22 #include <random>
23 #include <stdlib.h>
24 
25 #include "../base.hpp"
26 
27 #include "../image.hpp"
28 
29 #include "../filtering/filter_disparity.hpp"
30 #include "../filtering/filter_luminance.hpp"
31 #include "../filtering/filter_gradient.hpp"
32 
33 #include "../util/math.hpp"
34 
35 namespace pic {
36 
40 class Stereo
41 {
42 protected:
46 
48 
49 public:
50 
55  {
56  init(7, 200, 8);
57  }
58 
63  {
65  }
66 
74  {
77 
78  this->kernel_size = kernel_size;
79  this->max_disparity = max_disparity;
80  this->max_cross_check = max_cross_check;
81 
83  }
84 
90  void crossCheck(Image *disp_left, Image *disp_right)
91  {
92  for(int i = 0; i < disp_left->height; i++) {
93 
94  for(int j = 0; j < disp_left->width; j++) {
95 
96  float *dL = (*disp_left)(j, i);
97 
98  if(dL[1] > 0.0f) { // if it is valid
99 
100  int j_forward = int(dL[0]);
101  float *dR = (*disp_right)(j_forward, i);
102 
103  if(dR[1] > 0.0f) { // if it is valid
104  int j_e = int(dR[0]);
105 
106  if(std::abs(j - j_e) > max_cross_check) {
107  dL[0] = 0.0f;
108  dL[1] = -1.0f;
109  }
110  }
111  }
112  }
113  }
114  }
115 
120  static void computeLocalDisparity(Image *disp)
121  {
122  for(int i = 0; i < disp->height; i++) {
123 
124  for(int j = 0; j < disp->width; j++) {
125  float *tmp = (*disp)(j, i);
126 
127  tmp[0] -= float(j);
128  }
129  }
130  }
131 
139  void execute(Image *img_left, Image *img_right,
140  Image *disp_left, Image *disp_right)
141  {
142  if(img_left == NULL || img_right == NULL ||
143  disp_left == NULL || disp_right == NULL) {
144  return;
145  }
146 
147  if(max_disparity < 0) {
148  max_disparity = MIN(img_left->width, img_right->width) >> 1;
149  }
150 
151  auto i_l_l = flt_lum.Process(Single(img_left), NULL);
152  auto i_r_l = flt_lum.Process(Single(img_right), NULL);
153 
154  auto i_l_g = flt_grad.Process(Single(i_l_l), NULL);
155  auto i_r_g = flt_grad.Process(Single(i_r_l), NULL);
156 
157  disp_left = flt_disp.Process(Quad(img_left, img_right, i_l_g, i_r_g), disp_left);
158  disp_right = flt_disp.Process(Quad(img_right, img_left, i_r_g, i_l_g), disp_right);
159 
160  crossCheck(disp_left, disp_right);
161  crossCheck(disp_right, disp_left);
162 
163  computeLocalDisparity(disp_left);
164  computeLocalDisparity(disp_right);
165  }
166 };
167 
168 } // end namespace pic
169 
170 #endif // PIC_COMPUTER_VISION_STEREO_HPP
FilterDisparity flt_disp
Definition: stereo.hpp:45
The Stereo class.
Definition: stereo.hpp:40
Stereo()
Stereo.
Definition: stereo.hpp:54
void update(int maxDisparity, int patchSize, float lambda)
update
Definition: filter_disparity.hpp:160
PIC_INLINE ImageVec Quad(Image *img1, Image *img2, Image *img3, Image *img4)
Triple creates an std::vector which contains img1, img2, img3, and img4; this is for filters input...
Definition: image_vec.hpp:81
virtual Image * Process(ImageVec imgIn, Image *imgOut)
Process.
Definition: filter.hpp:390
FilterGradient flt_grad
Definition: stereo.hpp:44
The FilterLuminance class.
Definition: filter_luminance.hpp:33
int max_disparity
Definition: stereo.hpp:47
FilterLuminance flt_lum
Definition: stereo.hpp:43
int max_cross_check
Definition: stereo.hpp:47
void init(int kernel_size, int max_disparity, int max_cross_check)
init
Definition: stereo.hpp:73
#define MIN(a, b)
Definition: math.hpp:69
The Image class stores an image as buffer of float.
Definition: image.hpp:60
void crossCheck(Image *disp_left, Image *disp_right)
crossCheck
Definition: stereo.hpp:90
int kernel_size
Definition: stereo.hpp:47
PIC_INLINE ImageVec Single(Image *img)
Single creates an std::vector which contains img; this is for filters input.
Definition: image_vec.hpp:36
Definition: bilateral_separation.hpp:25
The FilterGradient class.
Definition: filter_gradient.hpp:30
static void computeLocalDisparity(Image *disp)
computeLocalDisparity
Definition: stereo.hpp:120
The FilterDisparity class.
Definition: filter_disparity.hpp:30
Stereo(int kernel_size, int max_disparity, int max_cross_check)
Stereo.
Definition: stereo.hpp:62
int width
Definition: image.hpp:80
int height
Definition: image.hpp:80
void execute(Image *img_left, Image *img_right, Image *disp_left, Image *disp_right)
execute
Definition: stereo.hpp:139