OpenCV 您所在的位置:网站首页 vue图片放大缩小旋转 OpenCV

OpenCV

2023-05-05 20:21| 来源: 网络整理| 查看: 265

1. 学习目标 学习旋转矩阵; 学习使用 OpenCV 的 cv.warpAffine 函数进行图片的旋转; 学习使用 OpenCV 的 cv.getRotationMatrix2D 来计算不同旋转中心的不同角度的 MAR 旋转变换矩阵; 学习使用 OpenCV 的 cv.rotate 进行特殊角度的旋转(90,180,270 度)。 2. 不同中心的旋转矩阵计算 2.1 图像以原点 (0, 0) 为中心

图像以原点 (0, 0) 为中心、顺时针旋转角度 θ 进行旋转的计算公式:

逆时针为负数,顺时针为正数

输入图片说明

2.2 图像以任意点 (x0, y0) 为旋转中心

图像以任意点 (x0, y0) 为旋转中心、顺时针旋转角度 θ 的旋转操作,可以先将原点平移到旋转中心 (x0, y0) ,然后按照原点旋转,最后再平移回坐标原点的计算公式:

逆时针为负数,顺时针为正数 输入图片说明 逆时针为正数,顺时针为负数 输入图片说明

计算公式结果参考:cv2.getRotationMatrix2D的旋转矩阵的正确形式!!!

3. 图像旋转函数 3.1 cv.warpAffine() 函数使用 cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst 复制代码 3.2 参数说明 参数说明src表示输入图像。M表示变换矩阵,2行3列。dsize表示输出图像的大小,二元元组 (width, height)。dst表示变换操作的输出图像,可选项。flags表示插值方法,整型(int),可选项。borderMode表示边界像素方法,整型(int),可选项,默认值为 cv.BORDER_REFLECT。borderValue表示边界填充值,可选项,默认值为 0(黑色填充)。 3.3 flags 值说明 值说明cv.INTER_LINEAR表示双线性插值(默认方法)。cv.INTER_AREA表示使用像素区域关系重采样,缩小图像时可以避免波纹出现。cv.INTER_NEAREST表示最近邻插值。cv.INTER_CUBIC表示 4x4 像素邻域的双三次插值。cv.INTER_LANCZOS4表示 8x8 像素邻域的Lanczos插值。 4. 以原点(0,0)旋转任意角度实例 4.1 旋转实例

逆时针为负数,顺时针为正数

import cv2 as cv import numpy as np # 图像旋转(以原点(0,0)为中心旋转) def image_rotate(src, rotate=0): h,w,c = src.shape cos_val = np.cos(np.deg2rad(rotate)) sin_val = np.sin(np.deg2rad(rotate)) M = np.float32([[cos_val, -sin_val, 0], [sin_val, cos_val, 0]]) img = cv.warpAffine(src, M, (w,h)) return img if __name__ == "__main__": img = cv.imread("./images/lena.jpg") cv.imshow("origin", img) cv.imshow("img_rotate_30", image_rotate(img,30)) cv.imshow("img_rotate_45", image_rotate(img,45)) cv.waitKey(0) cv.destroyAllWindows() 复制代码 4.2 旋转效果

输入图片说明

5. 逆时针为正数,顺时针为负数 5.1 旋转实例 import cv2 as cv import numpy as np # 图像旋转(以原点(0,0)为中心旋转) def image_rotate(src, rotate=0): h,w,c = src.shape cos_val = np.cos(np.deg2rad(rotate)) sin_val = np.sin(np.deg2rad(rotate)) M = np.float32([[cos_val, sin_val, 0], [-sin_val, cos_val, 0]]) img = cv.warpAffine(src, M, (w,h)) return img if __name__ == "__main__": img = cv.imread("./images/lena.jpg") cv.imshow("origin", img) cv.imshow("img_rotate_30", image_rotate(img,30)) cv.imshow("img_rotate_45", image_rotate(img,45)) cv.waitKey(0) cv.destroyAllWindows() 复制代码 5.2 旋转效果

输入图片说明

6. 以任意点为中心旋转任意角度实例(逆时针为正数,顺时针为负数) 6.1 旋转实例 import cv2 as cv import numpy as np # 计算旋转变换矩阵 def handle_rotate_val(x,y,rotate): cos_val = np.cos(np.deg2rad(rotate)) sin_val = np.sin(np.deg2rad(rotate)) return np.float32([ [cos_val, sin_val, x * (1 - cos_val) - y * sin_val], [-sin_val, cos_val, x * sin_val + y * (1 - cos_val)] ]) # 图像旋转(以任意点为中心旋转) def image_rotate(src, rotate=0): h,w,c = src.shape M = handle_rotate_val(w//2,h//2,rotate) img = cv.warpAffine(src, M, (w,h)) return img if __name__ == "__main__": img = cv.imread("./images/lena.jpg") cv.imshow("origin", img) cv.imshow("img_rotate_30", image_rotate(img,30)) cv.imshow("img_rotate_45", image_rotate(img,45)) cv.waitKey(0) cv.destroyAllWindows() 复制代码 6.2 旋转效果

输入图片说明

7. cv.getRotationMatrix2D 函数

OpenCV 提供了 cv.getRotationMatrix2D 函数, 根据旋转角度和位移计算旋转变换矩阵 MAR。

7.1 cv.getRotationMatrix2D() 函数说明 cv.getRotationMatrix2D(center, angle, scale) → M 复制代码 7.2 参数说明 参数说明center表示旋转中心坐标,二元元组 (x0, y0)。angle表示旋转角度,单位为角度,逆时针为正数,顺时针为负数。scale表示缩放因子。 7.3 使用 cv.getRotationMatrix2D 计算变换矩阵的实例 import cv2 as cv # 图像旋转(以任意点为中心旋转) def image_rotate(src, rotate=0): h,w,c = src.shape M = cv.getRotationMatrix2D((w//2,h//2),rotate,1) img = cv.warpAffine(src, M, (w,h)) return img if __name__ == "__main__": img = cv.imread("./images/lena.jpg") cv.imshow("origin", img) cv.imshow("img_rotate_30", image_rotate(img,30)) cv.imshow("img_rotate_45", image_rotate(img,45)) cv.waitKey(0) cv.destroyAllWindows() 复制代码 7.4 旋转结果

输入图片说明

8. cv.rotate 函数 8.1 cv.rotate() 函数说明 cv.rotate( src, rotateCode[, dst] ) → dst 复制代码 8.2 参数说明 参数说明src表示变换操作的输入图像。rotateCode表示枚举,指定旋转角度。dst表示变换操作的输出图像,ndarray 多维数组。 8.3 rotateCode 值说明 值说明cv.ROTATE_90_CLOCKWISE表示顺时针旋转 90 度。cv.ROTATE_180表示旋转 180 度。cv.ROTATE_90_COUNTERCLOCKWISE表示逆时针旋转 90 度。 8.4 cv.rotate 旋转实例 import cv2 as cv import numpy as np # 图像旋转(以特殊角度旋转) def image_rotate(src): img_90 = cv.rotate(src,cv.ROTATE_90_CLOCKWISE) cv.imshow("ROTATE_90_CLOCKWISE", img_90) img_180 = cv.rotate(src,cv.ROTATE_180) cv.imshow("ROTATE_180", img_180) img_270 = cv.rotate(src,cv.ROTATE_90_COUNTERCLOCKWISE) cv.imshow("ROTATE_90_COUNTERCLOCKWISE", img_270) return img if __name__ == "__main__": img = cv.imread("./images/lena.jpg") cv.imshow("origin", img) image_rotate(img) cv.waitKey(0) cv.destroyAllWindows() 复制代码 8.5 旋转效果

输入图片说明

9. np.rot90 函数 9.1 np.rot90() 函数说明 np.rot90(src, k, axes) → dst 复制代码 9.2 参数说明 参数说明src表示变换操作的输入图像。k表示阵列旋转90度的次数。axes表示 array 在轴定义的平面中旋转。 轴必须不同。dst表示变换操作的输出图像。#### 9.3 旋转实例 import cv2 as cv import numpy as np def image_rotate(src): img_90 = np.rot90(src,1) cv.imshow("rot90", img_90) img_180 = np.rot90(src,2) cv.imshow("rot180", img_180) img_270 = np.rot90(src,3) cv.imshow("rot270", img_270) return img if __name__ == "__main__": img = cv.imread("./images/lena.jpg") half_img = cv.resize(img,None,fx=0.5,fy=0.5) cv.imshow("origin", half_img) image_rotate(half_img) cv.waitKey(0) cv.destroyAllWindows() 复制代码 9.4 旋转结果

输入图片说明

10. 总结 cv.rotate 和 np.rot90 两个方法只能旋转特殊角度,只能是90度的整数倍数。 cv.warpAffine 可以对图像进行任意角度旋转; 实现自定原点旋转,需要借助 cv.getRotationMatrix2D 计算变化矩阵; cv.getRotationMatrix2D 的实现原理需要注意旋转角度对应的顺【逆】时针旋转!!! 注意:cv.getRotationMatrix2D 的旋转角度【逆时针为正数,顺时针为负数】!!!


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有