如何在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
相关产品推荐
相关产品推荐

