Skip to content

Commit 9a64c54

Browse files
committed
Merge pull request #1404 from terfendail:Generic_DispFilter
2 parents e8ed375 + 220edb8 commit 9a64c54

File tree

1 file changed

+69
-55
lines changed

1 file changed

+69
-55
lines changed

modules/ximgproc/src/disparity_filters.cpp

Lines changed: 69 additions & 55 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,43 @@ 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+
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+
223259
Mat disp,src,dst;
224260
if(disparity_map_left.size()!=left_view.size())
225261
resize_factor = disparity_map_left.cols()/(float)left_view.cols();
@@ -247,6 +283,7 @@ void DisparityWLSFilterImpl::filter(InputArray disparity_map_left, InputArray le
247283
}
248284
else
249285
ROI = valid_disp_ROI;
286+
250287
disp = Mat(disp_full_size,ROI);
251288
src = Mat(src_full_size ,ROI);
252289
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
259296
}
260297
else
261298
{
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) );
263302
CV_Assert( (disparity_map_left.cols() == disparity_map_right.cols()) );
264303
CV_Assert( (disparity_map_left.rows() == disparity_map_right.rows()) );
265304
computeConfidenceMap(disparity_map_left,disparity_map_right);
266305
Mat disp_full_size = disparity_map_left.getMat();
267306
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){
270308
float x_ratio = src_full_size.cols/(float)disp_full_size.cols;
271309
float y_ratio = src_full_size.rows/(float)disp_full_size.rows;
272310
resize(disp_full_size,disp_full_size,src_full_size.size());
273311
disp_full_size = disp_full_size*x_ratio;
274312
resize(confidence_map,confidence_map,src_full_size.size());
275313
ROI = Rect((int)(valid_disp_ROI.x*x_ratio), (int)(valid_disp_ROI.y*y_ratio),
276314
(int)(valid_disp_ROI.width*x_ratio),(int)(valid_disp_ROI.height*y_ratio));
277-
}
278-
else
315+
} else {
279316
ROI = valid_disp_ROI;
317+
}
280318
disp = Mat(disp_full_size,ROI);
281319
src = Mat(src_full_size ,ROI);
282320
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
286324
Mat conf(confidence_map,ROI);
287325

288326
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);
291328
Mat conf_filtered;
292329
Ptr<FastGlobalSmootherFilter> wls = createFastGlobalSmootherFilter(src,lambda,sigma_color);
293330
wls->filter(disp_mul_conf,disp_mul_conf);
294331
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));
297333
}
298334
}
299335

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

306342
void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (const Range& range) const
307343
{
308-
short* row_left;
344+
float* row_left;
309345
float* row_left_conf;
310-
short* row_right;
346+
float* row_right;
311347
float* row_right_conf;
312348
float* row_dst;
313349
int right_idx;
@@ -318,17 +354,17 @@ void DisparityWLSFilterImpl::ComputeDiscontinuityAwareLRC_ParBody::operator() (c
318354
int thresh = (int)(wls->resize_factor*wls->LRC_thresh);
319355
for(int i=start;i<end;i++)
320356
{
321-
row_left = (short*)left_disp->ptr(i);
357+
row_left = (float*)left_disp->ptr(i);
322358
row_left_conf = (float*)left_disc->ptr(i);
323-
row_right = (short*)right_disp->ptr(i);
359+
row_right = (float*)right_disp->ptr(i);
324360
row_right_conf = (float*)right_disc->ptr(i);
325361
row_dst = (float*)dst->ptr(i);
326362
int j_start = left_ROI.x;
327363
int j_end = left_ROI.x+left_ROI.width;
328364
int right_end = right_ROI.x+right_ROI.width;
329365
for(int j=j_start;j<j_end;j++)
330366
{
331-
right_idx = j-(row_left[j]>>4);
367+
right_idx = j-(((int)row_left[j])>>4);
332368
if( right_idx>=right_ROI.x && right_idx<right_end)
333369
{
334370
if(abs(row_left[j] + row_right[right_idx])< thresh)
@@ -496,63 +532,41 @@ int readGT(String src_path,OutputArray dst)
496532

497533
double computeMSE(InputArray GT, InputArray src, Rect ROI)
498534
{
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) );
501537
CV_Assert( src.rows() == GT.rows() && src.cols() == GT.cols() );
502-
double res = 0;
503538
Mat GT_ROI (GT.getMat(), ROI);
504539
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);
517545
}
518546

519547
double computeBadPixelPercent(InputArray GT, InputArray src, Rect ROI, int thresh)
520548
{
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) );
523551
CV_Assert( src.rows() == GT.rows() && src.cols() == GT.cols() );
524-
int bad_pixel_num = 0;
525552
Mat GT_ROI (GT.getMat(), ROI);
526553
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));
539559
}
540560

541561
void getDisparityVis(InputArray src,OutputArray dst,double scale)
542562
{
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) );
544564
Mat srcMat = src.getMat();
545565
dst.create(srcMat.rows,srcMat.cols,CV_8UC1);
546566
Mat& dstMat = dst.getMatRef();
547567

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);
556570
}
557571

558572
}

0 commit comments

Comments
 (0)