【Python】【 OpenCV】检测直线和圆


风晓
风晓 2023-12-29 10:59:04 53275 赞同 0 反对 0
分类: 资源
重新理解一下Canny方法:

参数:

  • image:输入的图像。
  • threshold1:第一个阈值,用于检测边缘的强度梯度的下限。
  • threshold2:第二个阈值,用于检测边缘的强度梯度的上限。
  • apertureSize:Sobel算子的大小,可选值为3、5、7,默认值为3。
  • L2gradient:一个布尔值,指示是否使用更精确的L2范数计算梯度幅值,默认值为False。

返回值:

  • edges:包含边缘的输出图像。它是一个二进制图像,其中白色像素表示检测到的边缘,黑色像素表示未检测到的边缘。

 

cv2.HoughLineP():

参数:

  • image:输入的二值图像,通常是经过边缘检测的结果。
  • rho:极径步长,表示以像素为单位的距离精度。一般情况下,使用1即可。
  • theta:极角步长,表示以弧度为单位的角度精度。一般情况下,使用np.pi/180即可。
  • threshold:直线投票阈值,只有当累积器中的值高于该阈值时,才会被认为是一条直线。
  • minLineLength:线段的最小长度。比这个长度短的线段不会被检测到。
  • maxLineGap:允许两条线段之间的最大间隔,小于该值则被视为一条线段。

返回值:

  • lines:检测到的直线的参数表示。它是一个包含直线的起点和终点坐标的数组,每个直线由四个浮点数(x1, y1, x2, y2)表示。

 检测线段:

复制代码
 1 import cv2
 2 import numpy as np
 3 
 4 img = cv2.imread('../images/lines.jpg')
 5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 6 
 7 # 寻找边缘
 8 edges = cv2.Canny(gray, 50, 120)
 9 
10 # 寻找直线
11 lines = cv2.HoughLinesP(edges, rho=1,
12                         theta=np.pi/180.0,
13                         threshold=20,
14                         minLineLength=50,
15                         maxLineGap=5)
16 
17 # lines此时是一个三维数组
18 for line in lines:
19     # line此时即为二维数组,且只有一个元素(只包含一个一维数组)
20     x1, y1, x2, y2 = line[0]
21     cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
22 
23 cv2.imshow("edges", edges)
24 cv2.imshow("lines", img)
25 cv2.waitKey()
26 cv2.destroyAllWindows()
复制代码

 

检测圆形:

cv2.medianBlur():

参数解释:

  • src:输入图像,8 位单通道或 3 通道图像。
  • ksize:滤波器大小,必须是正奇数,例如 3、5、7 等。(代表的是 Number x Number 大小的矩阵)
  • dst:输出图像,与输入图像大小和类型相同,可选参数。

返回值:

  • 如果指定了 dst,则返回 dst;否则,返回滤波后的图像。

 

cv2.HoughCircles():

参数:

  • image:输入的单通道灰度图像。
  • method:表示使用的检测方法,目前只支持 cv2.HOUGH_GRADIENT
  • dp:累加器分辨率与图像分辨率的反比。这个参数影响圆心的累加器分辨率。如果 dp=1,累加器的分辨率与图像的分辨率相同。如果 dp=2,累加器的分辨率是图像分辨率的一半。一般来说,dp 值越大,检测速度越快,但可能会错过一些小圆;而 dp 值越小,检测速度越慢,但可以检测到更小的圆。
  • minDist:检测到的圆心之间的最小距离。如果这个距离小于该值,则认为是同一个圆。
  • param1:用于 Canny 边缘检测的高阈值。在进行圆检测之前,需要先进行边缘检测。这个参数用来设置 Canny 边缘检测算法的高阈值。低阈值是高阈值的一半。
  • param2:圆心累加器阈值。这个参数用于确定圆心的累加器阈值。只有当累加器的值大于 param2 时,才认为是一个圆。值越小,检测到的圆越多,但可能会有更多的误检测。
  • minRadius:圆的最小半径。
  • maxRadius:圆的最大半径。

函数的返回结果是一个包含检测到的圆的信息的 Numpy 数组,每行包含三个元素:圆心的 x 坐标、y 坐标以及圆的半径。

 

cv2.circle():

参数解释:

  • img:要绘制圆形的图像。
  • center:圆心的坐标,可以是一个元组 (x, y)
  • radius:圆的半径。
  • color:圆的颜色,可以是一个元组 (B, G, R),表示蓝、绿、红的通道值。
  • thickness:圆边界的厚度,如果为负值则表示填充整个圆形。
复制代码
 1 import cv2
 2 import numpy
 3 
 4 img = cv2.imread('../images/planet_glow.jpg')
 5 # 转灰度图
 6 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 7 # 中值模糊
 8 gray = cv2.medianBlur(gray, 5)
 9 
10 circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT,
11                            1, 90,
12                            param1=100, param2=30,
13                            minRadius=0, maxRadius=0)
14 
15 circles = numpy.uint16(numpy.around(circles))
16 
17 for i in circles[0, :]:
18     # 绘制圆轮廓
19     cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
20     # 绘制圆心
21     cv2.circle(img, (i[0], i[1]), 1, (0, 0, 255), 2)
22 
23 cv2.imshow('plant', img)
24 cv2.waitKey()
25 cv2.destroyAllWindows()
复制代码

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
风晓L1
粉丝 1 资源 2038 + 关注 私信
最近热门资源
桌面通用(全架构)【在双系统环境下隐藏Windows启动菜单】操作指南  2073
银河麒麟桌面操作系统V10(SP1)2203-如何进行远程桌面互访?  2003
银河麒麟桌面操作系统【保留数据盘重装系统】  1812
麒麟系统各种原因开不了机解决(合集)  1608
桌面通用(全架构)【rpm包转成deb包】操作方法  932
银河麒麟桌面操作系统 V10-SP1 双系统安装 efi 分区问题  916
统信系统安装(合集)  854
统信桌面专业版【手动分区安装UOS系统】介绍  846
统启动异常几种类型(initramfs 模式)  691
银河麒麟桌面操作系统V10SP1(全架构)【更改屏保文字信息】操作方法  1
最近下载排行榜
桌面通用(全架构)【在双系统环境下隐藏Windows启动菜单】操作指南 0
银河麒麟桌面操作系统V10(SP1)2203-如何进行远程桌面互访? 0
银河麒麟桌面操作系统【保留数据盘重装系统】 0
麒麟系统各种原因开不了机解决(合集) 0
桌面通用(全架构)【rpm包转成deb包】操作方法 0
银河麒麟桌面操作系统 V10-SP1 双系统安装 efi 分区问题 0
统信系统安装(合集) 0
统信桌面专业版【手动分区安装UOS系统】介绍 0
统启动异常几种类型(initramfs 模式) 0
银河麒麟桌面操作系统V10SP1(全架构)【更改屏保文字信息】操作方法 0
作者收入月榜
1

prtyaa 收益393.72元

2

zlj141319 收益221.42元

3

1843880570 收益214.2元

4

IT-feng 收益213.03元

5

风晓 收益208.24元

6

777 收益172.82元

7

Fhawking 收益106.6元

8

信创来了 收益105.89元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.65元

请使用微信扫码

加入交流群

请使用微信扫一扫!