OpenCV 从零学习 · 第 18 讲:霍夫变换
函数:cv2.HoughLines / cv2.HoughLinesP / cv2.HoughCircles | 难度:★★★☆☆
霍夫变换能在"一堆边缘点"里找出符合几何形状(直线/圆)的集合。它不是逐像素比,而是把每个边缘点映射到参数空间投票,票数高的就是一条线/一个圆。常用于车道线、表格线、圆孔/硬币计数。
一、直线:HoughLinesP(概率霍夫,最常用)
lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180,
threshold=50, minLineLength=40, maxLineGap=5)
| 参数 | 含义 |
edges | Canny 边缘图(二值) |
rho | 距离分辨率(像素),通常 1 |
theta | 角度分辨率,通常 π/180 |
threshold | 投票阈值,越大线越少越严 |
minLineLength | 最短线段长度 |
maxLineGap | 断点允许的最大空隙 |
返回 (N,1,4),每行是线段两端点 (x1,y1,x2,y2)——直接拿来画线,比 HoughLines 的 (rho,theta) 好用。
二、圆:HoughCircles
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1,
minDist=20, param1=100, param2=30, minRadius=0, maxRadius=0)
| 参数 | 含义 |
gray | 灰度图(HoughCircles 吃灰度) |
dp | 累加器分辨率比,1=同分辨率 |
minDist | 两圆最小中心距,防重复检测 |
param2 | 圆心累加阈值,越大圆越少越严 |
场景 A · 车道线 / 文档表格线
对道路图 Canny 后
对道路图 Canny 后
HoughLinesP,抽取长直线当车道候选;扫描件先做透视矫正(第 20 讲)再用直线检测抽出表格框线。
场景 B · 圆孔 / 硬币计数
HoughCircles 找出所有圆,len(circles[0]) 即数量,遍历画圆圈——工业零件圆孔统计、硬币清点。
⚠ 新手必踩坑
- 直线检测输入是 Canny 边缘图(二值),不是原图;先 Canny 再 Hough。
HoughLines返回 (rho, theta) 极坐标,要自己换算成线段;新手直接用HoughLinesP拿端点。HoughCircles吃灰度图,且param2调小会满屏假圆、调大会漏圆,需按图微调。- 结果可能为空(None),遍历前先判空,否则报错。
本讲要点
- 直线用
HoughLinesP(端点直出),输入 Canny 边缘。 - 圆用
HoughCircles(灰度图),param2控制严格度。 - 霍夫是"从边缘投票找形状",适合规则几何目标。
下一讲:第 19 讲 · 图像分割(GrabCut / 分水岭)——把前景从背景里"抠"出来,处理重叠物体分离。
