如何针对不同分辨率动态缩放OpenCV中的ROI区域?
动态缩放ROI适配不同分辨率的解决方案
核心问题在于你使用了固定像素值的ROI坐标,这仅适用于严格1920x1080的图像。当原图比例与目标比例不一致时,resize后的图像尺寸会偏离预期,导致固定坐标无法定位到正确的ROI区域。
解决思路是将固定像素坐标转换为相对比例值,再根据resize后的实际图像尺寸动态计算ROI坐标,具体实现如下:
步骤1:预计算ROI相对比例
基于你设定的标准分辨率(1920x1080),把固定的ROI参数转换成相对比例:
# 标准分辨率参数 STD_WIDTH = 1920 STD_HEIGHT = 1080 # 原固定ROI坐标 STD_X, STD_Y, STD_W, STD_H = 466, 203, 978, 760 # 计算相对比例 x_ratio = STD_X / STD_WIDTH y_ratio = STD_Y / STD_HEIGHT w_ratio = STD_W / STD_WIDTH h_ratio = STD_H / STD_HEIGHT
步骤2:动态计算ROI坐标
对任意分辨率的原图,先完成resize操作,再用resize后的实际宽高乘以比例值,得到适配当前尺寸的ROI坐标:
import cv2 # 读取原图 img = cv2.imread("test.png") orig_h, orig_w = img.shape[:2] print(f'original size / w = {orig_w}, h = {orig_h}') # 方案1:强制拉伸到1920x1080(不保持原图比例) img_resized = cv2.resize(img, (STD_WIDTH, STD_HEIGHT), interpolation=cv2.INTER_AREA) # 方案2:保持原图比例缩放(此时尺寸可能不是1920x1080) # img_resized = image_resize(img, width=STD_WIDTH) resized_h, resized_w = img_resized.shape[:2] print(f'after resize / w = {resized_w}, h = {resized_h}') # 动态生成当前尺寸下的ROI坐标 x = int(resized_w * x_ratio) y = int(resized_h * y_ratio) w = int(resized_w * w_ratio) h = int(resized_h * h_ratio) roi = img_resized[y:y+h, x:x+w]
补充:修复resize函数的强制拉伸逻辑
你的现有image_resize函数在同时传入width和height时,只会以width为基准计算比例,忽略height参数。如果需要支持强制拉伸到指定宽高,可以修改函数:
def image_resize(image, width=None, height=None, inter=cv2.INTER_AREA): (h, w) = image.shape[:2] # 同时指定宽高时,直接强制拉伸到目标尺寸 if width is not None and height is not None: return cv2.resize(image, (width, height), interpolation=inter) # 原比例缩放逻辑 if width is None and height is None: return image if width is None: r = height / float(h) dim = (int(w * r), height) else: r = width / float(w) dim = (width, int(h * r)) return cv2.resize(image, dim, interpolation=inter)
修改后调用image_resize(img, width=1920, height=1080)即可得到严格1920x1080的图像,配合比例计算的ROI坐标就能准确定位目标区域。
内容的提问来源于stack exchange,提问作者user1897151
相关产品推荐
相关产品推荐

