You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OpenCV Python特定区域遮罩问题:奶牛场图像双ROI处理异常

如何正确实现自定义多边形ROI的图像遮罩处理?

我来帮你搞定这个遮罩问题!你遇到的两个问题——红色ROI顶部多余区域、蓝色ROI完全失效,核心原因都是多边形点的顺序错误和不必要的坐标偏移操作。咱们一步步修正:

问题根源分析

  1. 红色ROI顶部多余区域:你之前用了pts = pts - pts.min(axis=0)来偏移坐标,这会把多边形的位置整体移动,导致遮罩和原图像的对应区域错位,自然会出现多余的覆盖。
  2. 蓝色ROI处理失败:OpenCV的drawContours要求多边形的角点按顺时针或逆时针的连续闭合顺序排列,你提供的蓝色ROI点虽然是正确的坐标,但没有形成闭合的连续路径,导致绘制出错误的多边形,遮罩完全失效。

正确的解决方案

1. 修正红色ROI的遮罩处理

去掉不必要的坐标偏移,确保点按闭合顺序排列(可以显式重复首尾点,让轮廓更稳定):

import cv2
import numpy as np

original_frame = cv2.imread("original.jpg")

# 红色ROI角点:按顺时针闭合顺序排列,首尾重复确保完全闭合
red_roi_pts = np.array([
    [0, 1440], [0, 1087], [977, 80], 
    [1925, 67], [2560, 800], [2560, 1440], [0, 1440]
], dtype=np.int32)

# 创建与原图尺寸一致的黑色遮罩
mask = np.zeros(original_frame.shape, np.uint8)
# 绘制填充的白色多边形遮罩(cv2.FILLED等价于-1)
cv2.drawContours(mask, [red_roi_pts], -1, (255, 255, 255), thickness=cv2.FILLED)

# 位运算保留ROI区域,其余变黑
red_result = cv2.bitwise_and(original_frame, mask)
cv2.imwrite("red_roi_output.jpg", red_result)

2. 实现蓝色ROI的正确遮罩

关键是确保蓝色ROI的角点按连续闭合顺序排列(顺时针或逆时针都可以):

# 蓝色ROI角点:按顺时针闭合顺序排列
blue_roi_pts = np.array([
    [1455,60], [1925, 67], [2560, 800], 
    [2560, 1440], [1465, 1440], [1455,60]
], dtype=np.int32)

# 重新创建遮罩
mask = np.zeros(original_frame.shape, np.uint8)
cv2.drawContours(mask, [blue_roi_pts], -1, (255, 255, 255), thickness=cv2.FILLED)

# 位运算得到蓝色ROI结果
blue_result = cv2.bitwise_and(original_frame, mask)
cv2.imwrite("blue_roi_output.jpg", blue_result)

核心注意事项

  • 点的顺序:必须是连续的顺时针/逆时针顺序,不能跳点或乱序,否则drawContours会画出交叉的无效多边形。
  • 避免坐标偏移:不需要对原始坐标做减法偏移,直接用图像中的真实坐标即可,否则遮罩位置会和原图错位。
  • 闭合轮廓:显式重复首尾点能确保轮廓完全闭合,避免OpenCV自动闭合时出现意外问题。

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

火山引擎 最新活动