Skip to content

Commit 87984f2

Browse files
committed
Merge pull request opencv#9854 from opalmirror:test_stereo_min_disparity_master
2 parents 15df161 + 4eb9f17 commit 87984f2

File tree

1 file changed

+95
-9
lines changed

1 file changed

+95
-9
lines changed

modules/calib3d/test/test_stereomatching.cpp

Lines changed: 95 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,15 @@ string ERROR_PREFIXES[] = { "borderedAll",
327327
"borderedTextureless",
328328
"borderedDepthDiscont" }; // size of ERROR_KINDS_COUNT
329329

330+
string ROI_PREFIXES[] = { "roiX",
331+
"roiY",
332+
"roiWidth",
333+
"roiHeight" };
334+
330335

331336
const string RMS_STR = "RMS";
332337
const string BAD_PXLS_FRACTION_STR = "BadPxlsFraction";
338+
const string ROI_STR = "ValidDisparityROI";
333339

334340
class QualityEvalParams
335341
{
@@ -367,16 +373,20 @@ class CV_StereoMatchingTest : public cvtest::BaseTest
367373
protected:
368374
// assumed that left image is a reference image
369375
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
371377

372378
int readDatasetsParams( FileStorage& fs );
373379
virtual int readRunParams( FileStorage& fs );
374380
void writeErrors( const string& errName, const vector<float>& errors, FileStorage* fs = 0 );
381+
void writeROI( const Rect& calcROI, FileStorage* fs = 0 );
375382
void readErrors( FileNode& fn, const string& errName, vector<float>& errors );
383+
void readROI( FileNode& fn, Rect& trueROI );
376384
int compareErrors( const vector<float>& calcErrors, const vector<float>& validErrors,
377385
const vector<float>& eps, const string& errName );
386+
int compareROI( const Rect& calcROI, const Rect& validROI );
378387
int processStereoMatchingResults( FileStorage& fs, int caseIdx, bool isWrite,
379388
const Mat& leftImg, const Mat& rightImg,
389+
const Rect& calcROI,
380390
const Mat& trueLeftDisp, const Mat& trueRightDisp,
381391
const Mat& leftDisp, const Mat& rightDisp,
382392
const QualityEvalParams& qualityEvalParams );
@@ -452,6 +462,7 @@ void CV_StereoMatchingTest::run(int)
452462
Mat rightImg = imread(datasetFullDirName + RIGHT_IMG_NAME);
453463
Mat trueLeftDisp = imread(datasetFullDirName + TRUE_LEFT_DISP_NAME, 0);
454464
Mat trueRightDisp = imread(datasetFullDirName + TRUE_RIGHT_DISP_NAME, 0);
465+
Rect calcROI;
455466

456467
if( leftImg.empty() || rightImg.empty() || trueLeftDisp.empty() )
457468
{
@@ -474,7 +485,7 @@ void CV_StereoMatchingTest::run(int)
474485
}
475486

476487
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);
478489

479490
leftDisp.convertTo( tmp, CV_32FC1 );
480491
leftDisp = tmp;
@@ -485,7 +496,7 @@ void CV_StereoMatchingTest::run(int)
485496
tmp.release();
486497

487498
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));
489500
code = tempCode==cvtest::TS::OK ? code : tempCode;
490501
}
491502

@@ -539,6 +550,7 @@ void calcErrors( const Mat& leftImg, const Mat& /*rightImg*/,
539550

540551
int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int caseIdx, bool isWrite,
541552
const Mat& leftImg, const Mat& rightImg,
553+
const Rect& calcROI,
542554
const Mat& trueLeftDisp, const Mat& trueRightDisp,
543555
const Mat& leftDisp, const Mat& rightDisp,
544556
const QualityEvalParams& qualityEvalParams )
@@ -571,10 +583,12 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
571583
if( isWrite )
572584
{
573585
fs << caseNames[caseIdx] << "{";
574-
//cvWriteComment( fs.fs, RMS_STR.c_str(), 0 );
586+
fs.writeComment( RMS_STR, 0 );
575587
writeErrors( RMS_STR, rmss, &fs );
576-
//cvWriteComment( fs.fs, BAD_PXLS_FRACTION_STR.c_str(), 0 );
588+
fs.writeComment( BAD_PXLS_FRACTION_STR, 0 );
577589
writeErrors( BAD_PXLS_FRACTION_STR, badPxlsFractions, &fs );
590+
fs.writeComment( ROI_STR, 0 );
591+
writeROI( calcROI, &fs );
578592
fs << "}"; // datasetName
579593
}
580594
else // compare
@@ -584,16 +598,22 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
584598
writeErrors( RMS_STR, rmss );
585599
ts->printf( cvtest::TS::LOG, "%s\n", BAD_PXLS_FRACTION_STR.c_str() );
586600
writeErrors( BAD_PXLS_FRACTION_STR, badPxlsFractions );
601+
ts->printf( cvtest::TS::LOG, "%s\n", ROI_STR.c_str() );
602+
writeROI( calcROI );
587603

588604
FileNode fn = fs.getFirstTopLevelNode()[caseNames[caseIdx]];
589605
vector<float> validRmss, validBadPxlsFractions;
606+
Rect validROI;
590607

591608
readErrors( fn, RMS_STR, validRmss );
592609
readErrors( fn, BAD_PXLS_FRACTION_STR, validBadPxlsFractions );
610+
readROI( fn, validROI );
593611
int tempCode = compareErrors( rmss, validRmss, rmsEps, RMS_STR );
594612
code = tempCode==cvtest::TS::OK ? code : tempCode;
595613
tempCode = compareErrors( badPxlsFractions, validBadPxlsFractions, fracEps, BAD_PXLS_FRACTION_STR );
596614
code = tempCode==cvtest::TS::OK ? code : tempCode;
615+
tempCode = compareROI( calcROI, validROI );
616+
code = tempCode==cvtest::TS::OK ? code : tempCode;
597617
}
598618
return code;
599619
}
@@ -643,6 +663,24 @@ void CV_StereoMatchingTest::writeErrors( const string& errName, const vector<flo
643663
ts->printf( cvtest::TS::LOG, "%s = %f\n", string(ERROR_PREFIXES[i]+errName).c_str(), *it );
644664
}
645665

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+
646684
void CV_StereoMatchingTest::readErrors( FileNode& fn, const string& errName, vector<float>& errors )
647685
{
648686
errors.resize( ERROR_KINDS_COUNT );
@@ -651,6 +689,14 @@ void CV_StereoMatchingTest::readErrors( FileNode& fn, const string& errName, vec
651689
fn[ERROR_PREFIXES[i]+errName] >> *it;
652690
}
653691

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+
654700
int CV_StereoMatchingTest::compareErrors( const vector<float>& calcErrors, const vector<float>& validErrors,
655701
const vector<float>& eps, const string& errName )
656702
{
@@ -670,6 +716,26 @@ int CV_StereoMatchingTest::compareErrors( const vector<float>& calcErrors, const
670716
return ok ? cvtest::TS::OK : cvtest::TS::FAIL_BAD_ACCURACY;
671717
}
672718

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+
673739
//----------------------------------- StereoBM test -----------------------------------------------------
674740

675741
class CV_StereoBMTest : public CV_StereoMatchingTest
@@ -686,6 +752,7 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
686752
struct RunParams
687753
{
688754
int ndisp;
755+
int mindisp;
689756
int winSize;
690757
};
691758
vector<RunParams> caseRunParams;
@@ -695,12 +762,13 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
695762
int code = CV_StereoMatchingTest::readRunParams( fs );
696763
FileNode fn = fs.getFirstTopLevelNode();
697764
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 )
699766
{
700767
String caseName = fn[i], datasetName = fn[i+1];
701768
RunParams params;
702769
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());
704772
caseNames.push_back( caseName );
705773
caseDatasets.push_back( datasetName );
706774
caseRunParams.push_back( params );
@@ -709,7 +777,7 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
709777
}
710778

711779
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 )
713781
{
714782
RunParams params = caseRunParams[caseIdx];
715783
assert( params.ndisp%16 == 0 );
@@ -719,8 +787,22 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
719787

720788
Ptr<StereoBM> bm = StereoBM::create( params.ndisp, params.winSize );
721789
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+
722795
bm->compute( leftImg, rightImg, tempDisp );
723796
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+
724806
return params.winSize/2;
725807
}
726808
};
@@ -766,14 +848,18 @@ class CV_StereoSGBMTest : public CV_StereoMatchingTest
766848
}
767849

768850
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 )
770852
{
771853
RunParams params = caseRunParams[caseIdx];
772854
assert( params.ndisp%16 == 0 );
773855
Ptr<StereoSGBM> sgbm = StereoSGBM::create( 0, params.ndisp, params.winSize,
774856
10*params.winSize*params.winSize,
775857
40*params.winSize*params.winSize,
776858
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+
777863
sgbm->compute( leftImg, rightImg, leftDisp );
778864
CV_Assert( leftDisp.type() == CV_16SC1 );
779865
leftDisp/=16;

0 commit comments

Comments
 (0)