Skip to content

Commit 4e4dfff

Browse files
authored
Merge pull request opencv#16491 from rayonnant14:objdetect_decodeMulti_issue
* fixed issue with Mat reshape in decodeMulti() * added test for decodeMulti * used assign
1 parent 17fe634 commit 4e4dfff

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

modules/objdetect/src/qrcode.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2304,7 +2304,8 @@ bool QRCodeDetector::decodeMulti(
23042304
CV_Assert((points.size().width % 4) == 0);
23052305
vector< vector< Point2f > > src_points ;
23062306
Mat qr_points = points.getMat();
2307-
for (int i = 0; i < points.size().width ; i += 4)
2307+
qr_points = qr_points.reshape(2, 1);
2308+
for (int i = 0; i < qr_points.size().width ; i += 4)
23082309
{
23092310
vector<Point2f> tempMat = qr_points.colRange(i, i + 4);
23102311
if (contourArea(tempMat) > 0.0)

modules/objdetect/test/test_qrcode.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,26 @@ INSTANTIATE_TEST_CASE_P(/**/, Objdetect_QRCode_Close, testing::ValuesIn(qrcode_i
481481
INSTANTIATE_TEST_CASE_P(/**/, Objdetect_QRCode_Monitor, testing::ValuesIn(qrcode_images_monitor));
482482
INSTANTIATE_TEST_CASE_P(/**/, Objdetect_QRCode_Multi, testing::ValuesIn(qrcode_images_multiple));
483483

484+
TEST(Objdetect_QRCode_decodeMulti, decode_regression_16491)
485+
{
486+
#ifdef HAVE_QUIRC
487+
Mat zero_image = Mat::zeros(256, 256, CV_8UC1);
488+
Point corners_[] = {Point(16, 16), Point(128, 16), Point(128, 128), Point(16, 128),
489+
Point(16, 16), Point(128, 16), Point(128, 128), Point(16, 128)};
490+
std::vector<Point> vec_corners;
491+
int array_size = 8;
492+
vec_corners.assign(corners_, corners_ + array_size);
493+
std::vector<cv::String> decoded_info;
494+
std::vector<Mat> straight_barcode;
495+
QRCodeDetector vec_qrcode;
496+
EXPECT_NO_THROW(vec_qrcode.decodeMulti(zero_image, vec_corners, decoded_info, straight_barcode));
497+
498+
Mat mat_corners(2, 4, CV_32SC2, (void*)&vec_corners[0]);
499+
QRCodeDetector mat_qrcode;
500+
EXPECT_NO_THROW(mat_qrcode.decodeMulti(zero_image, mat_corners, decoded_info, straight_barcode));
501+
#endif
502+
}
503+
484504
TEST(Objdetect_QRCode_basic, not_found_qrcode)
485505
{
486506
std::vector<Point> corners;

0 commit comments

Comments
 (0)