@@ -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,43 @@ 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
+ CV_Assert (!disparity_map_left.empty () && (disparity_map_left.channels () == 1 ));
223
+ CV_Assert (!left_view.empty () && (left_view.depth () == CV_8U) && (left_view.channels () == 3 || left_view.channels () == 1 ));
224
+ Mat left, right, filt_disp;
225
+
226
+ if (disparity_map_left.depth () != CV_32F)
227
+ {
228
+ disparity_map_left.getMat ().convertTo (left, CV_32F);
229
+ }
230
+ else
231
+ {
232
+ left = disparity_map_left.getMat ();
233
+ filt_disp = filtered_disparity_map.getMat ();
234
+ }
235
+
236
+ if (!disparity_map_right.empty () && use_confidence)
237
+ {
238
+ if (disparity_map_right.depth () != CV_32F)
239
+ disparity_map_right.getMat ().convertTo (right, CV_32F);
240
+ else
241
+ right = disparity_map_right.getMat ();
242
+ }
243
+
244
+ filter_ (left, left_view, filt_disp, right, ROI);
245
+ if (disparity_map_left.depth () != CV_32F){
246
+ filt_disp.convertTo (filtered_disparity_map, disparity_map_left.depth ());
247
+ }
248
+ }
249
+
250
+ void DisparityWLSFilterImpl::filter_ (InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI)
251
+ {
252
+ CV_Assert ( !disparity_map_left.empty ()
253
+ && ( disparity_map_left.depth () == CV_32F)
254
+ && (disparity_map_left.channels () == 1 ) );
255
+ CV_Assert ( !left_view.empty ()
256
+ && (left_view.depth () == CV_8U)
257
+ && (left_view.channels () == 3 || left_view.channels () == 1 ) );
258
+
223
259
Mat disp,src,dst;
224
260
if (disparity_map_left.size ()!=left_view.size ())
225
261
resize_factor = disparity_map_left.cols ()/(float )left_view.cols ();
@@ -247,6 +283,7 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
247
283
}
248
284
else
249
285
ROI = valid_disp_ROI;
286
+
250
287
disp = Mat (disp_full_size,ROI);
251
288
src = Mat (src_full_size ,ROI);
252
289
filtered_disparity_map.create (disp_full_size.size (), disp_full_size.type ());
@@ -259,24 +296,25 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
259
296
}
260
297
else
261
298
{
262
- CV_Assert ( !disparity_map_right.empty () && (disparity_map_right.depth () == CV_16S) && (disparity_map_right.channels () == 1 ) );
299
+ CV_Assert ( !disparity_map_right.empty ()
300
+ && (disparity_map_right.depth () == CV_32F)
301
+ && (disparity_map_right.channels () == 1 ) );
263
302
CV_Assert ( (disparity_map_left.cols () == disparity_map_right.cols ()) );
264
303
CV_Assert ( (disparity_map_left.rows () == disparity_map_right.rows ()) );
265
304
computeConfidenceMap (disparity_map_left,disparity_map_right);
266
305
Mat disp_full_size = disparity_map_left.getMat ();
267
306
Mat src_full_size = left_view.getMat ();
268
- if (disp_full_size.size !=src_full_size.size )
269
- {
307
+ if (disp_full_size.size !=src_full_size.size ){
270
308
float x_ratio = src_full_size.cols /(float )disp_full_size.cols ;
271
309
float y_ratio = src_full_size.rows /(float )disp_full_size.rows ;
272
310
resize (disp_full_size,disp_full_size,src_full_size.size ());
273
311
disp_full_size = disp_full_size*x_ratio;
274
312
resize (confidence_map,confidence_map,src_full_size.size ());
275
313
ROI = Rect ((int )(valid_disp_ROI.x *x_ratio), (int )(valid_disp_ROI.y *y_ratio),
276
314
(int )(valid_disp_ROI.width *x_ratio),(int )(valid_disp_ROI.height *y_ratio));
277
- }
278
- else
315
+ } else {
279
316
ROI = valid_disp_ROI;
317
+ }
280
318
disp = Mat (disp_full_size,ROI);
281
319
src = Mat (src_full_size ,ROI);
282
320
filtered_disparity_map.create (disp_full_size.size (), disp_full_size.type ());
@@ -286,14 +324,12 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
286
324
Mat conf (confidence_map,ROI);
287
325
288
326
Mat disp_mul_conf;
289
- disp.convertTo (disp_mul_conf,CV_32F);
290
- disp_mul_conf = conf.mul (disp_mul_conf);
327
+ disp_mul_conf = conf.mul (disp);
291
328
Mat conf_filtered;
292
329
Ptr<FastGlobalSmootherFilter> wls = createFastGlobalSmootherFilter (src,lambda,sigma_color);
293
330
wls->filter (disp_mul_conf,disp_mul_conf);
294
331
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);
332
+ dst = disp_mul_conf.mul (1 /(conf_filtered+EPS));
297
333
}
298
334
}
299
335
@@ -305,9 +341,9 @@ wls(&_wls),left_disp(&_left_disp),right_disp(&_right_disp),left_disc(&_left_disc
305
341
306
342
void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator () (const Range& range) const
307
343
{
308
- short * row_left;
344
+ float * row_left;
309
345
float * row_left_conf;
310
- short * row_right;
346
+ float * row_right;
311
347
float * row_right_conf;
312
348
float * row_dst;
313
349
int right_idx;
@@ -318,17 +354,17 @@ void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (c
318
354
int thresh = (int )(wls->resize_factor *wls->LRC_thresh );
319
355
for (int i=start;i<end;i++)
320
356
{
321
- row_left = (short *)left_disp->ptr (i);
357
+ row_left = (float *)left_disp->ptr (i);
322
358
row_left_conf = (float *)left_disc->ptr (i);
323
- row_right = (short *)right_disp->ptr (i);
359
+ row_right = (float *)right_disp->ptr (i);
324
360
row_right_conf = (float *)right_disc->ptr (i);
325
361
row_dst = (float *)dst->ptr (i);
326
362
int j_start = left_ROI.x ;
327
363
int j_end = left_ROI.x +left_ROI.width ;
328
364
int right_end = right_ROI.x +right_ROI.width ;
329
365
for (int j=j_start;j<j_end;j++)
330
366
{
331
- right_idx = j-(row_left[j]>>4 );
367
+ right_idx = j-((( int ) row_left[j]) >>4 );
332
368
if ( right_idx>=right_ROI.x && right_idx<right_end)
333
369
{
334
370
if (abs (row_left[j] + row_right[right_idx])< thresh)
@@ -496,63 +532,41 @@ int readGT(String src_path,OutputArray dst)
496
532
497
533
double computeMSE (InputArray GT, InputArray src, Rect ROI)
498
534
{
499
- CV_Assert ( !GT.empty () && (GT.depth () == CV_16S) && (GT.channels () == 1 ) );
500
- CV_Assert ( !src.empty () && (src.depth () == CV_16S) && (src.channels () == 1 ) );
535
+ CV_Assert ( !GT.empty () && (GT.depth () == CV_16S || GT. depth () == CV_32F ) && (GT.channels () == 1 ) );
536
+ CV_Assert ( !src.empty () && (src.depth () == CV_16S || src. depth () == CV_32F ) && (src.channels () == 1 ) );
501
537
CV_Assert ( src.rows () == GT.rows () && src.cols () == GT.cols () );
502
- double res = 0 ;
503
538
Mat GT_ROI (GT.getMat (), ROI);
504
539
Mat src_ROI (src.getMat (),ROI);
505
- int cnt=0 ;
506
- for (int i=0 ;i<src_ROI.rows ;i++)
507
- for (int j=0 ;j<src_ROI.cols ;j++)
508
- {
509
- if (GT_ROI.at <short >(i,j)!=UNKNOWN_DISPARITY)
510
- {
511
- res += (GT_ROI.at <short >(i,j) - src_ROI.at <short >(i,j))*(GT_ROI.at <short >(i,j) - src_ROI.at <short >(i,j));
512
- cnt++;
513
- }
514
- }
515
- res /= cnt*256 ;
516
- return res;
540
+
541
+ Mat tmp, dtmp, gt_mask = (GT_ROI == UNKNOWN_DISPARITY);
542
+ absdiff (GT_ROI, src_ROI, tmp); tmp.setTo (0 , gt_mask); multiply (tmp, tmp, tmp);
543
+ tmp.convertTo (dtmp, CV_64FC1);
544
+ return sum (dtmp)[0 ] / ((gt_mask.total () - countNonZero (gt_mask))*256 );
517
545
}
518
546
519
547
double computeBadPixelPercent (InputArray GT, InputArray src, Rect ROI, int thresh)
520
548
{
521
- CV_Assert ( !GT.empty () && (GT.depth () == CV_16S) && (GT.channels () == 1 ) );
522
- CV_Assert ( !src.empty () && (src.depth () == CV_16S) && (src.channels () == 1 ) );
549
+ CV_Assert ( !GT.empty () && (GT.depth () == CV_16S || GT. depth () == CV_32F ) && (GT.channels () == 1 ) );
550
+ CV_Assert ( !src.empty () && (src.depth () == CV_16S || src. depth () == CV_32F ) && (src.channels () == 1 ) );
523
551
CV_Assert ( src.rows () == GT.rows () && src.cols () == GT.cols () );
524
- int bad_pixel_num = 0 ;
525
552
Mat GT_ROI (GT.getMat (), ROI);
526
553
Mat src_ROI (src.getMat (),ROI);
527
- int cnt=0 ;
528
- for (int i=0 ;i<src_ROI.rows ;i++)
529
- for (int j=0 ;j<src_ROI.cols ;j++)
530
- {
531
- if (GT_ROI.at <short >(i,j)!=UNKNOWN_DISPARITY)
532
- {
533
- if ( abs (GT_ROI.at <short >(i,j) - src_ROI.at <short >(i,j))>=thresh )
534
- bad_pixel_num++;
535
- cnt++;
536
- }
537
- }
538
- return (100.0 *bad_pixel_num)/cnt;
554
+
555
+ Mat tmp, gt_mask = (GT_ROI == UNKNOWN_DISPARITY);
556
+ absdiff (GT_ROI, src_ROI, tmp); tmp.setTo (0 , gt_mask);
557
+ cv::threshold (tmp, tmp, thresh - 1 , 1 , THRESH_BINARY);
558
+ return (100.0 * countNonZero (tmp)) / (gt_mask.total () - countNonZero (gt_mask));
539
559
}
540
560
541
561
void getDisparityVis (InputArray src,OutputArray dst,double scale)
542
562
{
543
- CV_Assert ( !src.empty () && (src.depth () == CV_16S) && (src.channels () == 1 ) );
563
+ CV_Assert ( !src.empty () && (src.depth () == CV_16S || src. depth () == CV_32F ) && (src.channels () == 1 ) );
544
564
Mat srcMat = src.getMat ();
545
565
dst.create (srcMat.rows ,srcMat.cols ,CV_8UC1);
546
566
Mat& dstMat = dst.getMatRef ();
547
567
548
- for (int i=0 ;i<dstMat.rows ;i++)
549
- for (int j=0 ;j<dstMat.cols ;j++)
550
- {
551
- if (srcMat.at <short >(i,j)==UNKNOWN_DISPARITY)
552
- dstMat.at <unsigned char >(i,j) = 0 ;
553
- else
554
- dstMat.at <unsigned char >(i,j) = saturate_cast<unsigned char >(scale*srcMat.at <short >(i,j)/16.0 );
555
- }
568
+ srcMat.convertTo (dstMat, CV_8UC1, scale / 16.0 );
569
+ dstMat &= (srcMat != UNKNOWN_DISPARITY);
556
570
}
557
571
558
572
}
0 commit comments