获取矩形旋转后的新矩形

原理:  三角函数 平面转换

用例:  预估旋转后的位置,   可事先设定好矩形大小

代码:

var
  angle: Single;
   Sn, Cn: Single;
   Sx, Sy, Scale: Single;
begin

    angle:= angle* PI / 180; //180 - 负180度

    // get the width and height of rotated image (without scaling)
    SinCos(angle, Sn, Cn);
    Sx := Abs(SrcR * Cn) + Abs(SrcB * Sn);
    Sy := Abs(SrcR * Sn) + Abs(SrcB * Cn);
    Panel1.Width := Trunc(sx);    Panel1.Height :=Trunc(sy);

    //居中
    Panel1.Left := Dst.Left + (Dst.Width - Panel1.Width) div 2;    Panel1.Top := Dst.Top + (Dst.Height - Panel1.Height) div 2;
    // calculate a new scale so that the image fits in original boundaries
    Sx := Src.Bitmap.Width / Sx;
    Sy := Src.Bitmap.Height / Sy;
    Scale := Min(Sx, Sy);

    //缩放显示,保证display不超过src范围 T.Scale(Scale);

end;

### 最小旋转外接矩形的长宽比计算方法 在图像处理和几何计算中,最小旋转外接矩形(Minimum Area Bounding Rectangle, MABR)是包围一组点或形状的面积最小的矩形。该矩形可能不是轴对齐的,而是可以自由旋转以适应目标形状。为了计算其长宽比,可以按照以下方式实现: #### 使用 OpenCV 计算最小旋转外接矩形的长宽比 OpenCV 提供了 `cv2.minAreaRect()` 函数,用于计算一组点的最小旋转外接矩形[^1]。该函数返回一个包含矩形中心、尺寸和旋转角度的元组 `(center, size, angle)`,其中 `size` 是矩形的宽度和高度。通过比较 `size` 的两个值,可以得到长宽比。 以下是具体实现代码: ```python import cv2 import numpy as np # 示例轮廓点集 contour = np.array([[0, 0], [100, 50], [100, 150], [0, 100]], dtype=np.int32) # 计算最小旋转外接矩形 rect = cv2.minAreaRect(contour) # 获取矩形尺寸 width, height = rect[1] # 确保宽度和高度正确排序 if width > height: aspect_ratio = width / height else: aspect_ratio = height / width print(f"最小旋转外接矩形的长宽比为: {aspect_ratio}") ``` #### 几何算法计算最小旋转外接矩形的长宽比 如果需要手动实现而不依赖 OpenCV,可以通过以下步骤完成: 1. 找到点集的凸包(Convex Hull),使用 Graham 扫描法或其他凸包算法。 2. 遍历凸包的每一条边,将边作为潜在的矩形的一条边,并计算以该边为基准的最小面积矩形。 3. 在所有可能的矩形中找到面积最小的一个,记录其宽度和高度。 4. 根据宽度和高度计算长宽比。 以下是伪代码实现: ```python def min_area_bounding_rect(points): # 计算凸包 hull = convex_hull(points) # 初始化最小面积和对应的宽度、高度 min_area = float('inf') min_width = min_height = 0 # 遍历凸包的每一条边 for i in range(len(hull)): edge = (hull[i], hull[(i + 1) % len(hull)]) # 计算垂直于边的方向向量 vec = (edge[1][1] - edge[0][1], -(edge[1][0] - edge[0][0])) norm = (vec[0]**2 + vec[1]**2)**0.5 vec = (vec[0] / norm, vec[1] / norm) # 投影点集到方向向量上 projections = [(p[0]*vec[0] + p[1]*vec[1]) for p in points] min_proj = min(projections) max_proj = max(projections) # 计算矩形的宽度和高度 width = max_proj - min_proj height = distance(edge[0], edge[1]) # 更最小面积 area = width * height if area < min_area: min_area = area min_width = width min_height = height # 计算长宽比 if min_width > min_height: aspect_ratio = min_width / min_height else: aspect_ratio = min_height / min_width return aspect_ratio ``` #### 注意事项 - 在实际应用中,确保输入点集是非空且有效的,否则可能导致错误结果。 - 如果需要处理大量点集,建议优化凸包算法或使用近似算法以提高效率。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值