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

