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

如何在OpenCV中仅在足球场绿色掩码区域绘制椭圆

解决方案:仅在足球场绿色区域绘制椭圆

核心思路是先获取绿色区域的二进制掩码,再将椭圆仅绘制在掩码覆盖的绿色区域内——原代码的问题在于先绘制椭圆再应用掩码,导致椭圆被一并过滤掉,调整顺序并通过掩码控制绘制范围即可解决。

修改步骤说明

  • 重构mask函数,返回绿色区域的二进制掩码(绿色区域为255,非绿色为0),用于后续控制椭圆的显示范围。
  • 创建临时画布单独绘制椭圆,再通过掩码将椭圆仅保留在绿色区域,最后合并到原图。
  • 调整主函数执行顺序:先获取掩码,再完成椭圆的限定绘制。

修改后的完整代码

import cv2
import numpy as np

def get_green_mask(img):
    # 转换至HSV色彩空间
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 定义绿色区域的HSV范围
    lower_green = (36, 25, 25)
    upper_green = (86, 255, 255)
    # 生成绿色区域的二进制掩码
    mask = cv2.inRange(hsv, lower_green, upper_green)
    return mask

def draw_ellipse_on_green(img, player_point, mask):
    axesLength = (45, 20)
    angle = 0
    startAngle = 0
    endAngle = 360
    color = (0, 0, 255)  # BGR格式的红色
    thickness = 5
    
    # 创建与原图尺寸一致的临时画布(初始全黑)
    ellipse_canvas = np.zeros_like(img)
    # 在临时画布上绘制椭圆
    cv2.ellipse(ellipse_canvas, player_point, axesLength, angle, startAngle, endAngle, color, thickness)
    
    # 将掩码转换为3通道,适配彩色图像运算
    mask_3ch = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
    # 仅保留掩码覆盖区域的椭圆
    ellipse_only_green = cv2.bitwise_and(ellipse_canvas, mask_3ch)
    # 将椭圆叠加到原图上
    result = cv2.add(img, ellipse_only_green)
    
    return result

def main():
    img = cv2.imread('img.png')
    player_point = (160, 665)
    
    # 先获取绿色区域掩码
    green_mask = get_green_mask(img)
    # 在绿色区域内绘制椭圆
    result_img = draw_ellipse_on_green(img, player_point, green_mask)
    
    cv2.imshow("Result", result_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

关键代码解释

  • get_green_mask:专注生成绿色区域的掩码,为后续椭圆的范围控制提供依据。
  • draw_ellipse_on_green:
    • 用临时画布绘制椭圆,避免直接修改原图导致的范围失控。
    • 通过cv2.bitwise_and将椭圆与掩码结合,精准保留绿色区域内的椭圆部分。
    • 最后用cv2.add将处理后的椭圆叠加到原图,实现仅在场地绿色区域显示椭圆的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:10:50