直线检测
- HoughLines
- HoughLinesP
都可以直线检测,区别是:前者使用标准的Hough变换,后者使用概率Hough变换。后者计算代价少,执行快。
HoughLinesP的参数:
。原图片
。线段的几何表示rho theta ,一般分别取 1 和np.pi/180
。阈值,低于该阈值的直线会被忽略
。最小直线长度minLineLength
。最大线段间隙maxLineGap,大于这个值认为是两条分开的线段。
本程序中用到了Canny滤波器,不一定非要使用Canny,但是经过去噪并只有边缘的图像处理效果会更好,因此使用Canny是一个惯例。
import cv2
import numpy as np
img = cv2.imread('lines.jpg')
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,20,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)
cv2.imshow("edges", edges)
cv2.imshow("lines", img)
cv2.waitKey()
cv2.destroyAllWindows()
圆检测
使用函数 HoughCircles
import cv2
import numpy as np
planets = cv2.imread('planet_glow.jpg')
gray_img = cv2.cvtColor(planets, cv2.COLOR_BGR2GRAY)
img = cv2.medianBlur(gray_img, 5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120,
param1=100,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2) #圆
# draw the center of the circle
cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3) #圆心
cv2.imwrite("planets_circles.jpg", planets)
cv2.imshow("HoughCirlces", planets)
cv2.waitKey()
cv2.destroyAllWindows()
其他形状检测
前面讲过近似多边形轮廓,相同原理,有多边形,若你的图像中使用approxPloyDP ,再结合 cv2.findContours ,就可以相当准确的检测出来。