Merge pull request #22382 from AleksandrPanov:qrcode_x86_arm_34

pull/22425/head
Alexander Smorkalov 2 years ago
commit 56baf4ed87
  1. 12
      modules/objdetect/misc/python/test/test_qrcode_detect.py
  2. 31
      modules/objdetect/perf/perf_qrcode_pipeline.cpp
  3. 14
      modules/objdetect/src/qrcode.cpp
  4. 2
      modules/objdetect/test/test_qrcode.cpp

@ -43,10 +43,10 @@ class qrcode_detector_test(NewOpenCVTests):
retval, decoded_data, points, straight_qrcode = detector.detectAndDecodeMulti(img) retval, decoded_data, points, straight_qrcode = detector.detectAndDecodeMulti(img)
self.assertTrue(retval) self.assertTrue(retval)
self.assertEqual(len(decoded_data), 6) self.assertEqual(len(decoded_data), 6)
self.assertEqual(decoded_data[0], "TWO STEPS FORWARD") self.assertTrue("TWO STEPS FORWARD" in decoded_data)
self.assertEqual(decoded_data[1], "EXTRA") self.assertTrue("EXTRA" in decoded_data)
self.assertEqual(decoded_data[2], "SKIP") self.assertTrue("SKIP" in decoded_data)
self.assertEqual(decoded_data[3], "STEP FORWARD") self.assertTrue("STEP FORWARD" in decoded_data)
self.assertEqual(decoded_data[4], "STEP BACK") self.assertTrue("STEP BACK" in decoded_data)
self.assertEqual(decoded_data[5], "QUESTION") self.assertTrue("QUESTION" in decoded_data)
self.assertEqual(points.shape, (6, 4, 2)) self.assertEqual(points.shape, (6, 4, 2))

@ -55,6 +55,10 @@ PERF_TEST_P_(Perf_Objdetect_QRCode, decode)
typedef ::perf::TestBaseWithParam< std::string > Perf_Objdetect_QRCode_Multi; typedef ::perf::TestBaseWithParam< std::string > Perf_Objdetect_QRCode_Multi;
static inline bool compareCorners(const Point2f& corner1, const Point2f& corner2) {
return corner1.x == corner2.x ? corner1.y < corner2.y : corner1.x < corner2.x;
}
PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti) PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti)
{ {
const std::string name_current_image = GetParam(); const std::string name_current_image = GetParam();
@ -66,9 +70,14 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti)
std::vector<Point2f> corners; std::vector<Point2f> corners;
QRCodeDetector qrcode; QRCodeDetector qrcode;
TEST_CYCLE() ASSERT_TRUE(qrcode.detectMulti(src, corners)); TEST_CYCLE() ASSERT_TRUE(qrcode.detectMulti(src, corners));
sort(corners.begin(), corners.end(), compareCorners);
SANITY_CHECK(corners); SANITY_CHECK(corners);
} }
static inline bool compareQR(const pair<string, Mat>& v1, const pair<string, Mat>& v2) {
return v1.first < v2.first;
}
#ifdef HAVE_QUIRC #ifdef HAVE_QUIRC
PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, decodeMulti) PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, decodeMulti)
{ {
@ -91,15 +100,21 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, decodeMulti)
ASSERT_FALSE(decoded_info[i].empty()); ASSERT_FALSE(decoded_info[i].empty());
} }
} }
std::vector < std::vector< uint8_t > > decoded_info_uint8_t; ASSERT_EQ(decoded_info.size(), straight_barcode.size());
for(size_t i = 0; i < decoded_info.size(); i++) vector<pair<string, Mat> > result;
{ for (size_t i = 0ull; i < decoded_info.size(); i++) {
std::vector< uint8_t > tmp(decoded_info[i].begin(), decoded_info[i].end()); result.push_back(make_pair(decoded_info[i], straight_barcode[i]));
decoded_info_uint8_t.push_back(tmp);
} }
SANITY_CHECK(decoded_info_uint8_t); sort(result.begin(), result.end(), compareQR);
SANITY_CHECK(straight_barcode); vector<vector<uint8_t> > decoded_info_sort;
vector<Mat> straight_barcode_sort;
for (size_t i = 0ull; i < result.size(); i++) {
vector<uint8_t> tmp(result[i].first.begin(), result[i].first.end());
decoded_info_sort.push_back(tmp);
straight_barcode_sort.push_back(result[i].second);
}
SANITY_CHECK(decoded_info_sort);
SANITY_CHECK(straight_barcode_sort);
} }
#endif #endif

@ -136,7 +136,7 @@ void QRDetect::init(const Mat& src, double eps_vertical_, double eps_horizontal_
const int width = cvRound(src.size().width * coeff_expansion); const int width = cvRound(src.size().width * coeff_expansion);
const int height = cvRound(src.size().height * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion);
Size new_size(width, height); Size new_size(width, height);
resize(src, barcode, new_size, 0, 0, INTER_LINEAR); resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT);
} }
else if (min_side > 512.0) else if (min_side > 512.0)
{ {
@ -524,7 +524,7 @@ bool QRDetect::localization()
const int height = cvRound(bin_barcode.size().height * coeff_expansion); const int height = cvRound(bin_barcode.size().height * coeff_expansion);
Size new_size(width, height); Size new_size(width, height);
Mat intermediate; Mat intermediate;
resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT);
bin_barcode = intermediate.clone(); bin_barcode = intermediate.clone();
for (size_t i = 0; i < localization_points.size(); i++) for (size_t i = 0; i < localization_points.size(); i++)
{ {
@ -537,7 +537,7 @@ bool QRDetect::localization()
const int height = cvRound(bin_barcode.size().height / coeff_expansion); const int height = cvRound(bin_barcode.size().height / coeff_expansion);
Size new_size(width, height); Size new_size(width, height);
Mat intermediate; Mat intermediate;
resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT);
bin_barcode = intermediate.clone(); bin_barcode = intermediate.clone();
for (size_t i = 0; i < localization_points.size(); i++) for (size_t i = 0; i < localization_points.size(); i++)
{ {
@ -2764,7 +2764,7 @@ void QRDetectMulti::init(const Mat& src, double eps_vertical_, double eps_horizo
const int width = cvRound(src.size().width * coeff_expansion); const int width = cvRound(src.size().width * coeff_expansion);
const int height = cvRound(src.size().height * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion);
Size new_size(width, height); Size new_size(width, height);
resize(src, barcode, new_size, 0, 0, INTER_LINEAR); resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT);
} }
else if (min_side > 512.0) else if (min_side > 512.0)
{ {
@ -3121,7 +3121,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector<Point2f>& tmp_localizatio
const int height = cvRound(bin_barcode.size().height * coeff_expansion); const int height = cvRound(bin_barcode.size().height * coeff_expansion);
Size new_size(width, height); Size new_size(width, height);
Mat intermediate; Mat intermediate;
resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT);
bin_barcode = intermediate.clone(); bin_barcode = intermediate.clone();
} }
else if (purpose == ZOOMING) else if (purpose == ZOOMING)
@ -3130,7 +3130,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector<Point2f>& tmp_localizatio
const int height = cvRound(bin_barcode.size().height / coeff_expansion); const int height = cvRound(bin_barcode.size().height / coeff_expansion);
Size new_size(width, height); Size new_size(width, height);
Mat intermediate; Mat intermediate;
resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT);
bin_barcode = intermediate.clone(); bin_barcode = intermediate.clone();
} }
else else
@ -3148,7 +3148,7 @@ void QRDetectMulti::findQRCodeContours(vector<Point2f>& tmp_localization_points,
const int width = cvRound(bin_barcode.size().width); const int width = cvRound(bin_barcode.size().width);
const int height = cvRound(bin_barcode.size().height); const int height = cvRound(bin_barcode.size().height);
Size new_size(width, height); Size new_size(width, height);
resize(bar, bar, new_size, 0, 0, INTER_LINEAR); resize(bar, bar, new_size, 0, 0, INTER_LINEAR_EXACT);
blur(bar, blur_image, Size(3, 3)); blur(bar, blur_image, Size(3, 3));
threshold(blur_image, threshold_output, 50, 255, THRESH_BINARY); threshold(blur_image, threshold_output, 50, 255, THRESH_BINARY);

@ -11,7 +11,7 @@ std::string qrcode_images_name[] = {
"version_2_down.jpg", "version_2_left.jpg", "version_2_right.jpg", "version_2_up.jpg", "version_2_top.jpg", "version_2_down.jpg", "version_2_left.jpg", "version_2_right.jpg", "version_2_up.jpg", "version_2_top.jpg",
"version_3_down.jpg", "version_3_left.jpg", "version_3_right.jpg", "version_3_up.jpg", "version_3_top.jpg", "version_3_down.jpg", "version_3_left.jpg", "version_3_right.jpg", "version_3_up.jpg", "version_3_top.jpg",
"version_4_down.jpg", "version_4_left.jpg", "version_4_right.jpg", "version_4_up.jpg", "version_4_top.jpg", "version_4_down.jpg", "version_4_left.jpg", "version_4_right.jpg", "version_4_up.jpg", "version_4_top.jpg",
"version_5_down.jpg", "version_5_left.jpg"/*"version_5_right.jpg"*/, "version_5_down.jpg", "version_5_left.jpg"/*"version_5_right.jpg"*/, "version_5_up.jpg", "version_5_top.jpg",
"russian.jpg", "kanji.jpg", "link_github_ocv.jpg", "link_ocv.jpg", "link_wiki_cv.jpg" "russian.jpg", "kanji.jpg", "link_github_ocv.jpg", "link_ocv.jpg", "link_wiki_cv.jpg"
// version_5_right.jpg DISABLED after tile fix, PR #22025 // version_5_right.jpg DISABLED after tile fix, PR #22025
}; };

Loading…
Cancel
Save