opencv3-第3章-直线检测 圆检测 其他形状检测


直线检测


  1. HoughLines
  2. 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 ,就可以相当准确的检测出来。

猜你喜欢

转载自blog.csdn.net/sundanping_123/article/details/88049947