objdetect: fix test failure of QR code on Aarch64
authorTomoaki Teshima <tomoaki.teshima@gmail.com>
Wed, 24 Oct 2018 00:35:02 +0000 (09:35 +0900)
committerTomoaki Teshima <tomoaki.teshima@gmail.com>
Wed, 24 Oct 2018 00:35:02 +0000 (09:35 +0900)
  * use boundingRect instead of manual loop

modules/objdetect/src/qrcode.cpp

index aa269d9..ac0a142 100644 (file)
@@ -862,6 +862,20 @@ bool QRDecode::updatePerspective()
     return true;
 }
 
+inline Point computeOffset(const vector<Point>& v)
+{
+    // compute the width/height of convex hull
+    Rect areaBox = boundingRect(v);
+
+    // compute the good offset
+    // the box is consisted by 7 steps
+    // to pick the middle of the stripe, it needs to be 1/14 of the size
+    const int cStep = 7 * 2;
+    Point offset = Point(areaBox.width, areaBox.height);
+    offset /= cStep;
+    return offset;
+}
+
 bool QRDecode::versionDefinition()
 {
     LineIterator line_iter(intermediate, Point2f(0, 0), Point2f(test_perspective_size, test_perspective_size));
@@ -879,17 +893,18 @@ bool QRDecode::versionDefinition()
     Mat mask_roi = mask(Range(1, intermediate.rows - 1), Range(1, intermediate.cols - 1));
     findNonZero(mask_roi, non_zero_elem);
     convexHull(Mat(non_zero_elem), locations);
+    Point offset = computeOffset(locations);
 
     Point temp_remote = locations[0], remote_point;
-    const Point delta_diff = Point(4, 4);
+    const Point delta_diff = offset;
     for (size_t i = 0; i < locations.size(); i++)
     {
-        if (norm(black_point - temp_remote) <  norm(black_point - locations[i]))
+        if (norm(black_point - temp_remote) <= norm(black_point - locations[i]))
         {
             const uint8_t value = intermediate.at<uint8_t>(temp_remote - delta_diff);
-            if (value == 0) { remote_point = temp_remote - delta_diff; }
-            else { remote_point = temp_remote; }
             temp_remote = locations[i];
+            if (value == 0) { remote_point = temp_remote - delta_diff; }
+            else { remote_point = temp_remote - (delta_diff / 2); }
         }
     }