diff --git a/modules/core/include/opencv2/core/types.hpp b/modules/core/include/opencv2/core/types.hpp index 63232e324c..ef9ab59383 100644 --- a/modules/core/include/opencv2/core/types.hpp +++ b/modules/core/include/opencv2/core/types.hpp @@ -1884,8 +1884,11 @@ Rect_<_Tp>& operator += ( Rect_<_Tp>& a, const Size_<_Tp>& b ) template static inline Rect_<_Tp>& operator -= ( Rect_<_Tp>& a, const Size_<_Tp>& b ) { - a.width -= b.width; - a.height -= b.height; + const _Tp width = a.width - b.width; + const _Tp height = a.height - b.height; + CV_DbgAssert(width >= 0 && height >= 0); + a.width = width; + a.height = height; return a; } @@ -1950,6 +1953,15 @@ Rect_<_Tp> operator + (const Rect_<_Tp>& a, const Size_<_Tp>& b) return Rect_<_Tp>( a.x, a.y, a.width + b.width, a.height + b.height ); } +template static inline +Rect_<_Tp> operator - (const Rect_<_Tp>& a, const Size_<_Tp>& b) +{ + const _Tp width = a.width - b.width; + const _Tp height = a.height - b.height; + CV_DbgAssert(width >= 0 && height >= 0); + return Rect_<_Tp>( a.x, a.y, width, height ); +} + template static inline Rect_<_Tp> operator & (const Rect_<_Tp>& a, const Rect_<_Tp>& b) { diff --git a/modules/core/test/test_operations.cpp b/modules/core/test/test_operations.cpp index e72400c7fa..e0a2c99991 100644 --- a/modules/core/test/test_operations.cpp +++ b/modules/core/test/test_operations.cpp @@ -972,6 +972,13 @@ bool CV_OperationsTest::operations1() if (sz.width != 10 || sz.height != 20) throw test_excep(); if (cvSize(sz).width != 10 || cvSize(sz).height != 20) throw test_excep(); + Rect r1(0, 0, 10, 20); + Size sz1(5, 10); + r1 -= sz1; + if (r1.size().width != 5 || r1.size().height != 10) throw test_excep(); + Rect r2 = r1 - sz1; + if (r2.size().width != 0 || r2.size().height != 0) throw test_excep(); + Vec v5d(1, 1, 1, 1, 1); Vec v6d(1, 1, 1, 1, 1, 1); Vec v7d(1, 1, 1, 1, 1, 1, 1);