diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index a9fa7ae21..14f4067a9 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -326,7 +326,9 @@ enum AdaptiveThresholdTypes { window) of the \f$\texttt{blockSize} \times \texttt{blockSize}\f$ neighborhood of \f$(x, y)\f$ minus C . The default sigma (standard deviation) is used for the specified blockSize . See cv::getGaussianKernel*/ - ADAPTIVE_THRESH_GAUSSIAN_C = 1 + ADAPTIVE_THRESH_GAUSSIAN_C = 1, + /** Like ADAPTIVE_THRESH_GAUSSIAN_C except that GaussianBlur use CV_32F for blurring to avoid rounding error*/ + ADAPTIVE_THRESH_GAUSSIAN_C_FLOAT = 2 }; //! cv::undistort mode diff --git a/modules/imgproc/src/thresh.cpp b/modules/imgproc/src/thresh.cpp index 490bdff3e..0eae14546 100644 --- a/modules/imgproc/src/thresh.cpp +++ b/modules/imgproc/src/thresh.cpp @@ -1295,11 +1295,19 @@ void cv::adaptiveThreshold( InputArray _src, OutputArray _dst, double maxValue, if( src.data != dst.data ) mean = dst; - if( method == ADAPTIVE_THRESH_MEAN_C ) + if (method == ADAPTIVE_THRESH_MEAN_C) boxFilter( src, mean, src.type(), Size(blockSize, blockSize), Point(-1,-1), true, BORDER_REPLICATE ); - else if( method == ADAPTIVE_THRESH_GAUSSIAN_C ) - GaussianBlur( src, mean, Size(blockSize, blockSize), 0, 0, BORDER_REPLICATE ); + else if (method == ADAPTIVE_THRESH_GAUSSIAN_C) + GaussianBlur(src, mean, Size(blockSize, blockSize), 0, 0, BORDER_REPLICATE); + else if (method == ADAPTIVE_THRESH_GAUSSIAN_C_FLOAT) + { + Mat srcfloat,meanfloat; + src.convertTo(srcfloat,CV_32F); + meanfloat=srcfloat; + GaussianBlur(srcfloat, meanfloat, Size(blockSize, blockSize), 0, 0, BORDER_REPLICATE); + meanfloat.convertTo(dst, src.type()); + } else CV_Error( CV_StsBadFlag, "Unknown/unsupported adaptive threshold method" );