可以通过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
阈值,低于阈值的直线会忽略
最小直线长度,低于该值的直线会被消除
最大线段间隙,间隙高于该值被视为两条分开的直线
效果(右边为待处理图像,左边为处理好的图像):
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()
效果: