在OpenCV中,如果你想要按照0到180度之间的任意角度旋转一张图片,并且选择特定角度下的图像,你可以使用cv2.getRotationMatrix2D()函数来创建一个旋转矩阵,然后应用cv2.warpAffine()函数来进行仿射变换。这种方法允许你指定旋转中心、旋转角度以及缩放比例。对于0到180度的选择性旋转,你可以编写一个函数,该函数接受角度作为输入参数,并返回相应角度旋转后的图像。

下面是一个详细的实现步骤和代码示例:

实现步骤

  1. 导入必要的库:确保已经安装并导入了OpenCV库。
  2. 读取原始图片:使用cv2.imread()加载要处理的图片。
  3. 定义旋转角度:根据需求设定一个介于0至180度之间的角度值。
  4. 计算旋转矩阵:调用cv2.getRotationMatrix2D()获取旋转矩阵,这里需要提供旋转中心点(通常是图像的中心)、旋转角度以及可选的缩放因子。
  5. 应用仿射变换:利用cv2.warpAffine()将旋转矩阵应用于原图,生成旋转后的图像。
  6. 显示或保存结果:可以将处理后的图像显示出来或者保存为新的文件。

代码示例

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度范围内任意角度的图片旋转。

更多推荐