QRcode, change INTER_LINEAR to INTER_LINEAR_EXACT
authorAleksandrPanov <alexander.panov@xperience.ai>
Mon, 15 Aug 2022 07:15:12 +0000 (10:15 +0300)
committerAleksandrPanov <alexander.panov@xperience.ai>
Tue, 16 Aug 2022 07:24:54 +0000 (10:24 +0300)
fix python test_detect_and_decode_multi

fix python test_detect_and_decode_multi, sort QR in multiDetect/multiDecode

enable tests with "version_5_up.jpg", "version_5_top.jpg"

remove lambda

modules/objdetect/misc/python/test/test_qrcode_detect.py
modules/objdetect/perf/perf_qrcode_pipeline.cpp
modules/objdetect/src/qrcode.cpp
modules/objdetect/test/test_qrcode.cpp

index 8a95c8bce56f53512bcf47e5480645c032621651..02379005723cac865a3f8a1843055312949d8fb8 100644 (file)
@@ -43,10 +43,10 @@ class qrcode_detector_test(NewOpenCVTests):
         retval, decoded_data, points, straight_qrcode = detector.detectAndDecodeMulti(img)
         self.assertTrue(retval)
         self.assertEqual(len(decoded_data), 6)
-        self.assertEqual(decoded_data[0], "TWO STEPS FORWARD")
-        self.assertEqual(decoded_data[1], "EXTRA")
-        self.assertEqual(decoded_data[2], "SKIP")
-        self.assertEqual(decoded_data[3], "STEP FORWARD")
-        self.assertEqual(decoded_data[4], "STEP BACK")
-        self.assertEqual(decoded_data[5], "QUESTION")
+        self.assertTrue("TWO STEPS FORWARD" in decoded_data)
+        self.assertTrue("EXTRA" in decoded_data)
+        self.assertTrue("SKIP" in decoded_data)
+        self.assertTrue("STEP FORWARD" in decoded_data)
+        self.assertTrue("STEP BACK" in decoded_data)
+        self.assertTrue("QUESTION" in decoded_data)
         self.assertEqual(points.shape, (6, 4, 2))
index 9e7960d819cc05a4d76674c3a052ddd61abbb4e7..efd7add20448d736b81ee28c4a9b86b7f9d8f47d 100644 (file)
@@ -55,6 +55,10 @@ PERF_TEST_P_(Perf_Objdetect_QRCode, decode)
 
 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)
 {
     const std::string name_current_image = GetParam();
@@ -66,9 +70,14 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti)
     std::vector<Point2f> corners;
     QRCodeDetector qrcode;
     TEST_CYCLE() ASSERT_TRUE(qrcode.detectMulti(src, corners));
+    sort(corners.begin(), corners.end(), compareCorners);
     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
 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());
         }
     }
-    std::vector < std::vector< uint8_t > > decoded_info_uint8_t;
-    for(size_t i = 0; i < decoded_info.size(); i++)
-    {
-        std::vector< uint8_t > tmp(decoded_info[i].begin(), decoded_info[i].end());
-        decoded_info_uint8_t.push_back(tmp);
+    ASSERT_EQ(decoded_info.size(), straight_barcode.size());
+    vector<pair<string, Mat> > result;
+    for (size_t i = 0ull;  i < decoded_info.size(); i++) {
+        result.push_back(make_pair(decoded_info[i], straight_barcode[i]));
     }
-    SANITY_CHECK(decoded_info_uint8_t);
-    SANITY_CHECK(straight_barcode);
-
+    sort(result.begin(), result.end(), compareQR);
+    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
 
index d720f1b80b6f69ce31b8006275f5bbdce4ecda5e..0a4ac5a80c78390881a6095ad0c0d9ea5470b79c 100644 (file)
@@ -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 height = cvRound(src.size().height  * coeff_expansion);
         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)
     {
@@ -524,7 +524,7 @@ bool QRDetect::localization()
         const int height = cvRound(bin_barcode.size().height * coeff_expansion);
         Size new_size(width, height);
         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();
         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);
         Size new_size(width, height);
         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();
         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 height = cvRound(src.size().height  * coeff_expansion);
         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)
     {
@@ -3121,7 +3121,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector<Point2f>& tmp_localizatio
         const int height = cvRound(bin_barcode.size().height * coeff_expansion);
         Size new_size(width, height);
         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();
     }
     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);
         Size new_size(width, height);
         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();
     }
     else
@@ -3148,7 +3148,7 @@ void QRDetectMulti::findQRCodeContours(vector<Point2f>& tmp_localization_points,
     const int width  = cvRound(bin_barcode.size().width);
     const int height = cvRound(bin_barcode.size().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));
     threshold(blur_image, threshold_output, 50, 255, THRESH_BINARY);
 
index b5680387cbd08db32ecb858477d56a2acd3e1b5c..0f50b77b36c6487b117047aa79d4307a6bc95a52 100644 (file)
@@ -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_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_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"
 // version_5_right.jpg DISABLED after tile fix, PR #22025
 };