diff --git a/modules/features/src/sift.dispatch.cpp b/modules/features/src/sift.dispatch.cpp index 6a45d0ec84..01b6c6595f 100644 --- a/modules/features/src/sift.dispatch.cpp +++ b/modules/features/src/sift.dispatch.cpp @@ -977,8 +977,8 @@ void SIFT_Impl::detectAndCompute(InputArray _image, InputArray _mask, if( image.empty() || image.depth() != CV_8U ) CV_Error( Error::StsBadArg, "image is empty or has incorrect depth (!=CV_8U)" ); - if( !mask.empty() && mask.type() != CV_8UC1 ) - CV_Error( Error::StsBadArg, "mask has incorrect type (!=CV_8UC1)" ); + if( !mask.empty() && mask.type() != CV_8UC1 && mask.type() != CV_BoolC1 ) + CV_Error( Error::StsBadArg, "mask has incorrect type (!=CV_8UC1 && !=CV_BoolC1)" ); if( useProvidedKeypoints ) { diff --git a/modules/features/test/test_keypoints.cpp b/modules/features/test/test_keypoints.cpp index 30b2561d3d..adee1e589a 100644 --- a/modules/features/test/test_keypoints.cpp +++ b/modules/features/test/test_keypoints.cpp @@ -155,4 +155,40 @@ TEST(Features2d_Detector_Keypoints_SIFT, validation) } +// See https://github.com/opencv/opencv/issues/25895 +typedef Ptr (*DetectorFactory)(); +typedef testing::TestWithParam Features2d_Detector_Keypoints_BoolMask; + +TEST_P(Features2d_Detector_Keypoints_BoolMask, matches_uchar_mask) +{ + Mat image = imread(cvtest::findDataFile(FEATURES2D_DIR + "/" + IMAGE_FILENAME), IMREAD_GRAYSCALE); + ASSERT_FALSE(image.empty()); + + const Rect roi(image.cols / 4, image.rows / 4, image.cols / 2, image.rows / 2); + + Mat_ mask_bool(image.size(), false); + mask_bool(roi) = true; + ASSERT_EQ(mask_bool.depth(), CV_Bool); + + Mat mask_uchar(image.size(), CV_8UC1, Scalar::all(0)); + mask_uchar(roi) = 255; + + Ptr detector = GetParam()(); + + std::vector kp_bool, kp_uchar; + ASSERT_NO_THROW(detector->detect(image, kp_bool, mask_bool)); + detector->detect(image, kp_uchar, mask_uchar); + + ASSERT_FALSE(kp_uchar.empty()); + ASSERT_EQ(kp_bool.size(), kp_uchar.size()); + for (size_t k = 0; k < kp_bool.size(); k++) + EXPECT_EQ(kp_bool[k].pt, kp_uchar[k].pt) << "keypoint " << k; +} + +INSTANTIATE_TEST_CASE_P(FAST, Features2d_Detector_Keypoints_BoolMask, + Values([]() -> Ptr { return FastFeatureDetector::create(); })); + +INSTANTIATE_TEST_CASE_P(SIFT, Features2d_Detector_Keypoints_BoolMask, + Values([]() -> Ptr { return SIFT::create(); })); + }} // namespace