From f85b9754e0c2dfb2a681f65746108d6da9636dd4 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 1 Aug 2011 12:01:43 +0000 Subject: [PATCH] fixed Vec*scalar operations, fixed minEnclosingCircle Python interface. --- modules/core/include/opencv2/core/core.hpp | 6 + .../core/include/opencv2/core/operations.hpp | 122 +++++++++--------- .../include/opencv2/imgproc/imgproc.hpp | 2 +- 3 files changed, 67 insertions(+), 63 deletions(-) diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 80c54d92e..11e8124de 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -589,6 +589,8 @@ public: explicit Vec(const _Tp* values); Vec(const Vec<_Tp, cn>& v); + Vec<_Tp, cn>& operator =(const Matx<_Tp, cn, 1>& m); + static Vec all(_Tp alpha); //! per-element multiplication @@ -610,6 +612,10 @@ public: _Tp& operator[](int i); const _Tp& operator ()(int i) const; _Tp& operator ()(int i); + + Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_AddOp); + Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_SubOp); + template Vec(const Matx<_Tp, cn, 1>& a, _T2 alpha, Matx_ScaleOp); }; diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 1b3d6e26d..1f1aca839 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -1017,10 +1017,33 @@ template inline Vec<_Tp, cn>::Vec(const _Tp* values) {} -template inline Vec<_Tp, cn>::Vec(const Vec<_Tp, cn>& v) - : Matx<_Tp, cn, 1>(v.val) +template inline Vec<_Tp, cn>::Vec(const Vec<_Tp, cn>& m) + : Matx<_Tp, cn, 1>(m.val) {} +template inline +Vec<_Tp, cn>::Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_AddOp op) +: Matx<_Tp, cn, 1>(a, b, op) +{} + +template inline +Vec<_Tp, cn>::Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_SubOp op) +: Matx<_Tp, cn, 1>(a, b, op) +{} + +template template inline +Vec<_Tp, cn>::Vec(const Matx<_Tp, cn, 1>& a, _T2 alpha, Matx_ScaleOp op) +: Matx<_Tp, cn, 1>(a, alpha, op) +{} + +template inline +Vec<_Tp, cn>& Vec<_Tp, cn>::operator = (const Matx<_Tp, cn, 1>& m) +{ + for( int i = 0; i < cn; i++ ) + this->val[i] = m.val[i]; + return *this; +} + template inline Vec<_Tp, cn> Vec<_Tp, cn>::all(_Tp alpha) { Vec v; @@ -1101,100 +1124,75 @@ operator -= (Vec<_Tp1, cn>& a, const Vec<_Tp2, cn>& b) template static inline Vec<_Tp, cn> operator + (const Vec<_Tp, cn>& a, const Vec<_Tp, cn>& b) { - Vec<_Tp, cn> c = a; - return c += b; + return Vec<_Tp, cn>(a, b, Matx_AddOp()); } template static inline Vec<_Tp, cn> operator - (const Vec<_Tp, cn>& a, const Vec<_Tp, cn>& b) { - Vec<_Tp, cn> c = a; - return c -= b; + return Vec<_Tp, cn>(a, b, Matx_SubOp()); } template static inline -Vec<_Tp, cn>& operator *= (Vec<_Tp, cn>& a, _Tp alpha) +Vec<_Tp, cn>& operator *= (Vec<_Tp, cn>& a, int alpha) { for( int i = 0; i < cn; i++ ) - a[i] *= alpha; + a[i] = saturate_cast<_Tp>(a[i]*alpha); return a; } -template static inline -Vec& operator *= (Vec& a, double alpha) +template static inline +Vec<_Tp, cn>& operator *= (Vec<_Tp, cn>& a, float alpha) { for( int i = 0; i < cn; i++ ) - a[i] *= (float)alpha; - return a; -} - -template static inline -Vec& operator *= (Vec& a, int alpha) -{ - for( int i = 0; i < cn; i++ ) - a[i] *= (float)alpha; + a[i] = saturate_cast<_Tp>(a[i]*alpha); return a; } -template static inline Vec<_Tp, cn> -operator * (const Vec<_Tp, cn>& a, _Tp alpha) +template static inline +Vec<_Tp, cn>& operator *= (Vec<_Tp, cn>& a, double alpha) { - Vec<_Tp, cn> c = a; - return c *= alpha; + for( int i = 0; i < cn; i++ ) + a[i] = saturate_cast<_Tp>(a[i]*alpha); + return a; +} + + +template static inline Vec<_Tp, cn> +operator * (const Vec<_Tp, cn>& a, int alpha) +{ + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); } template static inline Vec<_Tp, cn> -operator * (_Tp alpha, const Vec<_Tp, cn>& a) +operator * (int alpha, const Vec<_Tp, cn>& a) { - Vec<_Tp, cn> c = a; - return c *= alpha; + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); } -template static inline Vec -operator * (double alpha, const Vec& a) +template static inline Vec<_Tp, cn> +operator * (const Vec<_Tp, cn>& a, float alpha) { - Vec c = a; - return c *= (float)alpha; + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); } -template static inline Vec -operator * (const Vec& a, double alpha) +template static inline Vec<_Tp, cn> +operator * (float alpha, const Vec<_Tp, cn>& a) { - Vec c = a; - return c *= (float)alpha; + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); } -template static inline Vec -operator * (int alpha, const Vec& a) +template static inline Vec<_Tp, cn> +operator * (const Vec<_Tp, cn>& a, double alpha) { - Vec c = a; - return c *= (float)alpha; + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); } -template static inline Vec -operator * (const Vec& a, int alpha) +template static inline Vec<_Tp, cn> +operator * (double alpha, const Vec<_Tp, cn>& a) { - Vec c = a; - return c *= (float)alpha; -} - -template static inline Vec<_Tp, 4> -operator * (const Vec<_Tp, 4>& a, const Vec<_Tp, 4>& b) -{ - return Vec<_Tp, 4>(saturate_cast<_Tp>(a[0]*b[0] - a[1]*b[1] - a[2]*b[2] - a[3]*b[3]), - saturate_cast<_Tp>(a[0]*b[1] + a[1]*b[0] + a[2]*b[3] - a[3]*b[2]), - saturate_cast<_Tp>(a[0]*b[2] - a[1]*b[3] + a[2]*b[0] - a[3]*b[1]), - saturate_cast<_Tp>(a[0]*b[3] + a[1]*b[2] - a[2]*b[1] - a[3]*b[0])); -} - - -template static inline Vec<_Tp, 4>& -operator *= (Vec<_Tp, 4>& a, const Vec<_Tp, 4>& b) -{ - a = a*b; - return a; -} - + return Vec<_Tp, cn>(a, alpha, Matx_ScaleOp()); +} template static inline Vec<_Tp, cn> operator - (const Vec<_Tp, cn>& a) @@ -1203,7 +1201,7 @@ operator - (const Vec<_Tp, cn>& a) for( int i = 0; i < cn; i++ ) t.val[i] = saturate_cast<_Tp>(-a.val[i]); return t; } - + template<> inline Vec Vec::cross(const Vec& v) const { return Vec(val[1]*v.val[2] - val[2]*v.val[1], diff --git a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp index 3879b501e..970b07682 100644 --- a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp @@ -997,7 +997,7 @@ CV_EXPORTS_W double contourArea( InputArray contour, bool oriented=false ); CV_EXPORTS_W RotatedRect minAreaRect( InputArray points ); //! computes the minimal enclosing circle for a set of points CV_EXPORTS_W void minEnclosingCircle( InputArray points, - Point2f& center, float& radius ); + CV_OUT Point2f& center, CV_OUT float& radius ); //! matches two contours using one of the available algorithms CV_EXPORTS_W double matchShapes( InputArray contour1, InputArray contour2, int method, double parameter );