From 6f7bf653f7f848619d6f37eda350cec48281212c Mon Sep 17 00:00:00 2001 From: Tetragramm Date: Fri, 21 Oct 2016 20:01:12 -0500 Subject: [PATCH] Add 90 degree rotation methods. This provides a quick simple way of doing 90 degree rotations. Also fix warnings that show up on other compilers in test builds. --- modules/core/include/opencv2/core.hpp | 18 +++++++++++ modules/core/src/copy.cpp | 44 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/modules/core/include/opencv2/core.hpp b/modules/core/include/opencv2/core.hpp index 4a21aab66e..226327280b 100644 --- a/modules/core/include/opencv2/core.hpp +++ b/modules/core/include/opencv2/core.hpp @@ -1022,6 +1022,24 @@ around both axes. */ CV_EXPORTS_W void flip(InputArray src, OutputArray dst, int flipCode); +enum RotateFlags { + ROTATE_90 = 0, //Rotate 90 degrees clockwise + ROTATE_180 = 1, //Rotate 180 degrees clockwise + ROTATE_270 = 2, //Rotate 270 degrees clockwise +}; +/** @brief Rotates a 2D array in multiples of 90 degrees. +The function rotate rotates the array in one of three different ways: +* Rotate by 90 degrees clockwise (rotateCode = ROTATE_90). +* Rotate by 180 degrees clockwise (rotateCode = ROTATE_180). +* Rotate by 270 degrees clockwise (rotateCode = ROTATE_270). +@param src input array. +@param dst output array of the same type as src. The size is the same with ROTATE_180, +and the rows and cols are switched for ROTATE_90 and ROTATE_270. +@param rotateCode an enum to specify how to rotate the array; see the enum RotateFlags +@sa transpose , repeat , completeSymm, flip, RotateFlags +*/ +CV_EXPORTS_W void rotate(InputArray src, OutputArray dst, int rotateCode); + /** @brief Fills the output array with repeated copies of the input array. The function cv::repeat duplicates the input array one or more times along each of the two axes: diff --git a/modules/core/src/copy.cpp b/modules/core/src/copy.cpp index 7d5e4d8ec1..0310329649 100644 --- a/modules/core/src/copy.cpp +++ b/modules/core/src/copy.cpp @@ -826,6 +826,50 @@ void flip( InputArray _src, OutputArray _dst, int flip_mode ) flipHoriz( dst.ptr(), dst.step, dst.ptr(), dst.step, dst.size(), esz ); } +#ifdef HAVE_OPENCL + +static bool ocl_rotate(InputArray _src, OutputArray _dst, int rotateMode) +{ + switch (rotateMode) + { + case ROTATE_90: + flip(_src.getUMat().t(), _dst, 1); + break; + case ROTATE_180: + flip(_src, _dst, -1); + break; + case ROTATE_270: + flip(_src.getUMat().t(), _dst, 0); + break; + default: + break; + } + return true; +} +#endif + +void rotate(InputArray _src, OutputArray _dst, int rotateMode) +{ + CV_Assert(_src.dims() <= 2); + + CV_OCL_RUN(_dst.isUMat(), ocl_rotate(_src, _dst, rotateMode)) + + switch (rotateMode) + { + case ROTATE_90: + flip(_src.getMat().t(), _dst, 1); + break; + case ROTATE_180: + flip(_src, _dst, -1); + break; + case ROTATE_270: + flip(_src.getMat().t(), _dst, 0); + break; + default: + break; + } +} + #if defined HAVE_OPENCL && !defined __APPLE__ static bool ocl_repeat(InputArray _src, int ny, int nx, OutputArray _dst)