Fix. Now cv::Rect() is the identity under cv::Rect::operator| operation
authorPiotr Semenov <semenov@searchie.org>
Wed, 5 Jul 2017 15:50:07 +0000 (18:50 +0300)
committerPiotr Semenov <semenov@searchie.org>
Wed, 5 Jul 2017 16:01:13 +0000 (19:01 +0300)
modules/core/include/opencv2/core/types.hpp

index be8d0be..ffac2ee 100644 (file)
@@ -1803,12 +1803,17 @@ Rect_<_Tp>& operator &= ( Rect_<_Tp>& a, const Rect_<_Tp>& b )
 template<typename _Tp> static inline
 Rect_<_Tp>& operator |= ( Rect_<_Tp>& a, const Rect_<_Tp>& b )
 {
-    _Tp x1 = std::min(a.x, b.x);
-    _Tp y1 = std::min(a.y, b.y);
-    a.width = std::max(a.x + a.width, b.x + b.width) - x1;
-    a.height = std::max(a.y + a.height, b.y + b.height) - y1;
-    a.x = x1;
-    a.y = y1;
+    if (!a.area()) {
+        a = b;
+    }
+    else if (b.area()) {
+        _Tp x1 = std::min(a.x, b.x);
+        _Tp y1 = std::min(a.y, b.y);
+        a.width = std::max(a.x + a.width, b.x + b.width) - x1;
+        a.height = std::max(a.y + a.height, b.y + b.height) - y1;
+        a.x = x1;
+        a.y = y1;
+    }
     return a;
 }