diff --git a/modules/imgproc/src/accum.cpp b/modules/imgproc/src/accum.cpp index 64631746ee..b17aa47a5b 100644 --- a/modules/imgproc/src/accum.cpp +++ b/modules/imgproc/src/accum.cpp @@ -238,7 +238,7 @@ void cv::accumulate( InputArray _src, InputOutputArray _dst, InputArray _mask ) int dtype = _dst.type(), ddepth = CV_MAT_DEPTH(dtype), dcn = CV_MAT_CN(dtype); CV_Assert( _src.sameSize(_dst) && dcn == scn ); - CV_Assert( _mask.empty() || (_src.sameSize(_mask) && _mask.type() == CV_8U) ); + CV_Assert( _mask.empty() || (_src.sameSize(_mask) && (_mask.type() == CV_8U || _mask.type() == CV_Bool)) ); CV_OCL_RUN(_src.dims() <= 2 && _dst.isUMat(), ocl_accumulate(_src, noArray(), _dst, 0.0, _mask, ACCUMULATE)) @@ -334,7 +334,7 @@ void cv::accumulateSquare( InputArray _src, InputOutputArray _dst, InputArray _m int dtype = _dst.type(), ddepth = CV_MAT_DEPTH(dtype), dcn = CV_MAT_CN(dtype); CV_Assert( _src.sameSize(_dst) && dcn == scn ); - CV_Assert( _mask.empty() || (_src.sameSize(_mask) && _mask.type() == CV_8U) ); + CV_Assert( _mask.empty() || (_src.sameSize(_mask) && (_mask.type() == CV_8U || _mask.type() == CV_Bool)) ); CV_OCL_RUN(_src.dims() <= 2 && _dst.isUMat(), ocl_accumulate(_src, noArray(), _dst, 0.0, _mask, ACCUMULATE_SQUARE)) @@ -437,7 +437,7 @@ void cv::accumulateProduct( InputArray _src1, InputArray _src2, CV_Assert( _src1.sameSize(_src2) && stype == _src2.type() ); CV_Assert( _src1.sameSize(_dst) && dcn == scn ); - CV_Assert( _mask.empty() || (_src1.sameSize(_mask) && _mask.type() == CV_8U) ); + CV_Assert( _mask.empty() || (_src1.sameSize(_mask) && (_mask.type() == CV_8U || _mask.type() == CV_Bool)) ); CV_OCL_RUN(_src1.dims() <= 2 && _dst.isUMat(), ocl_accumulate(_src1, _src2, _dst, 0.0, _mask, ACCUMULATE_PRODUCT)) @@ -536,7 +536,7 @@ void cv::accumulateWeighted( InputArray _src, InputOutputArray _dst, int dtype = _dst.type(), ddepth = CV_MAT_DEPTH(dtype), dcn = CV_MAT_CN(dtype); CV_Assert( _src.sameSize(_dst) && dcn == scn ); - CV_Assert( _mask.empty() || (_src.sameSize(_mask) && _mask.type() == CV_8U) ); + CV_Assert( _mask.empty() || (_src.sameSize(_mask) && (_mask.type() == CV_8U || _mask.type() == CV_Bool)) ); CV_OCL_RUN(_src.dims() <= 2 && _dst.isUMat(), ocl_accumulate(_src, noArray(), _dst, alpha, _mask, ACCUMULATE_WEIGHTED)) diff --git a/modules/imgproc/src/featureselect.cpp b/modules/imgproc/src/featureselect.cpp index 5b34c36f29..d7524624c5 100644 --- a/modules/imgproc/src/featureselect.cpp +++ b/modules/imgproc/src/featureselect.cpp @@ -298,7 +298,7 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners, CV_INSTRUMENT_REGION(); CV_Assert( qualityLevel > 0 && minDistance >= 0 && maxCorners >= 0 ); - CV_Assert( _mask.empty() || (_mask.type() == CV_8UC1 && _mask.sameSize(_image)) ); + CV_Assert( _mask.empty() || ((_mask.type() == CV_8UC1 || _mask.type() == CV_BoolC1) && _mask.sameSize(_image)) ); CV_OCL_RUN(_image.dims() <= 2 && _image.isUMat(), ocl_goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance, diff --git a/modules/imgproc/src/histogram.cpp b/modules/imgproc/src/histogram.cpp index 5ca5d58437..ce5951f5a0 100644 --- a/modules/imgproc/src/histogram.cpp +++ b/modules/imgproc/src/histogram.cpp @@ -928,7 +928,7 @@ void cv::calcHist( const Mat* images, int nimages, const int* channels, std::vector uniranges; Size imsize; - CV_Assert( mask.empty() || mask.type() == CV_8UC1 ); + CV_Assert( mask.empty() || mask.type() == CV_8UC1 || mask.type() == CV_BoolC1); histPrepareImages( images, nimages, channels, mask, dims, hist.size, ranges, uniform, ptrs, deltas, imsize, uniranges ); const double* _uniranges = uniform ? &uniranges[0] : 0; @@ -1106,7 +1106,7 @@ static void calcHist( const Mat* images, int nimages, const int* channels, std::vector uniranges; Size imsize; - CV_Assert( mask.empty() || mask.type() == CV_8UC1 ); + CV_Assert( mask.empty() || mask.type() == CV_8UC1 || mask.type() == CV_BoolC1 ); histPrepareImages( images, nimages, channels, mask, dims, hist.hdr->size, ranges, uniform, ptrs, deltas, imsize, uniranges ); const double* _uniranges = uniform ? &uniranges[0] : 0; diff --git a/modules/imgproc/test/ocl/test_histogram.cpp b/modules/imgproc/test/ocl/test_histogram.cpp index 30ac95fb3c..c4229d1ce0 100644 --- a/modules/imgproc/test/ocl/test_histogram.cpp +++ b/modules/imgproc/test/ocl/test_histogram.cpp @@ -266,6 +266,34 @@ OCL_TEST_P(CalcHist, Mat) } } +TEST(CalcHistMask, CheckMask) +{ + Mat gray = imread(cvtest::findDataFile("shared/baboon.png"), IMREAD_GRAYSCALE); + ASSERT_FALSE(gray.empty()); + + cv::Rect roi(gray.cols/4, gray.rows/4, gray.cols/2, gray.rows/2); + Mat mask = Mat::zeros(gray.size(), CV_8UC1); + mask(roi).setTo(255); + + Mat mask_bool = Mat::zeros(gray.size(), CV_BoolC1); + mask_bool(roi).setTo(1); + Mat gray_roi = gray(roi); + + const std::vector channels(1, 0); + std::vector histSize(1, 256); + std::vector ranges(2); + ranges[0] = 0; + ranges[1] = 256; + + Mat hist_mask, hist_bool, hist_roi; + cv::calcHist(std::vector(1, gray_roi), channels, Mat(), hist_roi, histSize, ranges, false); + cv::calcHist(std::vector(1, gray), channels, mask, hist_mask, histSize, ranges, false); + cv::calcHist(std::vector(1, gray), channels, mask_bool, hist_bool, histSize, ranges, false); + + EXPECT_MAT_NEAR(hist_roi, hist_mask, 0.0); + EXPECT_MAT_NEAR(hist_mask, hist_bool, 0.0); +} + ///////////////////////////////////////////////////////////////////////////////////// OCL_INSTANTIATE_TEST_CASE_P(Imgproc, CalcBackProject, Combine(Values((MatDepth)CV_8U), Values(1, 2), Bool())); diff --git a/modules/imgproc/test/test_goodfeaturetotrack.cpp b/modules/imgproc/test/test_goodfeaturetotrack.cpp index d6204c0404..b1c5ee9200 100644 --- a/modules/imgproc/test/test_goodfeaturetotrack.cpp +++ b/modules/imgproc/test/test_goodfeaturetotrack.cpp @@ -521,6 +521,29 @@ int CV_GoodFeatureToTTest::validate_test_results( int test_case_idx ) TEST(Imgproc_GoodFeatureToT, accuracy) { CV_GoodFeatureToTTest test; test.safe_run(); } +TEST(Imgproc_GoodFeatureToT, mask) +{ + Mat gray = imread(cvtest::findDataFile("shared/baboon.png"), IMREAD_GRAYSCALE); + ASSERT_FALSE(gray.empty()); + + cv::Rect roi(gray.cols/4, gray.rows/4, gray.cols/2, gray.rows/2); + Mat mask = Mat::zeros(gray.size(), CV_8UC1); + mask(roi).setTo(255); + + Mat mask_bool = Mat::zeros(gray.size(), CV_BoolC1); + mask_bool(roi).setTo(1); + Mat gray_roi = gray(roi); + + Mat corners_mask, corners_bool, corners_ref; + vector ref_quality; + + test_goodFeaturesToTrack(gray, corners_ref, 100, 0.3, 3, mask, ref_quality, 3, 3, false, 0.04); + cv::goodFeaturesToTrack(gray, corners_mask, 100, 0.3, 3, mask); + cv::goodFeaturesToTrack(gray, corners_bool, 100, 0.3, 3, mask_bool); + + EXPECT_MAT_NEAR(corners_mask, corners_ref.t(), 0.0); + EXPECT_MAT_NEAR(corners_mask, corners_bool, 0.0); +} }} // namespace /* End of file. */