You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取cv2.resize缩放后ROI旋转矩形的尺寸与位置?

解决图像缩放后更新ROI旋转矩形参数的问题

这个问题其实很好解决,核心就是利用图像缩放的线性变换特性——我们只需要计算出宽、高方向的缩放因子,对原旋转矩形的参数做对应缩放即可,旋转角度是不会改变的。

具体步骤:

  1. 计算宽高方向的缩放因子
    OpenCV中图像的形状是(高度, 宽度, 通道数),而cv2.resize的目标尺寸是(宽度, 高度),所以要注意对应关系:
original_h, original_w = img.shape[:2]
target_w, target_h = 4096, 2160

# 计算x(宽度)和y(高度)方向的缩放比例
scale_x = target_w / original_w
scale_y = target_h / original_h
  1. 提取原旋转矩形参数并计算新参数
    cv2.minAreaRect返回的rect是一个元组,结构为((中心x, 中心y), (矩形宽, 矩形高), 旋转角度)。我们只需要对中心坐标、宽高分别应用对应方向的缩放因子,角度保持不变:
# 拆解原旋转矩形参数
(orig_cx, orig_cy), (orig_rect_w, orig_rect_h), orig_angle = rect

# 计算新的参数
new_cx = orig_cx * scale_x
new_cy = orig_cy * scale_y
new_rect_w = orig_rect_w * scale_x
new_rect_h = orig_rect_h * scale_y
new_angle = orig_angle  # 缩放不改变旋转角度

# 构造新的旋转矩形
new_rect = ((new_cx, new_cy), (new_rect_w, new_rect_h), new_angle)
  1. 生成新的box点并绘制到缩放后的图像
    用新的旋转矩形生成对应的box点,再绘制到缩放后的图像上:
new_box = cv2.boxPoints(new_rect)
new_box = np.int0(new_box)
cv2.drawContours(img_resized, [new_box], 0, (0,0,255), 1)

完整修改后的代码:

import numpy as np 
import cv2 

# 假设ROI_contour是已定义的轮廓点
ROI_contour = [...]  # 替换为你的实际轮廓数据

# Create black image 
img = np.zeros((767, 999, 3), np.uint8) 
# Turn ROI to white 
cv2.fillConvexPoly(img, np.array(ROI_contour), (255, 255, 255)) 
# Get Width, Height, and Angle of rectangle around ROI 
rect = cv2.minAreaRect(np.array(ROI_contour)) 
# Draw rotated rectangle in red 
box = cv2.boxPoints(rect) 
box = np.int0(box) 
cv2.drawContours(img,[box], 0, (0,0,255), 1) 

# ------------------- 新增的缩放后参数更新部分 -------------------
original_h, original_w = img.shape[:2]
target_w, target_h = 4096, 2160
scale_x = target_w / original_w
scale_y = target_h / original_h

# 计算新的旋转矩形参数
(orig_cx, orig_cy), (orig_rect_w, orig_rect_h), orig_angle = rect
new_cx = orig_cx * scale_x
new_cy = orig_cy * scale_y
new_rect_w = orig_rect_w * scale_x
new_rect_h = orig_rect_h * scale_y
new_angle = orig_angle
new_rect = ((new_cx, new_cy), (new_rect_w, new_rect_h), new_angle)
# ---------------------------------------------------------------

# Resize img to new size 
img_resized = cv2.resize(img, (target_w, target_h), interpolation=cv2.INTER_AREA)

# 在缩放后的图像上绘制新的旋转矩形
new_box = cv2.boxPoints(new_rect)
new_box = np.int0(new_box)
cv2.drawContours(img_resized, [new_box], 0, (0,0,255), 1)

关键说明:

为什么旋转角度不需要修改?因为cv2.minAreaRect的角度是相对于图像x轴的倾斜角度,缩放操作是沿着x、y轴的线性拉伸/压缩,不会改变矩形的倾斜方向,因此角度保持不变。

内容的提问来源于stack exchange,提问作者Kunibert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:48:24