diff --git a/modules/objdetect/src/qrcode.cpp b/modules/objdetect/src/qrcode.cpp index 4a6ffcc942..285535e705 100644 --- a/modules/objdetect/src/qrcode.cpp +++ b/modules/objdetect/src/qrcode.cpp @@ -466,16 +466,25 @@ bool QRDetect::localization() CV_TRACE_FUNCTION(); Point2f begin, end; vector list_lines_x = searchHorizontalLines(); - if( list_lines_x.empty() ) { return false; } - vector list_lines_y = separateVerticalLines(list_lines_x); - if( list_lines_y.empty() ) { return false; } - + vector list_lines_y; Mat labels; - kmeans(list_lines_y, 3, labels, - TermCriteria( TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1), - 3, KMEANS_PP_CENTERS, localization_points); + if (!list_lines_x.empty()) + { + list_lines_y = separateVerticalLines(list_lines_x); + if (!list_lines_y.empty()) + { + kmeans(list_lines_y, 3, labels, + TermCriteria( TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1), + 3, KMEANS_PP_CENTERS, localization_points); + + fixationPoints(localization_points); + } + } - fixationPoints(localization_points); + if (labels.empty()) + { + localization_points.clear(); + } bool square_flag = false, local_points_flag = false; double triangle_sides[3]; @@ -1563,9 +1572,9 @@ Point QRDecode::findClosestZeroPoint(Point2f original_point) Point zero_point; const int step = 2; - for (int i = orig_x - step; i >= 0 && i <= orig_x + step; i++) + for (int i = std::max(orig_x - step, 0); i >= 0 && i <= std::min(orig_x + step, bin_barcode.cols - 1); i++) { - for (int j = orig_y - step; j >= 0 && j <= orig_y + step; j++) + for (int j = std::max(orig_y - step, 0); j >= 0 && j <= std::min(orig_y + step, bin_barcode.rows - 1); j++) { Point p(i, j); value = bin_barcode.at(p); @@ -1943,7 +1952,7 @@ vector > QRDecode::computeSpline(const vector &x_arr, const v } for (int i = 0; i < n - 1; i++) { - h[i] = static_cast(y_arr[i + 1] - y_arr[i]); + h[i] = static_cast(y_arr[i + 1] - y_arr[i]) + std::numeric_limits::epsilon(); } for (int i = 1; i < n - 1; i++) { diff --git a/modules/objdetect/test/test_qrcode.cpp b/modules/objdetect/test/test_qrcode.cpp index dc579e8ef3..9f1ea7a800 100644 --- a/modules/objdetect/test/test_qrcode.cpp +++ b/modules/objdetect/test/test_qrcode.cpp @@ -631,4 +631,52 @@ TEST_P(Objdetect_QRCode_detectAndDecodeMulti, detect_regression_24679) EXPECT_EQ(decoded_info.size(), 4U); } +TEST_P(Objdetect_QRCode_detectAndDecodeMulti, detect_regression_24011) +{ + const std::string name_current_image = "issue_24011.jpg"; + const std::string root = "qrcode/"; + + std::string image_path = findDataFile(root + name_current_image); + Mat img = imread(image_path); + const std::string method = GetParam(); + GraphicalCodeDetector qrcode = QRCodeDetector(); + if (method == "aruco_based") { + qrcode = QRCodeDetectorAruco(); + } + std::vector decoded_info; + ASSERT_TRUE(qrcode.detectAndDecodeMulti(img, decoded_info)); + EXPECT_EQ(decoded_info.size(), 2U); +} + +TEST(Objdetect_QRCode_detect, detect_regression_24450) +{ + const std::string name_current_image = "issue_24450.png"; + const std::string root = "qrcode/"; + + std::string image_path = findDataFile(root + name_current_image); + Mat img = imread(image_path); + GraphicalCodeDetector qrcode = QRCodeDetector(); + std::vector points; + ASSERT_TRUE(qrcode.detect(img, points)); + EXPECT_EQ(points.size(), 4U); + img.at(img.rows - 1, 296) = {}; + ASSERT_TRUE(qrcode.detect(img, points)); + EXPECT_EQ(points.size(), 4U); +} + +TEST(Objdetect_QRCode_detect, detect_regression_22892) +{ + const std::string name_current_image = "issue_22892.png"; + const std::string root = "qrcode/"; + + std::string image_path = findDataFile(root + name_current_image); + Mat img = imread(image_path); + + QRCodeDetector qrcode; + std::vector corners; + Mat straight_code; + qrcode.detectAndDecodeCurved(img, corners, straight_code); + EXPECT_EQ(corners.size(), 4U); +} + }} // namespace