Python 使用Opencv实现直线检测和圆检测

本人新书《玩转Python网络爬虫》,可在天猫、京东等商城搜索查阅,项目深入浅出,适合爬虫初学者或者是已经有一些网络爬虫编写经验,但希望更加全面、深入理解Python爬虫的开发人员。
这里写图片描述

———-欢迎加入学习交流QQ群:657341423


直线检测
cv2.HoughLinesP()函数原型:

HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) 
  1. image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
  2. rho:线段以像素为单位的距离精度,double类型的,推荐用1.0
  3. theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
  4. threshod:累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
  5. lines:线条的输出向量。
  6. minLineLength:线段以像素为单位的最小长度。
  7. maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段

示例一

import cv2
import numpy as np

img = cv2.imread('lines.jpg')
# 灰度处理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# canny边缘处理
edges = cv2.Canny(gray,50,120)
line = 100
minLineLength = 20
# HoughLinesP函数是概率直线检测,注意区分HoughLines函数
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, lines=line, minLineLength=minLineLength)
# 降维处理
lines1 = lines[:,0,:]
# line 函数勾画直线
# (x1,y1),(x2,y2)坐标位置
# (0,255,0)设置BGR通道颜色
# 2 是设置颜色粗浅度
for x1,y1,x2,y2 in lines1:
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

# 显示图像
cv2.imshow("edges", edges)
cv2.imshow("lines", img)
cv2.waitKey()
cv2.destroyAllWindows()

原图
这里写图片描述
效果图
这里写图片描述

直线的识别与HoughLinesP函数参数的设置有关


圆检测
HoughCircles函数原型

cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)

参数说明:

  1. image- 8位,单通道,灰度输入图像。 method- 使用检测方法。
  2. dp - 累加器分辨率与图像分辨率的反比。例如,如果 dp= 1,则累加器具有与输入图像相同的分辨率。如果 dp = 2,则累加器的宽度和高度都是一半。
  3. minDist -检测到的圆的中心之间的最小距离。如果参数太小,除了真正的参数外,可能会错误地检测到多个邻居圈。如果太大,可能会错过一些圈子。
  4. circles- 找到的圆的输出向量。每个向量被编码为3元素的浮点向量 (x,y,半径)。
  5. param1 -第一个方法特定的参数。在CV_HOUGH_GRADIENT的情况下,
    两个传递给Canny()边缘检测器的阈值较高(较小的两个小于两倍)
  6. param2 -第二种方法参数。在CV_HOUGH_GRADIENT的情况下,它是检测阶段的圆心的累加器阈值。越小,可能会检测到越多的虚假圈子。首先返回对应于较大累加器值的圈子。
  7. minRadius -最小圆半径。

示例二

import cv2
import numpy as np

planets = cv2.imread('planet_glow.jpg')
# 灰度处理
gray_img = cv2.cvtColor(planets, cv2.COLOR_BGR2GRAY)
# medianBlur 平滑(模糊)处理
img = cv2.medianBlur(gray_img, 5)
# 灰度图像转彩色图像
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

# 圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=50, maxRadius=100)
# 转化整数
circles = np.uint16(np.around(circles))

for i in circles[0,:]:
    # 勾画圆形,planets图像、(i[0],i[1])圆心坐标,i[2]是半径
    cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)
    # 勾画圆心,圆心实质也是一个半径为2的圆形
    cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)
# 显示图像
cv2.imwrite("planets_circles.jpg", planets)
cv2.imshow("mypic", cimg)
cv2.imshow("HoughCirlces", planets)
cv2.waitKey()
cv2.destroyAllWindows()

原图
这里写图片描述
效果图
这里写图片描述
圆的识别与HoughCircles函数参数的设置有关


注意:
这里写图片描述
例子可参考:Python 使用Opencv实现边缘检测以及轮廓检测的示例二


参考资料:OpenCV 3计算机视觉 Python语言实现第二版

猜你喜欢

转载自blog.csdn.net/huangzhang_123/article/details/80520502