走进opencv-python 直线和圆检测

直线检测

可以通过HoughLines和HoughLinesP函数完成直线检测,它们的差别是HoughLinesP是HoughLines的概率版,计算代价会少,执行更快。

代码:

import cv2
import numpy as np

img = cv2.imread('square.jpg')
cv2.imshow('org',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,120)
minLineLength = 20
maxLineGap = 5
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)

for i in range(4):
    for x1,y1,x2,y2 in lines[i]:
        cv2.line(img,(x1,y1),(x2,y2),(255,0,0),2)

cv2.imshow('res',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

将图片转换成灰度图,利用Canny算子得到边缘图像(不一定非要边缘图像,但这样效果更好),接下来是HoughLinesP的参数:

要处理的图像

线段的几何表示rho和theta,一般取1,和np.pi/180

阈值,低于阈值的直线会忽略

最小直线长度,低于该值的直线会被消除

最大线段间隙,间隙高于该值被视为两条分开的直线

效果(右边为待处理图像,左边为处理好的图像):

走进opencv-python 直线和圆检测_第1张图片

圆检测

HoughCircles函数可以用来检测圆,API如下:

cv2.HoughCircles(img,method,dp,minDist,param1,param2,minRadius,maxRadius)

img:待处理的图像

mothod:方法,仅支持cv2.HOUGH.GRADIENT

dp:如果dp设置为1,则分辨率相同;如果设置为更大的值(比如2),分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。

param1:Canny的边缘阀值上限,下限被置为上限的一半。

param2:阈值,超过该值则认为是圆

minRadius:最小圆半径

maxRadius:最大圆半径

示例:

import cv2
import numpy as np

img = cv2.imread('circle.png')
cv2.imshow('org',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,120)
circles = cv2.HoughCircles(edges,cv2.HOUGH_GRADIENT,1,120,100,30,1,15)

for i in circles[0,:1]:
    cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)

cv2.imshow('res',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果:

走进opencv-python 直线和圆检测_第2张图片

你可能感兴趣的:(走进opencv-python 直线和圆检测)