如何获取cv2.resize缩放后ROI旋转矩形的尺寸与位置?
解决图像缩放后更新ROI旋转矩形参数的问题
这个问题其实很好解决,核心就是利用图像缩放的线性变换特性——我们只需要计算出宽、高方向的缩放因子,对原旋转矩形的参数做对应缩放即可,旋转角度是不会改变的。
具体步骤:
- 计算宽高方向的缩放因子
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
- 提取原旋转矩形参数并计算新参数
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)
- 生成新的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
相关产品推荐
相关产品推荐

