@@ -219,16 +219,31 @@ Ptr<DisparityWLSFilterImpl> DisparityWLSFilterImpl::create(bool _use_confidence,
219
219
220
220
void DisparityWLSFilterImpl::filter (InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI, InputArray)
221
221
{
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);
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 ());
232
247
}
233
248
}
234
249
@@ -257,16 +272,17 @@ void DisparityWLSFilterImpl::filter_(InputArray disparity_map_left, InputArray l
257
272
{
258
273
Mat disp_full_size = disparity_map_left.getMat ();
259
274
Mat src_full_size = left_view.getMat ();
260
- if (disp_full_size.size !=src_full_size.size ){
275
+ if (disp_full_size.size !=src_full_size.size )
276
+ {
261
277
float x_ratio = src_full_size.cols /(float )disp_full_size.cols ;
262
278
float y_ratio = src_full_size.rows /(float )disp_full_size.rows ;
263
279
resize (disp_full_size,disp_full_size,src_full_size.size ());
264
280
disp_full_size = disp_full_size*x_ratio;
265
281
ROI = Rect ((int )(valid_disp_ROI.x *x_ratio), (int )(valid_disp_ROI.y *y_ratio),
266
282
(int )(valid_disp_ROI.width *x_ratio),(int )(valid_disp_ROI.height *y_ratio));
267
- } else {
268
- ROI = valid_disp_ROI;
269
283
}
284
+ else
285
+ ROI = valid_disp_ROI;
270
286
271
287
disp = Mat (disp_full_size,ROI);
272
288
src = Mat (src_full_size ,ROI);
@@ -348,7 +364,7 @@ void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (c
348
364
int right_end = right_ROI.x +right_ROI.width ;
349
365
for (int j=j_start;j<j_end;j++)
350
366
{
351
- right_idx = j-((int )row_left[j]);
367
+ right_idx = j-((( int )row_left[j])>> 4 );
352
368
if ( right_idx>=right_ROI.x && right_idx<right_end)
353
369
{
354
370
if (abs (row_left[j] + row_right[right_idx])< thresh)
@@ -519,43 +535,27 @@ double computeMSE(InputArray GT, InputArray src, Rect ROI)
519
535
CV_Assert ( !GT.empty () && (GT.depth () == CV_16S || GT.depth () == CV_32F) && (GT.channels () == 1 ) );
520
536
CV_Assert ( !src.empty () && (src.depth () == CV_16S || src.depth () == CV_32F) && (src.channels () == 1 ) );
521
537
CV_Assert ( src.rows () == GT.rows () && src.cols () == GT.cols () );
522
- double res = 0 ;
523
538
Mat GT_ROI (GT.getMat (), ROI);
524
539
Mat src_ROI (src.getMat (),ROI);
525
- int cnt=0 ;
526
- for (int i=0 ;i<src_ROI.rows ;i++)
527
- for (int j=0 ;j<src_ROI.cols ;j++)
528
- {
529
- if (GT_ROI.at <short >(i,j)!=UNKNOWN_DISPARITY)
530
- {
531
- 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));
532
- cnt++;
533
- }
534
- }
535
- res /= cnt*256 ;
536
- 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 );
537
545
}
538
546
539
547
double computeBadPixelPercent (InputArray GT, InputArray src, Rect ROI, int thresh)
540
548
{
541
549
CV_Assert ( !GT.empty () && (GT.depth () == CV_16S || GT.depth () == CV_32F) && (GT.channels () == 1 ) );
542
550
CV_Assert ( !src.empty () && (src.depth () == CV_16S || src.depth () == CV_32F) && (src.channels () == 1 ) );
543
551
CV_Assert ( src.rows () == GT.rows () && src.cols () == GT.cols () );
544
- int bad_pixel_num = 0 ;
545
552
Mat GT_ROI (GT.getMat (), ROI);
546
553
Mat src_ROI (src.getMat (),ROI);
547
- int cnt=0 ;
548
- for (int i=0 ;i<src_ROI.rows ;i++)
549
- for (int j=0 ;j<src_ROI.cols ;j++)
550
- {
551
- if (GT_ROI.at <short >(i,j)!=UNKNOWN_DISPARITY)
552
- {
553
- if ( abs (GT_ROI.at <short >(i,j) - src_ROI.at <short >(i,j))>=thresh )
554
- bad_pixel_num++;
555
- cnt++;
556
- }
557
- }
558
- 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));
559
559
}
560
560
561
561
void getDisparityVis (InputArray src,OutputArray dst,double scale)
@@ -565,14 +565,8 @@ void getDisparityVis(InputArray src,OutputArray dst,double scale)
565
565
dst.create (srcMat.rows ,srcMat.cols ,CV_8UC1);
566
566
Mat& dstMat = dst.getMatRef ();
567
567
568
- for (int i=0 ;i<dstMat.rows ;i++)
569
- for (int j=0 ;j<dstMat.cols ;j++)
570
- {
571
- if (srcMat.at <short >(i,j)==UNKNOWN_DISPARITY)
572
- dstMat.at <unsigned char >(i,j) = 0 ;
573
- else
574
- dstMat.at <unsigned char >(i,j) = saturate_cast<unsigned char >(scale*srcMat.at <short >(i,j)/16.0 );
575
- }
568
+ srcMat.convertTo (dstMat, CV_8UC1, scale / 16.0 );
569
+ dstMat &= (srcMat != UNKNOWN_DISPARITY);
576
570
}
577
571
578
572
}
0 commit comments