Merge pull request #27837 from jasseeeem:qr-decode-degenerate-quadrilateral-fix

Fix to prevent QR code decoding from throwing exception on degenerate quadrilaterals
This commit is contained in:
Alexander Smorkalov 2025-09-29 10:18:18 +03:00 committed by GitHub
commit 0e88b49a53
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 7 additions and 2 deletions

View File

@ -2958,7 +2958,12 @@ std::string ImplContour::decode(InputArray in, InputArray points, OutputArray st
vector<Point2f> src_points; vector<Point2f> src_points;
points.copyTo(src_points); points.copyTo(src_points);
CV_Assert(src_points.size() == 4); CV_Assert(src_points.size() == 4);
CV_CheckGT(contourArea(src_points), 0.0, "Invalid QR code source points"); if (contourArea(src_points) <= 0.0)
{
if (straight_qrcode.needed())
straight_qrcode.release();
return std::string();
}
QRDecode qrdec(useAlignmentMarkers); QRDecode qrdec(useAlignmentMarkers);
qrdec.init(inarr, src_points); qrdec.init(inarr, src_points);

View File

@ -470,7 +470,7 @@ TEST(Objdetect_QRCode_basic, not_found_qrcode)
QRCodeDetector qrcode; QRCodeDetector qrcode;
EXPECT_FALSE(qrcode.detect(zero_image, corners)); EXPECT_FALSE(qrcode.detect(zero_image, corners));
corners = std::vector<Point>(4); corners = std::vector<Point>(4);
EXPECT_ANY_THROW(qrcode.decode(zero_image, corners, straight_barcode)); EXPECT_NO_THROW(qrcode.decode(zero_image, corners, straight_barcode));
} }
TEST(Objdetect_QRCode_detect, detect_regression_21287) TEST(Objdetect_QRCode_detect, detect_regression_21287)