Skip to content

Commit 220edb8

Browse files
committed
Updated 32F disparity matrix handling
1 parent a8670a9 commit 220edb8

File tree

1 file changed

+42
-48
lines changed

1 file changed

+42
-48
lines changed

modules/ximgproc/src/disparity_filters.cpp

Lines changed: 42 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -219,16 +219,31 @@ Ptr<DisparityWLSFilterImpl> DisparityWLSFilterImpl::create(bool _use_confidence,
219219

220220
void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray left_view, OutputArray filtered_disparity_map, InputArray disparity_map_right, Rect ROI, InputArray)
221221
{
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());
232247
}
233248
}
234249

@@ -257,16 +272,17 @@ void DisparityWLSFilterImpl::filter_(InputArray disparity_map_left, InputArray l
257272
{
258273
Mat disp_full_size = disparity_map_left.getMat();
259274
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+
{
261277
float x_ratio = src_full_size.cols/(float)disp_full_size.cols;
262278
float y_ratio = src_full_size.rows/(float)disp_full_size.rows;
263279
resize(disp_full_size,disp_full_size,src_full_size.size());
264280
disp_full_size = disp_full_size*x_ratio;
265281
ROI = Rect((int)(valid_disp_ROI.x*x_ratio), (int)(valid_disp_ROI.y*y_ratio),
266282
(int)(valid_disp_ROI.width*x_ratio),(int)(valid_disp_ROI.height*y_ratio));
267-
} else {
268-
ROI = valid_disp_ROI;
269283
}
284+
else
285+
ROI = valid_disp_ROI;
270286

271287
disp = Mat(disp_full_size,ROI);
272288
src = Mat(src_full_size ,ROI);
@@ -348,7 +364,7 @@ void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (c
348364
int right_end = right_ROI.x+right_ROI.width;
349365
for(int j=j_start;j<j_end;j++)
350366
{
351-
right_idx = j-((int)row_left[j]);
367+
right_idx = j-(((int)row_left[j])>>4);
352368
if( right_idx>=right_ROI.x && right_idx<right_end)
353369
{
354370
if(abs(row_left[j] + row_right[right_idx])< thresh)
@@ -519,43 +535,27 @@ double computeMSE(InputArray GT, InputArray src, Rect ROI)
519535
CV_Assert( !GT.empty() && (GT.depth() == CV_16S || GT.depth() == CV_32F) && (GT.channels() == 1) );
520536
CV_Assert( !src.empty() && (src.depth() == CV_16S || src.depth() == CV_32F) && (src.channels() == 1) );
521537
CV_Assert( src.rows() == GT.rows() && src.cols() == GT.cols() );
522-
double res = 0;
523538
Mat GT_ROI (GT.getMat(), ROI);
524539
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);
537545
}
538546

539547
double computeBadPixelPercent(InputArray GT, InputArray src, Rect ROI, int thresh)
540548
{
541549
CV_Assert( !GT.empty() && (GT.depth() == CV_16S || GT.depth() == CV_32F) && (GT.channels() == 1) );
542550
CV_Assert( !src.empty() && (src.depth() == CV_16S || src.depth() == CV_32F) && (src.channels() == 1) );
543551
CV_Assert( src.rows() == GT.rows() && src.cols() == GT.cols() );
544-
int bad_pixel_num = 0;
545552
Mat GT_ROI (GT.getMat(), ROI);
546553
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));
559559
}
560560

561561
void getDisparityVis(InputArray src,OutputArray dst,double scale)
@@ -565,14 +565,8 @@ void getDisparityVis(InputArray src,OutputArray dst,double scale)
565565
dst.create(srcMat.rows,srcMat.cols,CV_8UC1);
566566
Mat& dstMat = dst.getMatRef();
567567

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);
576570
}
577571

578572
}

0 commit comments

Comments
 (0)