@@ -122,6 +122,7 @@ class DisparityWLSFilterImpl : public DisparityWLSFilter
122
122
public:
123
123
static Ptr<DisparityWLSFilterImpl> create (bool _use_confidence, int l_offs, int r_offs, int t_offs, int b_offs, int min_disp);
124
124
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);
125
126
126
127
double getLambda () {return lambda;}
127
128
void setLambda (double _lambda) {lambda = _lambda;}
@@ -218,8 +219,28 @@ Ptr<DisparityWLSFilterImpl> DisparityWLSFilterImpl::create(bool _use_confidence,
218
219
219
220
void DisparityWLSFilterImpl::filter (InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI, InputArray)
220
221
{
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
+
223
244
Mat disp,src,dst;
224
245
if (disparity_map_left.size ()!=left_view.size ())
225
246
resize_factor = disparity_map_left.cols ()/(float )left_view.cols ();
@@ -236,17 +257,17 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
236
257
{
237
258
Mat disp_full_size = disparity_map_left.getMat ();
238
259
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 ){
241
261
float x_ratio = src_full_size.cols /(float )disp_full_size.cols ;
242
262
float y_ratio = src_full_size.rows /(float )disp_full_size.rows ;
243
263
resize (disp_full_size,disp_full_size,src_full_size.size ());
244
264
disp_full_size = disp_full_size*x_ratio;
245
265
ROI = Rect ((int )(valid_disp_ROI.x *x_ratio), (int )(valid_disp_ROI.y *y_ratio),
246
266
(int )(valid_disp_ROI.width *x_ratio),(int )(valid_disp_ROI.height *y_ratio));
247
- }
248
- else
267
+ } else {
249
268
ROI = valid_disp_ROI;
269
+ }
270
+
250
271
disp = Mat (disp_full_size,ROI);
251
272
src = Mat (src_full_size ,ROI);
252
273
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
259
280
}
260
281
else
261
282
{
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 ) );
263
286
CV_Assert ( (disparity_map_left.cols () == disparity_map_right.cols ()) );
264
287
CV_Assert ( (disparity_map_left.rows () == disparity_map_right.rows ()) );
265
288
computeConfidenceMap (disparity_map_left,disparity_map_right);
266
289
Mat disp_full_size = disparity_map_left.getMat ();
267
290
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 ){
270
292
float x_ratio = src_full_size.cols /(float )disp_full_size.cols ;
271
293
float y_ratio = src_full_size.rows /(float )disp_full_size.rows ;
272
294
resize (disp_full_size,disp_full_size,src_full_size.size ());
273
295
disp_full_size = disp_full_size*x_ratio;
274
296
resize (confidence_map,confidence_map,src_full_size.size ());
275
297
ROI = Rect ((int )(valid_disp_ROI.x *x_ratio), (int )(valid_disp_ROI.y *y_ratio),
276
298
(int )(valid_disp_ROI.width *x_ratio),(int )(valid_disp_ROI.height *y_ratio));
277
- }
278
- else
299
+ } else {
279
300
ROI = valid_disp_ROI;
301
+ }
280
302
disp = Mat (disp_full_size,ROI);
281
303
src = Mat (src_full_size ,ROI);
282
304
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
286
308
Mat conf (confidence_map,ROI);
287
309
288
310
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);
291
312
Mat conf_filtered;
292
313
Ptr<FastGlobalSmootherFilter> wls = createFastGlobalSmootherFilter (src,lambda,sigma_color);
293
314
wls->filter (disp_mul_conf,disp_mul_conf);
294
315
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));
297
317
}
298
318
}
299
319
@@ -305,9 +325,9 @@ wls(&_wls),left_disp(&_left_disp),right_disp(&_right_disp),left_disc(&_left_disc
305
325
306
326
void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator () (const Range& range) const
307
327
{
308
- short * row_left;
328
+ float * row_left;
309
329
float * row_left_conf;
310
- short * row_right;
330
+ float * row_right;
311
331
float * row_right_conf;
312
332
float * row_dst;
313
333
int right_idx;
@@ -318,17 +338,17 @@ void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (c
318
338
int thresh = (int )(wls->resize_factor *wls->LRC_thresh );
319
339
for (int i=start;i<end;i++)
320
340
{
321
- row_left = (short *)left_disp->ptr (i);
341
+ row_left = (float *)left_disp->ptr (i);
322
342
row_left_conf = (float *)left_disc->ptr (i);
323
- row_right = (short *)right_disp->ptr (i);
343
+ row_right = (float *)right_disp->ptr (i);
324
344
row_right_conf = (float *)right_disc->ptr (i);
325
345
row_dst = (float *)dst->ptr (i);
326
346
int j_start = left_ROI.x ;
327
347
int j_end = left_ROI.x +left_ROI.width ;
328
348
int right_end = right_ROI.x +right_ROI.width ;
329
349
for (int j=j_start;j<j_end;j++)
330
350
{
331
- right_idx = j-(row_left[j]>> 4 );
351
+ right_idx = j-(( int ) row_left[j]);
332
352
if ( right_idx>=right_ROI.x && right_idx<right_end)
333
353
{
334
354
if (abs (row_left[j] + row_right[right_idx])< thresh)
0 commit comments