1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-29 15:23:05 +04:00

Merge pull request #27644 from asmorkalov:as/bool_mask_imgproc

Bool masks support in imgproc module.
This commit is contained in:
Alexander Smorkalov
2025-08-11 13:53:43 +03:00
committed by GitHub
5 changed files with 58 additions and 7 deletions
+4 -4
View File
@@ -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))
+1 -1
View File
@@ -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,
+2 -2
View File
@@ -928,7 +928,7 @@ void cv::calcHist( const Mat* images, int nimages, const int* channels,
std::vector<double> 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<double> 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;
@@ -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<int> channels(1, 0);
std::vector<int> histSize(1, 256);
std::vector<float> ranges(2);
ranges[0] = 0;
ranges[1] = 256;
Mat hist_mask, hist_bool, hist_roi;
cv::calcHist(std::vector<Mat>(1, gray_roi), channels, Mat(), hist_roi, histSize, ranges, false);
cv::calcHist(std::vector<Mat>(1, gray), channels, mask, hist_mask, histSize, ranges, false);
cv::calcHist(std::vector<Mat>(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()));
@@ -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<float> 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. */