calib3d: chess board - properly detect/handle iCntMaxima=0 case

pull/11590/head
Alexander Alekhin 7 years ago
parent 0a6d190095
commit ad57750d25
  1. 36
      modules/calib3d/src/calibinit.cpp

@ -293,7 +293,7 @@ static bool icvBinarizationHistogramBased( Mat & img )
std::vector<int> piHistSmooth(iNumBins, 0); std::vector<int> piHistSmooth(iNumBins, 0);
std::vector<int> piHistGrad(iNumBins, 0); std::vector<int> piHistGrad(iNumBins, 0);
std::vector<int> piAccumSum(iNumBins, 0); std::vector<int> piAccumSum(iNumBins, 0);
std::vector<int> piMaxPos(20, 0); std::vector<int> piMaxPos; piMaxPos.reserve(20);
int iThresh = 0; int iThresh = 0;
int iIdx; int iIdx;
int iWidth = 1; int iWidth = 1;
@ -319,7 +319,7 @@ static bool icvBinarizationHistogramBased( Mat & img )
{ {
if ( (piHistGrad[i-1] < 0) && (piHistGrad[i] > 0) ) if ( (piHistGrad[i-1] < 0) && (piHistGrad[i] > 0) )
{ {
piMaxPos[iCntMaxima] = i; piMaxPos.push_back(i);
iCntMaxima++; iCntMaxima++;
} }
} }
@ -332,15 +332,35 @@ static bool icvBinarizationHistogramBased( Mat & img )
iSumAroundMax = piHistSmooth[iIdx-1] + piHistSmooth[iIdx] + piHistSmooth[iIdx+1]; iSumAroundMax = piHistSmooth[iIdx-1] + piHistSmooth[iIdx] + piHistSmooth[iIdx+1];
if ( iSumAroundMax < iMaxPix1 && iIdx < 64 ) if ( iSumAroundMax < iMaxPix1 && iIdx < 64 )
{ {
for ( int j=i; j<iCntMaxima-1; j++ ) piMaxPos.erase(piMaxPos.begin() + i);
{
piMaxPos[j] = piMaxPos[j+1];
}
iCntMaxima--; iCntMaxima--;
i--; i--;
} }
} }
if ( iCntMaxima == 1)
CV_Assert((size_t)iCntMaxima == piMaxPos.size());
PRINTF("HIST: MAXIMA COUNT: %d (%d, %d, %d, ...)\n", iCntMaxima,
iCntMaxima > 0 ? piMaxPos[0] : -1,
iCntMaxima > 1 ? piMaxPos[1] : -1,
iCntMaxima > 2 ? piMaxPos[2] : -1);
if (iCntMaxima == 0)
{
// no any maxima inside (except 0 and 255 which are not handled above)
// Does image black-write already?
const int iMaxPix2 = iMaxPix / 2;
for (int sum = 0, i = 0; i < 256; ++i) // select mean intensity
{
sum += piHistIntensity[i];
if (sum > iMaxPix2)
{
iThresh = i;
break;
}
}
}
else if (iCntMaxima == 1)
{ {
iThresh = piMaxPos[0]/2; iThresh = piMaxPos[0]/2;
} }
@ -380,7 +400,7 @@ static bool icvBinarizationHistogramBased( Mat & img )
int iMaxVal = piHistIntensity[piMaxPos[iIdxBGMax]]; int iMaxVal = piHistIntensity[piMaxPos[iIdxBGMax]];
//IF TOO CLOSE TO 255, jump to next maximum //IF TOO CLOSE TO 255, jump to next maximum
if ( piMaxPos[iIdxBGMax] >= 250 && iIdxBGMax < iCntMaxima ) if ( piMaxPos[iIdxBGMax] >= 250 && iIdxBGMax + 1 < iCntMaxima )
{ {
iIdxBGMax++; iIdxBGMax++;
iMaxVal = piHistIntensity[piMaxPos[iIdxBGMax]]; iMaxVal = piHistIntensity[piMaxPos[iIdxBGMax]];

Loading…
Cancel
Save