Skip to content

Commit 138bd0c

Browse files
author
Leonardo Brás
committed
Changing filter so it treats every type() of disparity Matrix.
1 parent 159534a commit 138bd0c

File tree

1 file changed

+40
-20
lines changed

1 file changed

+40
-20
lines changed

modules/ximgproc/src/disparity_filters.cpp

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ class DisparityWLSFilterImpl : public DisparityWLSFilter
122122
public:
123123
static Ptr<DisparityWLSFilterImpl> create(bool _use_confidence, int l_offs, int r_offs, int t_offs, int b_offs, int min_disp);
124124
void filter(InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI, InputArray);
125+
void filter_(InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI);
125126

126127
double getLambda() {return lambda;}
127128
void setLambda(double _lambda) {lambda = _lambda;}
@@ -218,8 +219,28 @@ Ptr<DisparityWLSFilterImpl> DisparityWLSFilterImpl::create(bool _use_confidence,
218219

219220
void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI, InputArray)
220221
{
221-
CV_Assert( !disparity_map_left.empty() && (disparity_map_left.depth() == CV_16S) && (disparity_map_left.channels() == 1) );
222-
CV_Assert( !left_view.empty() && (left_view.depth() == CV_8U) && (left_view.channels() == 3 || left_view.channels() == 1) );
222+
Mat left = disparity_map_left.getMat();
223+
if (left.type() == CV_32F){
224+
filter_(disparity_map_left, left_view, filtered_disparity_map, disparity_map_right, ROI);
225+
} else {
226+
Mat left_c, right_c, filt_disp;
227+
left.convertTo(left_c, CV_32F);
228+
if(!disparity_map_right.empty())
229+
disparity_map_right.getMat().convertTo(right_c, CV_32F);
230+
filter_(left_c, left_view, filt_disp, right_c, ROI);
231+
filt_disp.convertTo(filtered_disparity_map, CV_32F);
232+
}
233+
}
234+
235+
void DisparityWLSFilterImpl::filter_(InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI)
236+
{
237+
CV_Assert( !disparity_map_left.empty()
238+
&& ( disparity_map_left.depth() == CV_32F)
239+
&& (disparity_map_left.channels() == 1) );
240+
CV_Assert( !left_view.empty()
241+
&& (left_view.depth() == CV_8U)
242+
&& (left_view.channels() == 3 || left_view.channels() == 1) );
243+
223244
Mat disp,src,dst;
224245
if(disparity_map_left.size()!=left_view.size())
225246
resize_factor = disparity_map_left.cols()/(float)left_view.cols();
@@ -236,17 +257,17 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
236257
{
237258
Mat disp_full_size = disparity_map_left.getMat();
238259
Mat src_full_size = left_view.getMat();
239-
if(disp_full_size.size!=src_full_size.size)
240-
{
260+
if(disp_full_size.size!=src_full_size.size){
241261
float x_ratio = src_full_size.cols/(float)disp_full_size.cols;
242262
float y_ratio = src_full_size.rows/(float)disp_full_size.rows;
243263
resize(disp_full_size,disp_full_size,src_full_size.size());
244264
disp_full_size = disp_full_size*x_ratio;
245265
ROI = Rect((int)(valid_disp_ROI.x*x_ratio), (int)(valid_disp_ROI.y*y_ratio),
246266
(int)(valid_disp_ROI.width*x_ratio),(int)(valid_disp_ROI.height*y_ratio));
247-
}
248-
else
267+
} else {
249268
ROI = valid_disp_ROI;
269+
}
270+
250271
disp = Mat(disp_full_size,ROI);
251272
src = Mat(src_full_size ,ROI);
252273
filtered_disparity_map.create(disp_full_size.size(), disp_full_size.type());
@@ -259,24 +280,25 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
259280
}
260281
else
261282
{
262-
CV_Assert( !disparity_map_right.empty() && (disparity_map_right.depth() == CV_16S) && (disparity_map_right.channels() == 1) );
283+
CV_Assert( !disparity_map_right.empty()
284+
&& (disparity_map_right.depth() == CV_32F)
285+
&& (disparity_map_right.channels() == 1) );
263286
CV_Assert( (disparity_map_left.cols() == disparity_map_right.cols()) );
264287
CV_Assert( (disparity_map_left.rows() == disparity_map_right.rows()) );
265288
computeConfidenceMap(disparity_map_left,disparity_map_right);
266289
Mat disp_full_size = disparity_map_left.getMat();
267290
Mat src_full_size = left_view.getMat();
268-
if(disp_full_size.size!=src_full_size.size)
269-
{
291+
if(disp_full_size.size!=src_full_size.size){
270292
float x_ratio = src_full_size.cols/(float)disp_full_size.cols;
271293
float y_ratio = src_full_size.rows/(float)disp_full_size.rows;
272294
resize(disp_full_size,disp_full_size,src_full_size.size());
273295
disp_full_size = disp_full_size*x_ratio;
274296
resize(confidence_map,confidence_map,src_full_size.size());
275297
ROI = Rect((int)(valid_disp_ROI.x*x_ratio), (int)(valid_disp_ROI.y*y_ratio),
276298
(int)(valid_disp_ROI.width*x_ratio),(int)(valid_disp_ROI.height*y_ratio));
277-
}
278-
else
299+
} else {
279300
ROI = valid_disp_ROI;
301+
}
280302
disp = Mat(disp_full_size,ROI);
281303
src = Mat(src_full_size ,ROI);
282304
filtered_disparity_map.create(disp_full_size.size(), disp_full_size.type());
@@ -286,14 +308,12 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
286308
Mat conf(confidence_map,ROI);
287309

288310
Mat disp_mul_conf;
289-
disp.convertTo(disp_mul_conf,CV_32F);
290-
disp_mul_conf = conf.mul(disp_mul_conf);
311+
disp_mul_conf = conf.mul(disp);
291312
Mat conf_filtered;
292313
Ptr<FastGlobalSmootherFilter> wls = createFastGlobalSmootherFilter(src,lambda,sigma_color);
293314
wls->filter(disp_mul_conf,disp_mul_conf);
294315
wls->filter(conf,conf_filtered);
295-
disp_mul_conf = disp_mul_conf.mul(1/(conf_filtered+EPS));
296-
disp_mul_conf.convertTo(dst,CV_16S);
316+
dst = disp_mul_conf.mul(1/(conf_filtered+EPS));
297317
}
298318
}
299319

@@ -305,9 +325,9 @@ wls(&_wls),left_disp(&_left_disp),right_disp(&_right_disp),left_disc(&_left_disc
305325

306326
void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (const Range& range) const
307327
{
308-
short* row_left;
328+
float* row_left;
309329
float* row_left_conf;
310-
short* row_right;
330+
float* row_right;
311331
float* row_right_conf;
312332
float* row_dst;
313333
int right_idx;
@@ -318,17 +338,17 @@ void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (c
318338
int thresh = (int)(wls->resize_factor*wls->LRC_thresh);
319339
for(int i=start;i<end;i++)
320340
{
321-
row_left = (short*)left_disp->ptr(i);
341+
row_left = (float*)left_disp->ptr(i);
322342
row_left_conf = (float*)left_disc->ptr(i);
323-
row_right = (short*)right_disp->ptr(i);
343+
row_right = (float*)right_disp->ptr(i);
324344
row_right_conf = (float*)right_disc->ptr(i);
325345
row_dst = (float*)dst->ptr(i);
326346
int j_start = left_ROI.x;
327347
int j_end = left_ROI.x+left_ROI.width;
328348
int right_end = right_ROI.x+right_ROI.width;
329349
for(int j=j_start;j<j_end;j++)
330350
{
331-
right_idx = j-(row_left[j]>>4);
351+
right_idx = j-((int)row_left[j]);
332352
if( right_idx>=right_ROI.x && right_idx<right_end)
333353
{
334354
if(abs(row_left[j] + row_right[right_idx])< thresh)

0 commit comments

Comments
 (0)