diff --git a/modules/objdetect/src/qrcode.cpp b/modules/objdetect/src/qrcode.cpp index c20385d7b6..ef74a80393 100644 --- a/modules/objdetect/src/qrcode.cpp +++ b/modules/objdetect/src/qrcode.cpp @@ -3454,8 +3454,10 @@ int QRDetectMulti::findNumberLocalizationPoints(vector& tmp_localizatio Mat tmp_shrinking = bin_barcode; int tmp_num_points = 0; int num_points = -1; - for (eps_horizontal = 0.1; eps_horizontal < 0.4; eps_horizontal += 0.1) + double eps = 0.0; + for (int epsCoeff = 1; epsCoeff <= 3; epsCoeff++) { + eps = eps_horizontal * static_cast(epsCoeff); tmp_num_points = 0; num_points = -1; if (purpose == SHRINKING) @@ -3480,7 +3482,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector& tmp_localizatio else break; } - vector list_lines_y = extractVerticalLines(list_lines_x, eps_horizontal); + vector list_lines_y = extractVerticalLines(list_lines_x, eps); if (list_lines_y.size() < 3) { if (k == 0) @@ -3490,7 +3492,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector& tmp_localizatio list_lines_x = searchHorizontalLines(); if (list_lines_x.empty()) break; - list_lines_y = extractVerticalLines(list_lines_x, eps_horizontal); + list_lines_y = extractVerticalLines(list_lines_x, eps); if (list_lines_y.size() < 3) break; } @@ -3568,7 +3570,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector& tmp_localizatio vector list_lines_x = searchHorizontalLines(); if (list_lines_x.empty()) return num_points; - vector list_lines_y = extractVerticalLines(list_lines_x, eps_horizontal); + vector list_lines_y = extractVerticalLines(list_lines_x, eps); if (list_lines_y.size() < 3) return num_points; if (num_points < 3) diff --git a/modules/objdetect/test/test_qrcode.cpp b/modules/objdetect/test/test_qrcode.cpp index 3830439765..c49480d38f 100644 --- a/modules/objdetect/test/test_qrcode.cpp +++ b/modules/objdetect/test/test_qrcode.cpp @@ -679,4 +679,40 @@ TEST(Objdetect_QRCode_detect, detect_regression_22892) EXPECT_EQ(corners.size(), 4U); } +// See https://github.com/opencv/opencv/issues/27783 +TEST(Objdetect_QRCode_detect, detect_regression_27783) +{ + const std::string name_current_image = "9_qrcodes.jpg"; + const std::string root = "qrcode/multiple/"; + + std::string image_path = findDataFile(root + name_current_image); + Mat src = imread(image_path); + ASSERT_FALSE(src.empty()) << "Can't read image: " << image_path; + + std::vector info; + std::vector corners; + + { + // If default, we can decode 9 QRs. + QRCodeDetector qrcode; + EXPECT_TRUE(qrcode.detectAndDecodeMulti(src, info, corners)); + ASSERT_EQ(info.size(), 9UL); + ASSERT_EQ(corners.size(), 36UL); + } + + { + // If setEpsX is too small, we can decode no QRs. + QRCodeDetector qrcode; + qrcode.setEpsX(0.01); + EXPECT_FALSE(qrcode.detectAndDecodeMulti(src, info, corners)); + } + + { + // If setEpsY is too small, we can decode no QRs. + QRCodeDetector qrcode; + qrcode.setEpsY(0.01); + EXPECT_FALSE(qrcode.detectAndDecodeMulti(src, info, corners)); + } +} + }} // namespace