mirror of
https://github.com/opencv/opencv.git
synced 2025-07-26 07:07:37 +08:00
Merge pull request #23275 from genciberisha:bug/issue-23249_detected_but_not_decoded_bug
Added QR_Code data flip support, flip and retry after first ECC failure
This commit is contained in:
commit
e6bd4c9f85
2
3rdparty/quirc/include/quirc.h
vendored
2
3rdparty/quirc/include/quirc.h
vendored
@ -165,6 +165,8 @@ void quirc_extract(const struct quirc *q, int index,
|
|||||||
/* Decode a QR-code, returning the payload data. */
|
/* Decode a QR-code, returning the payload data. */
|
||||||
quirc_decode_error_t quirc_decode(const struct quirc_code *code,
|
quirc_decode_error_t quirc_decode(const struct quirc_code *code,
|
||||||
struct quirc_data *data);
|
struct quirc_data *data);
|
||||||
|
/* flip the QR code horizontaly (mirror flip) */
|
||||||
|
void quirc_flip(struct quirc_code *code);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
15
3rdparty/quirc/src/decode.c
vendored
15
3rdparty/quirc/src/decode.c
vendored
@ -917,3 +917,18 @@ quirc_decode_error_t quirc_decode(const struct quirc_code *code,
|
|||||||
|
|
||||||
return QUIRC_SUCCESS;
|
return QUIRC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void quirc_flip(struct quirc_code *code)
|
||||||
|
{
|
||||||
|
struct quirc_code flipped = {0};
|
||||||
|
unsigned int offset = 0;
|
||||||
|
for (int y = 0; y < code->size; y++) {
|
||||||
|
for (int x = 0; x < code->size; x++) {
|
||||||
|
if (grid_bit(code, y, x)) {
|
||||||
|
flipped.cell_bitmap[offset >> 3u] |= (1u << (offset & 7u));
|
||||||
|
}
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memcpy(&code->cell_bitmap, &flipped.cell_bitmap, sizeof(flipped.cell_bitmap));
|
||||||
|
}
|
||||||
|
@ -2732,6 +2732,12 @@ bool QRDecode::decodingProcess()
|
|||||||
|
|
||||||
quirc_data qr_code_data;
|
quirc_data qr_code_data;
|
||||||
quirc_decode_error_t errorCode = quirc_decode(&qr_code, &qr_code_data);
|
quirc_decode_error_t errorCode = quirc_decode(&qr_code, &qr_code_data);
|
||||||
|
|
||||||
|
if(errorCode == QUIRC_ERROR_DATA_ECC){
|
||||||
|
quirc_flip(&qr_code);
|
||||||
|
errorCode = quirc_decode(&qr_code, &qr_code_data);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorCode != 0) { return false; }
|
if (errorCode != 0) { return false; }
|
||||||
|
|
||||||
for (int i = 0; i < qr_code_data.payload_len; i++)
|
for (int i = 0; i < qr_code_data.payload_len; i++)
|
||||||
|
@ -708,6 +708,38 @@ TEST(Objdetect_QRCode_detect, detect_regression_21287)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Objdetect_QRCode_detect_flipped, regression_23249)
|
||||||
|
{
|
||||||
|
|
||||||
|
const std::vector<std::pair<std::string, std::string>> flipped_images =
|
||||||
|
// image name , expected result
|
||||||
|
{{"flipped_1.png", "The key is /qrcod_OMevpf"},
|
||||||
|
{"flipped_2.png", "A26"}};
|
||||||
|
|
||||||
|
const std::string root = "qrcode/flipped/";
|
||||||
|
|
||||||
|
for(const auto &flipped_image : flipped_images){
|
||||||
|
const std::string &image_name = flipped_image.first;
|
||||||
|
const std::string &expect_msg = flipped_image.second;
|
||||||
|
|
||||||
|
std::string image_path = findDataFile(root + image_name);
|
||||||
|
Mat src = imread(image_path);
|
||||||
|
ASSERT_FALSE(src.empty()) << "Can't read image: " << image_path;
|
||||||
|
QRCodeDetector qrcode;
|
||||||
|
std::vector<Point> corners;
|
||||||
|
Mat straight_barcode;
|
||||||
|
cv::String decoded_info;
|
||||||
|
EXPECT_TRUE(qrcode.detect(src, corners));
|
||||||
|
EXPECT_TRUE(!corners.empty());
|
||||||
|
std::string decoded_msg;
|
||||||
|
#ifdef HAVE_QUIRC
|
||||||
|
EXPECT_NO_THROW(decoded_msg = qrcode.decode(src, corners, straight_barcode));
|
||||||
|
ASSERT_FALSE(straight_barcode.empty()) << "Can't decode qrimage.";
|
||||||
|
EXPECT_EQ(expect_msg, decoded_msg);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// @author Kumataro, https://github.com/Kumataro
|
// @author Kumataro, https://github.com/Kumataro
|
||||||
TEST(Objdetect_QRCode_decode, decode_regression_21929)
|
TEST(Objdetect_QRCode_decode, decode_regression_21929)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user