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

如何在Python中检测侧视角网球场地的粗白线?

网球场地侧视角粗白线检测优化方案

原代码的核心问题在于固定阈值二值化——侧视角的网球场地白线受透视变形、光照不均影响,不同区域的亮度差异大,固定的200阈值会把部分亮度稍低的白线段过滤掉,导致后续轮廓检测只能抓到零散部分。

以下是两种针对你需求的优化思路,分别对应「完整白线识别」和「线条边缘识别」:


方案一:优化轮廓检测,识别完整白线

通过自适应阈值+形态学操作,先把断开的白线连接,再提取轮廓:

import cv2
import imutils
import numpy as np

# 读取并预处理图像
image = cv2.imread(r"C:\Users\talcl\PycharmProjects\VisionLine\project\library\image_18.jpeg")
image = imutils.resize(image, width=600)
crop_image = image[300:800, 200:500].copy()  # 保留原图像用于绘制
cv2.imshow('input', crop_image)
cv2.waitKey(0)

# 转灰度
gray = cv2.cvtColor(crop_image, cv2.COLOR_BGR2GRAY)

# 自适应阈值二值化:解决光照不均问题,自动计算局部阈值
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                               cv2.THRESH_BINARY_INV, 11, 2)

# 形态学闭运算:先膨胀后腐蚀,把断开的白线段连接起来
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# 查找轮廓并筛选:过滤掉面积过小的噪声轮廓
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
filtered_cnts = [c for c in cnts if cv2.contourArea(c) > 50]  # 过滤小噪声

# 绘制轮廓
color = (30,255,50)
cv2.drawContours(crop_image, filtered_cnts, -1, color, 2)
cv2.imshow('frame', crop_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键优化点:

  • 用cv2.adaptiveThreshold代替固定阈值:基于局部区域计算阈值,适配侧视角的亮度差异
  • 形态学闭运算:填补白线的断裂处,让轮廓更完整
  • 轮廓面积筛选:去掉小的噪声点,只保留真正的白线轮廓

方案二:霍夫直线检测,识别线条边缘

如果只需要提取白线的边缘(直线段),霍夫直线检测更适合,专门针对直线特征:

import cv2
import imutils
import numpy as np

# 读取并预处理图像
image = cv2.imread(r"C:\Users\talcl\PycharmProjects\VisionLine\project\library\image_18.jpeg")
image = imutils.resize(image, width=600)
crop_image = image[300:800, 200:500].copy()
cv2.imshow('input', crop_image)
cv2.waitKey(0)

# 转灰度+边缘检测
gray = cv2.cvtColor(crop_image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)  # 高斯模糊降噪
edges = cv2.Canny(blur, 50, 150)  # Canny边缘检测

# 霍夫直线检测
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=50, minLineLength=30, maxLineGap=10)

# 绘制直线
if lines is not None:
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(crop_image, (x1,y1), (x2,y2), (30,255,50), 2)

cv2.imshow('frame', crop_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键优化点:

  • 高斯模糊+Canny边缘检测:先降噪再提取清晰的边缘
  • cv2.HoughLinesP参数调整:minLineLength过滤短噪声线,maxLineGap允许线段之间的小间隙,把接近的线段连起来

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:05:23