@@ -327,9 +327,15 @@ string ERROR_PREFIXES[] = { "borderedAll",
327
327
" borderedTextureless" ,
328
328
" borderedDepthDiscont" }; // size of ERROR_KINDS_COUNT
329
329
330
+ string ROI_PREFIXES[] = { " roiX" ,
331
+ " roiY" ,
332
+ " roiWidth" ,
333
+ " roiHeight" };
334
+
330
335
331
336
const string RMS_STR = " RMS" ;
332
337
const string BAD_PXLS_FRACTION_STR = " BadPxlsFraction" ;
338
+ const string ROI_STR = " ValidDisparityROI" ;
333
339
334
340
class QualityEvalParams
335
341
{
@@ -367,16 +373,20 @@ class CV_StereoMatchingTest : public cvtest::BaseTest
367
373
protected:
368
374
// assumed that left image is a reference image
369
375
virtual int runStereoMatchingAlgorithm ( const Mat& leftImg, const Mat& rightImg,
370
- Mat& leftDisp, Mat& rightDisp, int caseIdx ) = 0; // return ignored border width
376
+ Rect & calcROI, Mat& leftDisp, Mat& rightDisp, int caseIdx ) = 0; // return ignored border width
371
377
372
378
int readDatasetsParams ( FileStorage& fs );
373
379
virtual int readRunParams ( FileStorage& fs );
374
380
void writeErrors ( const string& errName, const vector<float >& errors, FileStorage* fs = 0 );
381
+ void writeROI ( const Rect & calcROI, FileStorage* fs = 0 );
375
382
void readErrors ( FileNode& fn, const string& errName, vector<float >& errors );
383
+ void readROI ( FileNode& fn, Rect & trueROI );
376
384
int compareErrors ( const vector<float >& calcErrors, const vector<float >& validErrors,
377
385
const vector<float >& eps, const string& errName );
386
+ int compareROI ( const Rect & calcROI, const Rect & validROI );
378
387
int processStereoMatchingResults ( FileStorage& fs, int caseIdx, bool isWrite,
379
388
const Mat& leftImg, const Mat& rightImg,
389
+ const Rect & calcROI,
380
390
const Mat& trueLeftDisp, const Mat& trueRightDisp,
381
391
const Mat& leftDisp, const Mat& rightDisp,
382
392
const QualityEvalParams& qualityEvalParams );
@@ -452,6 +462,7 @@ void CV_StereoMatchingTest::run(int)
452
462
Mat rightImg = imread (datasetFullDirName + RIGHT_IMG_NAME);
453
463
Mat trueLeftDisp = imread (datasetFullDirName + TRUE_LEFT_DISP_NAME, 0 );
454
464
Mat trueRightDisp = imread (datasetFullDirName + TRUE_RIGHT_DISP_NAME, 0 );
465
+ Rect calcROI;
455
466
456
467
if ( leftImg.empty () || rightImg.empty () || trueLeftDisp.empty () )
457
468
{
@@ -474,7 +485,7 @@ void CV_StereoMatchingTest::run(int)
474
485
}
475
486
476
487
Mat leftDisp, rightDisp;
477
- int ignBorder = max (runStereoMatchingAlgorithm (leftImg, rightImg, leftDisp, rightDisp, ci), EVAL_IGNORE_BORDER);
488
+ int ignBorder = max (runStereoMatchingAlgorithm (leftImg, rightImg, calcROI, leftDisp, rightDisp, ci), EVAL_IGNORE_BORDER);
478
489
479
490
leftDisp.convertTo ( tmp, CV_32FC1 );
480
491
leftDisp = tmp;
@@ -485,7 +496,7 @@ void CV_StereoMatchingTest::run(int)
485
496
tmp.release ();
486
497
487
498
int tempCode = processStereoMatchingResults ( resFS, ci, isWrite,
488
- leftImg, rightImg, trueLeftDisp, trueRightDisp, leftDisp, rightDisp, QualityEvalParams (ignBorder));
499
+ leftImg, rightImg, calcROI, trueLeftDisp, trueRightDisp, leftDisp, rightDisp, QualityEvalParams (ignBorder));
489
500
code = tempCode==cvtest::TS::OK ? code : tempCode;
490
501
}
491
502
@@ -539,6 +550,7 @@ void calcErrors( const Mat& leftImg, const Mat& /*rightImg*/,
539
550
540
551
int CV_StereoMatchingTest::processStereoMatchingResults ( FileStorage& fs, int caseIdx, bool isWrite,
541
552
const Mat& leftImg, const Mat& rightImg,
553
+ const Rect & calcROI,
542
554
const Mat& trueLeftDisp, const Mat& trueRightDisp,
543
555
const Mat& leftDisp, const Mat& rightDisp,
544
556
const QualityEvalParams& qualityEvalParams )
@@ -571,10 +583,12 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
571
583
if ( isWrite )
572
584
{
573
585
fs << caseNames[caseIdx] << " {" ;
574
- // cvWriteComment( fs.fs, RMS_STR.c_str() , 0 );
586
+ fs.writeComment ( RMS_STR, 0 );
575
587
writeErrors ( RMS_STR, rmss, &fs );
576
- // cvWriteComment( fs.fs, BAD_PXLS_FRACTION_STR.c_str() , 0 );
588
+ fs.writeComment ( BAD_PXLS_FRACTION_STR, 0 );
577
589
writeErrors ( BAD_PXLS_FRACTION_STR, badPxlsFractions, &fs );
590
+ fs.writeComment ( ROI_STR, 0 );
591
+ writeROI ( calcROI, &fs );
578
592
fs << " }" ; // datasetName
579
593
}
580
594
else // compare
@@ -584,16 +598,22 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
584
598
writeErrors ( RMS_STR, rmss );
585
599
ts->printf ( cvtest::TS::LOG, " %s\n " , BAD_PXLS_FRACTION_STR.c_str () );
586
600
writeErrors ( BAD_PXLS_FRACTION_STR, badPxlsFractions );
601
+ ts->printf ( cvtest::TS::LOG, " %s\n " , ROI_STR.c_str () );
602
+ writeROI ( calcROI );
587
603
588
604
FileNode fn = fs.getFirstTopLevelNode ()[caseNames[caseIdx]];
589
605
vector<float > validRmss, validBadPxlsFractions;
606
+ Rect validROI;
590
607
591
608
readErrors ( fn, RMS_STR, validRmss );
592
609
readErrors ( fn, BAD_PXLS_FRACTION_STR, validBadPxlsFractions );
610
+ readROI ( fn, validROI );
593
611
int tempCode = compareErrors ( rmss, validRmss, rmsEps, RMS_STR );
594
612
code = tempCode==cvtest::TS::OK ? code : tempCode;
595
613
tempCode = compareErrors ( badPxlsFractions, validBadPxlsFractions, fracEps, BAD_PXLS_FRACTION_STR );
596
614
code = tempCode==cvtest::TS::OK ? code : tempCode;
615
+ tempCode = compareROI ( calcROI, validROI );
616
+ code = tempCode==cvtest::TS::OK ? code : tempCode;
597
617
}
598
618
return code;
599
619
}
@@ -643,6 +663,24 @@ void CV_StereoMatchingTest::writeErrors( const string& errName, const vector<flo
643
663
ts->printf ( cvtest::TS::LOG, " %s = %f\n " , string (ERROR_PREFIXES[i]+errName).c_str (), *it );
644
664
}
645
665
666
+ void CV_StereoMatchingTest::writeROI ( const Rect & calcROI, FileStorage* fs )
667
+ {
668
+ if ( fs )
669
+ {
670
+ *fs << ROI_PREFIXES[0 ] << calcROI.x ;
671
+ *fs << ROI_PREFIXES[1 ] << calcROI.y ;
672
+ *fs << ROI_PREFIXES[2 ] << calcROI.width ;
673
+ *fs << ROI_PREFIXES[3 ] << calcROI.height ;
674
+ }
675
+ else
676
+ {
677
+ ts->printf ( cvtest::TS::LOG, " %s = %d\n " , ROI_PREFIXES[0 ].c_str (), calcROI.x );
678
+ ts->printf ( cvtest::TS::LOG, " %s = %d\n " , ROI_PREFIXES[1 ].c_str (), calcROI.y );
679
+ ts->printf ( cvtest::TS::LOG, " %s = %d\n " , ROI_PREFIXES[2 ].c_str (), calcROI.width );
680
+ ts->printf ( cvtest::TS::LOG, " %s = %d\n " , ROI_PREFIXES[3 ].c_str (), calcROI.height );
681
+ }
682
+ }
683
+
646
684
void CV_StereoMatchingTest::readErrors ( FileNode& fn, const string& errName, vector<float >& errors )
647
685
{
648
686
errors.resize ( ERROR_KINDS_COUNT );
@@ -651,6 +689,14 @@ void CV_StereoMatchingTest::readErrors( FileNode& fn, const string& errName, vec
651
689
fn[ERROR_PREFIXES[i]+errName] >> *it;
652
690
}
653
691
692
+ void CV_StereoMatchingTest::readROI ( FileNode& fn, Rect & validROI )
693
+ {
694
+ fn[ROI_PREFIXES[0 ]] >> validROI.x ;
695
+ fn[ROI_PREFIXES[1 ]] >> validROI.y ;
696
+ fn[ROI_PREFIXES[2 ]] >> validROI.width ;
697
+ fn[ROI_PREFIXES[3 ]] >> validROI.height ;
698
+ }
699
+
654
700
int CV_StereoMatchingTest::compareErrors ( const vector<float >& calcErrors, const vector<float >& validErrors,
655
701
const vector<float >& eps, const string& errName )
656
702
{
@@ -670,6 +716,26 @@ int CV_StereoMatchingTest::compareErrors( const vector<float>& calcErrors, const
670
716
return ok ? cvtest::TS::OK : cvtest::TS::FAIL_BAD_ACCURACY;
671
717
}
672
718
719
+ int CV_StereoMatchingTest::compareROI ( const Rect & calcROI, const Rect & validROI )
720
+ {
721
+ int compare[4 ][2 ] = {
722
+ { calcROI.x , validROI.x },
723
+ { calcROI.y , validROI.y },
724
+ { calcROI.width , validROI.width },
725
+ { calcROI.height , validROI.height },
726
+ };
727
+ bool ok = true ;
728
+ for (int i = 0 ; i < 4 ; i++)
729
+ {
730
+ if (compare[i][0 ] != compare[i][1 ])
731
+ {
732
+ ts->printf ( cvtest::TS::LOG, " bad accuracy of %s (valid=%d; calc=%d)\n " , ROI_PREFIXES[i].c_str (), compare[i][1 ], compare[i][0 ] );
733
+ ok = false ;
734
+ }
735
+ }
736
+ return ok ? cvtest::TS::OK : cvtest::TS::FAIL_BAD_ACCURACY;
737
+ }
738
+
673
739
// ----------------------------------- StereoBM test -----------------------------------------------------
674
740
675
741
class CV_StereoBMTest : public CV_StereoMatchingTest
@@ -686,6 +752,7 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
686
752
struct RunParams
687
753
{
688
754
int ndisp;
755
+ int mindisp;
689
756
int winSize;
690
757
};
691
758
vector<RunParams> caseRunParams;
@@ -695,12 +762,13 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
695
762
int code = CV_StereoMatchingTest::readRunParams ( fs );
696
763
FileNode fn = fs.getFirstTopLevelNode ();
697
764
assert (fn.isSeq ());
698
- for ( int i = 0 ; i < (int )fn.size (); i+=4 )
765
+ for ( int i = 0 ; i < (int )fn.size (); i+=5 )
699
766
{
700
767
String caseName = fn[i], datasetName = fn[i+1 ];
701
768
RunParams params;
702
769
String ndisp = fn[i+2 ]; params.ndisp = atoi (ndisp.c_str ());
703
- String winSize = fn[i+3 ]; params.winSize = atoi (winSize.c_str ());
770
+ String mindisp = fn[i+3 ]; params.mindisp = atoi (mindisp.c_str ());
771
+ String winSize = fn[i+4 ]; params.winSize = atoi (winSize.c_str ());
704
772
caseNames.push_back ( caseName );
705
773
caseDatasets.push_back ( datasetName );
706
774
caseRunParams.push_back ( params );
@@ -709,7 +777,7 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
709
777
}
710
778
711
779
virtual int runStereoMatchingAlgorithm ( const Mat& _leftImg, const Mat& _rightImg,
712
- Mat& leftDisp, Mat& /* rightDisp*/ , int caseIdx )
780
+ Rect & calcROI, Mat& leftDisp, Mat& /* rightDisp*/ , int caseIdx )
713
781
{
714
782
RunParams params = caseRunParams[caseIdx];
715
783
assert ( params.ndisp %16 == 0 );
@@ -719,8 +787,22 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
719
787
720
788
Ptr <StereoBM> bm = StereoBM::create ( params.ndisp , params.winSize );
721
789
Mat tempDisp;
790
+ bm->setMinDisparity (params.mindisp );
791
+
792
+ Rect cROI (0 , 0 , _leftImg.cols , _leftImg.rows );
793
+ calcROI = getValidDisparityROI (cROI, cROI, params.mindisp , params.ndisp , params.winSize );
794
+
722
795
bm->compute ( leftImg, rightImg, tempDisp );
723
796
tempDisp.convertTo (leftDisp, CV_32F, 1 ./StereoMatcher::DISP_SCALE);
797
+
798
+ if (params.mindisp != 0 )
799
+ for (int y = 0 ; y < leftDisp.rows ; y++)
800
+ for (int x = 0 ; x < leftDisp.cols ; x++)
801
+ {
802
+ if (leftDisp.at <float >(y, x) < params.mindisp )
803
+ leftDisp.at <float >(y, x) = -1 ./StereoMatcher::DISP_SCALE; // treat disparity < mindisp as no disparity
804
+ }
805
+
724
806
return params.winSize /2 ;
725
807
}
726
808
};
@@ -766,14 +848,18 @@ class CV_StereoSGBMTest : public CV_StereoMatchingTest
766
848
}
767
849
768
850
virtual int runStereoMatchingAlgorithm ( const Mat& leftImg, const Mat& rightImg,
769
- Mat& leftDisp, Mat& /* rightDisp*/ , int caseIdx )
851
+ Rect & calcROI, Mat& leftDisp, Mat& /* rightDisp*/ , int caseIdx )
770
852
{
771
853
RunParams params = caseRunParams[caseIdx];
772
854
assert ( params.ndisp %16 == 0 );
773
855
Ptr <StereoSGBM> sgbm = StereoSGBM::create ( 0 , params.ndisp , params.winSize ,
774
856
10 *params.winSize *params.winSize ,
775
857
40 *params.winSize *params.winSize ,
776
858
1 , 63 , 10 , 100 , 32 , params.mode );
859
+
860
+ Rect cROI (0 , 0 , leftImg.cols , leftImg.rows );
861
+ calcROI = getValidDisparityROI (cROI, cROI, 0 , params.ndisp , params.winSize );
862
+
777
863
sgbm->compute ( leftImg, rightImg, leftDisp );
778
864
CV_Assert ( leftDisp.type () == CV_16SC1 );
779
865
leftDisp/=16 ;
0 commit comments