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