k210 line类的相关实现方法详细使用方法
本文为对官方文档line类的详细使用补充(为个人学习时的理解,欢迎大家指正),大家也可以直接查看官方文档进行快速学习
https://wiki.sipeed.com/soft/maixpy/zh/api_reference/machine_vision/image/image.html#line.line()
文章目录
构造函数
可以调用三个函数进行line对象的创建,分别是 image.find_lines(), image.find_line_segments(), 或 image.get_regression(),这些函数用于在图像中检测直线或线段,并返回表示这些直线或线段的直线对象,最常使用的是image.find_lines()
方法
直线对象通常是由以下属性组成:
x1:直线的起点的x坐标。
y1:直线的起点的y坐标。
x2:直线的终点的x坐标。
y2:直线的终点的y坐标。
magnitude:直线的大小或长度。
theta:直线的角度或斜率。
1. line.line()
返回一个直线元组(x1, y1, x2, y2) ,用于如 image.draw_line 等其他的 image 方法,返回元组的含义在上述直线对象的属性中有提到👆
实例1
import sensor
import image
import lcd
# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
# 初始化LCD显示屏
lcd.init()
lcd.rotation(2)
# 拍摄图像
img = sensor.snapshot()
# find_lines()寻找直线
lines = img.find_lines()
# 在图像上绘制直线
for line in lines:
x1, y1, x2, y2 = line.line() #使用line.line()获得直线的属性,并返回给具体的参数,以便后面进行画线
img.draw_line((x1, y1, x2, y2), color=(255, 0, 0))
# 在LCD上显示图像
lcd.display(img)
2. line.x1(),line.y1(),line.x2(),line.y2()
返回直线的x1,y1,x2,y2属性
可以使用相应的索引[0]~[3]进行获取
这四个方法一般用得比较少,一般都可以使用line类得其他方法解决问题(使用其他方法更加方便快捷)
实例2:将实例1使用这几个函数实现
在实际中不会使用这种方法而是使用实例1
import sensor
import image
import lcd
# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
# 初始化LCD显示屏
lcd.init()
lcd.rotation(2)
# 拍摄图像
img = sensor.snapshot()
# 寻找直线
lines = img.find_lines()
# 在图像上绘制直线
for line in lines:
x1, y1 = line.x1(), line.y1()
x2, y2 = line.x2(), line.y2()
img.draw_line((x1, y1, x2, y2), color=(255, 0, 0))
# 在LCD上显示图像
lcd.display(img)
3. line.length()
返回直线长度即 sqrt(((x2-x1)^2) + ((y2-y1)^2).
也可以通过索引 [4] 取得这个值
实例3:打印(获取)直线的长度
import sensor
import image
# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
# 拍摄图像
img = sensor.snapshot()
# 寻找直线
lines = img.find_lines()
# 处理返回的直线对象
for line in lines:
length = line.length()
print("直线长度:{}".format(length))
# 或者使用索引 [4] 来获取长度
# length = line[4]
# print("直线长度:{}".format(length))
4.line.magnitude()
返回霍夫变换后的直线的长度。
也可以通过索引 [5] 取得这个值
实例4:霍夫变换后直线的长度
import sensor
import image
# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
# 拍摄图像
img = sensor.snapshot()
# 寻找直线
lines = img.find_lines()
# 处理返回的直线对象
for line in lines:
magnitude = line.magnitude()
print("直线长度(霍夫变换):{}".format(magnitude))
# 或者使用索引 [5] 来获取长度
# magnitude = line[5]
# print("直线长度(霍夫变换):{}".format(magnitude))
实例3与实例4的区别
line.length()
和line.magnitude()
是直线对象中的两个方法,用于获取直线的长度。它们的区别在于计算长度的方式和用途。
line.length()
方法计算的是直线的几何长度,即直线的起点和终点之间的直线距离。它的计算公式为sqrt(((x2-x1)^2) + ((y2-y1)^2))
,其中(x1, y1)
是直线的起点坐标,(x2, y2)
是直线的终点坐标。这个长度表示直线在图像上的物理距离。line.magnitude()
方法计算的是直线的霍夫变换长度。霍夫变换是一种在图像中检测直线的常用方法。直线的霍夫变换长度是指直线在霍夫空间中的投票数或权重,表示直线在图像中的重要性或显著程度。它通常用于直线检测和图像分析中。
因此,line.length()
返回的是直线的几何长度,表示直线在图像中的物理距离,而line.magnitude()
返回的是直线的霍夫变换长度,表示直线在图像中的重要性。
需要根据具体的应用场景和需求选择使用哪个方法来获取直线的长度
5. line.theta()
返回霍夫变换后的直线的角度(0-179度)。
也可以通过索引 [7] 取得这个值。
实例5:获取直线的角度
import sensor
import image
# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
# 拍摄图像
img = sensor.snapshot()
# 寻找直线
lines = img.find_lines()
# 处理返回的直线对象
for line in lines:
theta = line.theta()
print("直线的角度(霍夫变换):{}".format(theta))
# 或者使用索引 [7] 来获取角度
# theta = line[7]
# print("直线的角度(霍夫变换):{}".format(theta))
霍夫变化后的角度与通常的直接的角度的区别
霍夫变换后的角度与直接的角度是不同的,它们表示了不同的含义和计算方式。
- 霍夫变换后的角度:
这个角度是通过霍夫变换算法计算得到的,用于检测图像中的直线。
霍夫变换是一种在图像中检测直线的方法,它将直线表示为在霍夫空间中的参数空间。
霍夫变换后的角度表示了直线在霍夫空间中的角度,通常取值范围为0到179度之间。
这个角度可以用来表示直线在图像中的方向,但它是相对于霍夫变换算法的计算结果而言,与实际图像中的角度可能存在一定的差异。
- 直接的角度:
- 直接的角度是通过几何计算或其他方法直接获得的角度,不经过霍夫变换。
- 它可以是根据直线的起点和终点坐标计算得到的斜率角度,或者是根据其他几何属性直接获得的角度。
- 直接的角度通常与实际图像中的直线角度更为接近,但它可能对图像噪声或其他因素更为敏感。
实例6:霍夫变换后的角度和直接的角度之间的区别
import sensor
import image
import math
# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
while True:
# 拍摄图像
img = sensor.snapshot()
# 寻找直线
lines = img.find_lines()
# 处理返回的直线对象
for line in lines:
# 霍夫变换后的角度
hough_theta = line.theta()
# 直接的角度(根据起点和终点坐标计算)
x1, y1, x2, y2 = line.line()
dx = x2 - x1
dy = y2 - y1
direct_theta = math.degrees(math.atan2(dy, dx))
print("霍夫变换后的角度:{}".format(hough_theta))
print("直接的角度:{}".format(direct_theta))
实验现象
在上述示例中,我们使用
img.find_lines()
函数找到图像中的直线,并将直线对象存储在lines
变量中。然后,我们通过遍历lines
中的每个直线对象,分别获取霍夫变换后的角度和直接的角度。通过比较霍夫变换后的角度和直接的角度,您可以观察到它们可能存在差异。霍夫变换后的角度可能受到算法的影响,造成与实际图像中直线角度的略微偏差,而直接的角度可能更接近实际角度。这是因为直接的角度是通过几何计算或其他方法直接从直线的起点和终点坐标计算得到的。
需要注意的是,实际结果可能会受到图像噪声、直线检测算法的精度和其他因素的影响。因此,在具体应用中,选择使用哪种角度取决于您的需求和应用场景。
6.line.rho()
返回霍夫变换后的直线p值。也可以通过索引 [8] 取得这个值
直线的 p 值是指在霍夫变换中表示直线的参数之一。
在霍夫变换中,直线通常使用极坐标参数 (rho, theta) 来表示,其中rho 是从图像原点到直线的垂直距离,而 theta 是直线与图像水平轴之间的角度。
(图像原点通常是指图像坐标系中的起始点或原点,也被称为图像的左上角。在大多数情况下,图像的原点位于图像的左上角,并且坐标轴的正方向是向右为 x 轴正方向,向下为 y 轴正方向)
直线的 p 值(也称为极径)是 rho 的值,表示从图像原点到直线的垂直距离。p 值可以是正值、负值或零,取决于直线与图像原点之间的相对位置关系。
通过计算直线的霍夫变换,我们可以得到直线的 p 值,以及其他参数,如角度 theta。
需要注意的是,直线的 p 值具体表示的含义和范围可能因不同的实现方式而有所不同。因此,具体的定义和用法可能会因所使用的图像处理库或算法而有所差异
实例7:返回霍夫变换后的直线p值
import sensor
import image
# 初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
while True:
# 拍摄图像
img = sensor.snapshot()
# 寻找直线
lines = img.find_lines()
# 处理返回的直线对象
for line in lines:
rho = line.rho()
print("直线的 p 值(霍夫变换):{}".format(rho))
# 或者使用索引 [8] 来获取 p 值
# rho = line[8]
# print("直线的 p 值(霍夫变换):{}".format(rho))