Skip to content

Commit c1dea84

Browse files
committed
test_stereomatching.cpp: validate min disparity affect on valid ROI
1 parent 678d383 commit c1dea84

File tree

1 file changed

+101
-9
lines changed

1 file changed

+101
-9
lines changed

modules/calib3d/test/test_stereomatching.cpp

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

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

330335
const string RMS_STR = "RMS";
331336
const string BAD_PXLS_FRACTION_STR = "BadPxlsFraction";
337+
const string ROI_STR = "ValidDisparityROI";
332338

333339
class QualityEvalParams
334340
{
@@ -366,16 +372,20 @@ class CV_StereoMatchingTest : public cvtest::BaseTest
366372
protected:
367373
// assumed that left image is a reference image
368374
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
370376

371377
int readDatasetsParams( FileStorage& fs );
372378
virtual int readRunParams( FileStorage& fs );
373379
void writeErrors( const string& errName, const vector<float>& errors, FileStorage* fs = 0 );
380+
void writeROI( const Rect& calcROI, FileStorage* fs = 0 );
374381
void readErrors( FileNode& fn, const string& errName, vector<float>& errors );
382+
void readROI( FileNode& fn, Rect& trueROI );
375383
int compareErrors( const vector<float>& calcErrors, const vector<float>& validErrors,
376384
const vector<float>& eps, const string& errName );
385+
int compareROI( const Rect& calcROI, const Rect& validROI );
377386
int processStereoMatchingResults( FileStorage& fs, int caseIdx, bool isWrite,
378387
const Mat& leftImg, const Mat& rightImg,
388+
const Rect& calcROI,
379389
const Mat& trueLeftDisp, const Mat& trueRightDisp,
380390
const Mat& leftDisp, const Mat& rightDisp,
381391
const QualityEvalParams& qualityEvalParams );
@@ -451,6 +461,7 @@ void CV_StereoMatchingTest::run(int)
451461
Mat rightImg = imread(datasetFullDirName + RIGHT_IMG_NAME);
452462
Mat trueLeftDisp = imread(datasetFullDirName + TRUE_LEFT_DISP_NAME, 0);
453463
Mat trueRightDisp = imread(datasetFullDirName + TRUE_RIGHT_DISP_NAME, 0);
464+
Rect calcROI;
454465

455466
if( leftImg.empty() || rightImg.empty() || trueLeftDisp.empty() )
456467
{
@@ -473,7 +484,7 @@ void CV_StereoMatchingTest::run(int)
473484
}
474485

475486
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);
477488

478489
leftDisp.convertTo( tmp, CV_32FC1 );
479490
leftDisp = tmp;
@@ -484,7 +495,7 @@ void CV_StereoMatchingTest::run(int)
484495
tmp.release();
485496

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

@@ -538,6 +549,7 @@ void calcErrors( const Mat& leftImg, const Mat& /*rightImg*/,
538549

539550
int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int caseIdx, bool isWrite,
540551
const Mat& leftImg, const Mat& rightImg,
552+
const Rect& calcROI,
541553
const Mat& trueLeftDisp, const Mat& trueRightDisp,
542554
const Mat& leftDisp, const Mat& rightDisp,
543555
const QualityEvalParams& qualityEvalParams )
@@ -574,6 +586,8 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
574586
writeErrors( RMS_STR, rmss, &fs );
575587
cvWriteComment( fs.fs, BAD_PXLS_FRACTION_STR.c_str(), 0 );
576588
writeErrors( BAD_PXLS_FRACTION_STR, badPxlsFractions, &fs );
589+
cvWriteComment( fs.fs, ROI_STR.c_str(), 0 );
590+
writeROI( calcROI, &fs );
577591
fs << "}"; // datasetName
578592
}
579593
else // compare
@@ -583,16 +597,22 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
583597
writeErrors( RMS_STR, rmss );
584598
ts->printf( cvtest::TS::LOG, "%s\n", BAD_PXLS_FRACTION_STR.c_str() );
585599
writeErrors( BAD_PXLS_FRACTION_STR, badPxlsFractions );
600+
ts->printf( cvtest::TS::LOG, "%s\n", ROI_STR.c_str() );
601+
writeROI( calcROI );
586602

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

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

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

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

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

674740
class CV_StereoBMTest : public CV_StereoMatchingTest
@@ -685,6 +751,7 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
685751
struct RunParams
686752
{
687753
int ndisp;
754+
int mindisp;
688755
int winSize;
689756
};
690757
vector<RunParams> caseRunParams;
@@ -694,12 +761,13 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
694761
int code = CV_StereoMatchingTest::readRunParams( fs );
695762
FileNode fn = fs.getFirstTopLevelNode();
696763
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 )
698765
{
699766
string caseName = fn[i], datasetName = fn[i+1];
700767
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());
703771
caseNames.push_back( caseName );
704772
caseDatasets.push_back( datasetName );
705773
caseRunParams.push_back( params );
@@ -708,7 +776,7 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
708776
}
709777

710778
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 )
712780
{
713781
RunParams params = caseRunParams[caseIdx];
714782
assert( params.ndisp%16 == 0 );
@@ -717,7 +785,21 @@ class CV_StereoBMTest : public CV_StereoMatchingTest
717785
Mat rightImg; cvtColor( _rightImg, rightImg, CV_BGR2GRAY );
718786

719787
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+
720793
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+
721803
return params.winSize/2;
722804
}
723805
};
@@ -754,7 +836,13 @@ class CV_StereoSGBMTest : public CV_StereoMatchingTest
754836
RunParams params;
755837
string ndisp = fn[i+2]; params.ndisp = atoi(ndisp.c_str());
756838
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+
758846
caseNames.push_back( caseName );
759847
caseDatasets.push_back( datasetName );
760848
caseRunParams.push_back( params );
@@ -763,12 +851,16 @@ class CV_StereoSGBMTest : public CV_StereoMatchingTest
763851
}
764852

765853
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 )
767855
{
768856
RunParams params = caseRunParams[caseIdx];
769857
assert( params.ndisp%16 == 0 );
770858
StereoSGBM sgbm( 0, params.ndisp, params.winSize, 10*params.winSize*params.winSize, 40*params.winSize*params.winSize,
771859
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+
772864
sgbm( leftImg, rightImg, leftDisp );
773865
assert( leftDisp.type() == CV_16SC1 );
774866
leftDisp/=16;

0 commit comments

Comments
 (0)