diff --git a/modules/objdetect/src/qrcode.cpp b/modules/objdetect/src/qrcode.cpp index 71dd9d8257..4a6ffcc942 100644 --- a/modules/objdetect/src/qrcode.cpp +++ b/modules/objdetect/src/qrcode.cpp @@ -3070,7 +3070,10 @@ protected: { bool operator()(const Point2f& a, const Point2f& b) const { - return a.y < b.y; + if (a.y != b.y) + return a.y < b.y; + else + return a.x < b.x; } }; struct compareSquare diff --git a/modules/objdetect/test/test_qrcode.cpp b/modules/objdetect/test/test_qrcode.cpp index 63b50a2a59..dc579e8ef3 100644 --- a/modules/objdetect/test/test_qrcode.cpp +++ b/modules/objdetect/test/test_qrcode.cpp @@ -614,4 +614,21 @@ TEST(Objdetect_QRCode_detectAndDecode, utf8_output) EXPECT_NE(decoded_info.find("M\xc3\xbcllheimstrasse"), std::string::npos); } +TEST_P(Objdetect_QRCode_detectAndDecodeMulti, detect_regression_24679) +{ + const std::string name_current_image = "issue_24679.png"; + 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(), 4U); +} + }} // namespace