直线检测:
cv2.HoughLinesP()
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
rho:线段以像素为单位的距离精度,double类型的,推荐用1.0
theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
threshod:累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
lines:线条的输出向量。
minLineLength:线段以像素为单位的最小长度。
maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段
img = cv2.imread('line_circle.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines=cv2.HoughLinesP(edges,1,np.pi/180,20,None,10)
lines=lines[:,0,:]
for item in lines:
x1,y1,x2,y2=item
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow("line_dtect",img)
cv2.waitKey(0)
圆检测:
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
image- 8位,单通道,灰度输入图像。 method- 使用检测方法。
dp - 累加器分辨率与图像分辨率的反比。例如,如果 dp= 1,则累加器具有与输入图像相同的分辨率。如果 dp = 2,则累加器的宽度和高度都是一半。
minDist -检测到的圆的中心之间的最小距离。如果参数太小,除了真正的参数外,可能会错误地检测到多个邻居圈。如果太大,可能会错过一些圈子。
circles- 找到的圆的输出向量。每个向量被编码为3元素的浮点向量 (x,y,半径)。
param1 -第一个方法特定的参数。在CV_HOUGH_GRADIENT的情况下,
两个传递给Canny()边缘检测器的阈值较高(较小的两个小于两倍)
param2 -第二种方法参数。在CV_HOUGH_GRADIENT的情况下,它是检测阶段的圆心的累加器阈值。越小,可能会检测到越多的虚假圈子。首先返回对应于较大累加器值的圈子。
minRadius -最小圆半径。
img = cv2.imread('circle.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv2.imshow("circle_detect",img)
cv2.waitKey(0)
cv2.imwrite("circle_result.png",img)
reference: