[具身智能-236]:OpenCV ROI:Region of Interest(感兴趣区域)

张开发
2026/4/7 0:01:25 15 分钟阅读

分享文章

[具身智能-236]:OpenCV ROI:Region of Interest(感兴趣区域)
在 OpenCV 中ROI是Region of Interest感兴趣区域的缩写。简单来说ROI 就是从图像中切出来的“一块”。在处理图像时我们往往不需要处理整张图片比如处理人脸时不需要管背景里的树通过提取 ROI我们可以只关注重点区域从而大幅提升处理速度和算法精度。结合最新的 OpenCV 开发实践我为你整理了 ROI 的核心操作指南 基础操作矩形 ROI这是最常用、最高效的方式。在 Python 中OpenCV 图像本质上是 NumPy 数组因此我们直接使用数组切片来提取 ROI。关键口诀先行后列即[y, x]或[高, 宽]。pythonimport cv2 # 1. 读取图像 img cv2.imread(example.jpg) # 2. 提取 ROI # 语法img[y1:y2, x1:x2] # 含义从第 y1 行到 y2 行从第 x1 列到 x2 列 roi img[100:300, 200:400] # 提取坐标 (200,100) 到 (400,300) 的矩形区域 # 3. 显示 ROI cv2.imshow(ROI, roi) cv2.waitKey(0)常见应用场景复制粘贴将 ROI 复制到图像的其他位置如img[500:700, 200:400] roi。局部处理只对 ROI 进行模糊、边缘检测等操作节省计算资源。 进阶操作不规则 ROI (圆形、多边形)如果你想提取圆形、椭圆或任意多边形区域简单的切片就不够用了。这时需要用到 Mask掩膜 技术。核心逻辑创建一个与原图同尺寸的“黑白图”Mask白色代表保留黑色代表舍弃然后通过按位与运算提取。pythonimport cv2 import numpy as np img cv2.imread(example.jpg) h, w img.shape[:2] # --- 场景 A圆形 ROI --- # 1. 创建全黑 Mask mask np.zeros((h, w), dtypenp.uint8) # 2. 在 Mask 上画一个白色的圆 cv2.circle(mask, (w//2, h//2), 100, (255), -1) # 圆心在中间半径100 # 3. 提取 ROI circular_roi cv2.bitwise_and(img, img, maskmask) # --- 场景 B多边形 ROI (任意形状) --- # 1. 创建全黑 Mask mask_poly np.zeros((h, w), dtypenp.uint8) # 2. 定义多边形顶点 pts np.array([[100,100], [200,100], [200,200], [100,250]], np.int32) pts pts.reshape((-1, 1, 2)) # 3. 填充白色多边形 cv2.fillPoly(mask_poly, [pts], (255)) # 4. 提取 ROI poly_roi cv2.bitwise_and(img, img, maskmask_poly) cv2.imshow(Circular ROI, circular_roi) cv2.imshow(Polygon ROI, poly_roi) cv2.waitKey(0)️ 交互式选择 ROI如果你在写调试工具不想每次都手动去量坐标可以使用 OpenCV 自带的交互函数。cv2.selectROI弹出一个窗口让你用鼠标框选区域返回(x, y, w, h)。pythonimg cv2.imread(example.jpg) # 按下空格键确认选择按 ESC 取消 x, y, w, h cv2.selectROI(Select ROI, img, False) # 根据返回值裁剪 roi img[y:yh, x:xw] cv2.imshow(Selected ROI, roi) cv2.waitKey(0)⚡ 为什么要用 ROI性能对比使用 ROI不仅仅是为了裁剪图片更是为了性能优化。在视频处理或高分辨率图像分析中差异巨大。假设我们要对一张 1920×1080 的图片做高斯模糊表格处理方式处理区域大小耗时 (估算)说明全图处理1920 × 1080~450ms计算量大浪费资源处理背景ROI 处理200 × 200~30ms速度提升 90% 以上只算核心区域 避坑指南坐标顺序再次强调NumPy 切片是img[y:yh, x:xw]也就是img[行范围, 列范围]。很多初学者写成img[x, y]会导致报错或截取到错误的长条区域。越界问题切片的坐标不能超出图像的实际宽高否则会报错IndexError。引用与拷贝roi img[0:100, 0:100]得到的是视图引用修改roi会直接改变原图img。如果你希望修改 ROI 而不影响原图必须使用.copy()例如roi img[0:100, 0:100].copy()。掌握 ROI 是 OpenCV 入门的第一步也是从“处理整图”进阶到“精准视觉分析”的关键。

更多文章