OpenCV直线和圆形检测

直线检测,通过HoughLines和HoughLinesP函数进行计算,区别是:HoughLines使用标准的Hough变换,HoughLinesP使用概率Hough变换。HoughLinesP是标准Hough的优化,通过分析点的子集并估计这些点都属于一条直线的概率,计算量更少,执行更快。

import numpy
from cv2 import cv2

img = cv2.imread('C:/Users/admin/Desktop/test/1.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)         #转换为灰度图
edges = cv2.Canny(gray,50,100)      #进行canny边缘计算
minLineLength = 20
maxLineGap = 5
lines = cv2.HoughLinesP(edges,1,numpy.pi / 180,100,minLineLength,maxLineGap)   #直线检测,保留满足要求的直线
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)    #在原图上绘制提取到的直线
cv2.imshow('edges',edges)
cv2.imshow('lines',img)
cv2.waitKey()
cv2.destroyAllWindows()

圆检测,OpenCV的HoughCircles函数可用于检测圆,需要设置圆心间的最小距离和最大最小半径等限制条件。

import numpy
from cv2 import cv2

img = cv2.imread('C:/Users/admin/Desktop/test/2.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
blurImg = cv2.medianBlur(gray,5)
cImg = cv2.cvtColor(blurImg,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(blurImg,cv2.HOUGH_GRADIENT,1,120,param1 = 100,param2 = 30,minRadius = 50,maxRadius=200)
circles = numpy.uint16(numpy.around(circles))

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

cv2.imshow('circle',img)
cv2.waitKey()
cv2.destroyAllWindows()

直线检测,首先是提取canny边缘,再跟据canny边缘图像进一步分析,根据定义的参数提取出直线。

原图:

OpenCV直线和圆形检测_第1张图片

canny边缘:

OpenCV直线和圆形检测_第2张图片

直线检测结果(绿色)叠加原图:

OpenCV直线和圆形检测_第3张图片

圆检测效果

原图:

OpenCV直线和圆形检测_第4张图片

效果图:

OpenCV直线和圆形检测_第5张图片

 

你可能感兴趣的:(OpenCV)