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

OpenCV Hough Circles Transform无法检测板球问题求助

解决红色板球检测问题:霍夫圆优化与替代方案

一、霍夫圆变换的优化调整

霍夫圆对噪声、边缘清晰度及参数配置非常敏感,你当前的代码缺少关键预处理步骤,调整后可尝试:

  • 添加高斯模糊降噪:霍夫圆依赖边缘检测,噪声会严重干扰边缘提取,先对灰度图做模糊处理:
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    gray = cv.GaussianBlur(gray, (5, 5), 0)  # 新增模糊步骤,消除高频噪声
    
  • 修正核心参数配置:你未设置param1和param2,这两个是霍夫圆检测的核心阈值,同时修正半径范围(直径10像素对应半径5):
    circles = cv.HoughCircles(
        gray,
        cv.HOUGH_GRADIENT,
        dp=1.2,  # 轻微增大dp提升检测精度
        minDist=20,  # 单球场景可缩小该值
        param1=50,  # Canny边缘检测的高阈值,低阈值自动取其一半
        param2=30,  # 累加器阈值,值越小检测到的圆越多
        minRadius=2,
        maxRadius=5  # 直径10像素对应半径5,匹配实际尺寸
    )
    
  • 修复坐标转换错误:np.uint8会截断大于255的坐标值,导致画圈位置偏移,改用np.uint16:
    if circles is not None:
        circles = np.uint16(np.around(circles))  # 替换uint8为uint16
        for i in circles[0, :]:
            cv.circle(frame, (i[0], i[1]), i[2], (0,255,0), 2)  # 线宽设为2,避免覆盖目标
    

二、基于颜色特征的替代方案(更适合红色板球)

红色是强视觉特征,先通过颜色过滤定位目标区域,再结合轮廓或霍夫圆检测,比纯灰度检测更可靠:

完整代码示例

import cv2 as cv
import numpy as np

frame = cv.imread("cricket_ball.png")
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

# 定义红色的HSV范围(红色在HSV空间分为两个区间)
lower_red1 = np.array([0, 120, 70])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])

# 生成红色掩码并消除噪声
mask1 = cv.inRange(hsv, lower_red1, upper_red1)
mask2 = cv.inRange(hsv, lower_red2, upper_red2)
mask = mask1 | mask2

# 形态学操作去除噪声点
kernel = np.ones((5,5), np.uint8)
mask = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)  # 开运算:先腐蚀后膨胀,消除小噪声
mask = cv.morphologyEx(mask, cv.MORPH_CLOSE, kernel) # 闭运算:先膨胀后腐蚀,填补目标内部空隙

# 方案1:通过轮廓检测筛选圆形目标
contours, _ = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    area = cv.contourArea(cnt)
    if area < 50:  # 过滤微小噪声轮廓
        continue
    # 计算最小外接圆
    (x, y), radius = cv.minEnclosingCircle(cnt)
    center = (int(x), int(y))
    radius = int(radius)
    # 计算圆形度(越接近1越接近正圆)
    perimeter = cv.arcLength(cnt, True)
    circularity = 4 * np.pi * (area / (perimeter ** 2)) if perimeter > 0 else 0
    if circularity > 0.8:  # 筛选圆形度高的轮廓
        cv.circle(frame, center, radius, (0,255,0), 2)

# 方案2:在掩码上用霍夫圆检测(可选,适合高清晰度场景)
# circles = cv.HoughCircles(mask, cv.HOUGH_GRADIENT, dp=1.2, minDist=20, param1=50, param2=20, minRadius=2, maxRadius=5)
# if circles is not None:
#     circles = np.uint16(np.around(circles))
#     for i in circles[0, :]:
#         cv.circle(frame, (i[0], i[1]), i[2], (255,0,0), 2)

cv.imshow("Ball", frame)
cv.waitKey(0)
cv.destroyAllWindows()

三、关键注意事项

  • 可根据实际光照调整HSV的红色范围,重点微调饱和度(S)和亮度(V)阈值。
  • 形态学操作的核大小可根据图像噪声程度调整,噪声大则适当增大核尺寸。
  • 圆形度阈值可灵活调整,若允许目标轻微变形,可降到0.7左右。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:15:44