旋转图片使用opencv
·
在OpenCV中,如果你想要按照0到180度之间的任意角度旋转一张图片,并且选择特定角度下的图像,你可以使用cv2.getRotationMatrix2D()函数来创建一个旋转矩阵,然后应用cv2.warpAffine()函数来进行仿射变换。这种方法允许你指定旋转中心、旋转角度以及缩放比例。对于0到180度的选择性旋转,你可以编写一个函数,该函数接受角度作为输入参数,并返回相应角度旋转后的图像。
下面是一个详细的实现步骤和代码示例:
实现步骤
- 导入必要的库:确保已经安装并导入了OpenCV库。
- 读取原始图片:使用
cv2.imread()加载要处理的图片。 - 定义旋转角度:根据需求设定一个介于0至180度之间的角度值。
- 计算旋转矩阵:调用
cv2.getRotationMatrix2D()获取旋转矩阵,这里需要提供旋转中心点(通常是图像的中心)、旋转角度以及可选的缩放因子。 - 应用仿射变换:利用
cv2.warpAffine()将旋转矩阵应用于原图,生成旋转后的图像。 - 显示或保存结果:可以将处理后的图像显示出来或者保存为新的文件。
代码示例
import cv2
import numpy as np
def rotate_image(image, angle, scale=1.0):
"""
按照给定的角度旋转图像,并保持图像大小不变。
参数:
image (numpy.ndarray): 输入的BGR格式图像。
angle (float): 旋转角度,正值表示逆时针方向。
scale (float): 缩放比例,默认为1.0,即不缩放。
返回:
numpy.ndarray: 旋转后的图像。
"""
# 获取图像尺寸
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
# 创建旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)
# 计算旋转后的边界框大小
cos_val = abs(np.cos(np.deg2rad(angle)))
sin_val = abs(np.sin(np.deg2rad(angle)))
new_width = int((h * sin_val) + (w * cos_val))
new_height = int((h * cos_val) + (w * sin_val))
# 调整旋转矩阵以考虑平移
M[0, 2] += (new_width / 2) - center[0]
M[1, 2] += (new_height / 2) - center[1]
# 执行仿射变换
rotated = cv2.warpAffine(image, M, (new_width, new_height), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
return rotated
if __name__ == "__main__":
# 加载图片
img_path = "path/to/your/image.jpg"
img = cv2.imread(img_path)
if img is None:
raise FileNotFoundError(f"未能找到文件 {img_path}")
# 设置旋转角度,例如90度
rotation_angle = 45 # 可以是0到180之间的任何角度
# 应用旋转
rotated_img = rotate_image(img, rotation_angle)
# 显示原图与旋转后的图片
cv2.imshow('Original Image', img)
cv2.imshow(f'Rotated by {rotation_angle} degrees', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 如果需要保存旋转后的图片
output_path = f"path/to/save/rotated_by_{rotation_angle}_degrees.jpg"
cv2.imwrite(output_path, rotated_img)
print(f"旋转后的图片已保存至 {output_path}")
在这个例子中,rotate_image函数接收一幅图像和一个角度值作为参数,并返回经过指定角度旋转后的图像。为了确保旋转后的图像不会被裁剪掉部分区域,我们还计算了新的边界框大小,并相应地调整了旋转矩阵中的平移部分。这保证了即使是在较大的旋转角度下,图像的所有内容都能完整地显示出来。
此外,对于特定角度如90度、180度或270度的旋转,OpenCV提供了更为简便的方法,比如直接使用cv2.rotate()函数,它可以快速高效地完成这些特殊角度的旋转操作。但是,当涉及到非标准角度时,上述方法就显得更加灵活和实用了。通过这种方式,你可以轻松地实现从0到180度范围内任意角度的图片旋转。
更多推荐

所有评论(0)