【CanMV K230】快速线性回归(巡线)
- 什么是快速线性回归
- 快速线性回归应用领域
- 1.机器人竞赛
- 2.自动引导车(AGV):
- 3.智能交通系统:
- K230应用
- 相关函数
- 官方例程
- 实现图像在HDMI显示器进快速线性回归(巡线)
本篇内容:
- 什么是快速线性回归
- 快速线性回归应用领域
- K230应用(包含相应函数及例程)
B站视频链接:已做成合集 (求去点赞,或者发个弹幕也行呀。C友)
抖音链接:已做成合集(求去点赞,或者发个弹幕也行呀。C友)
什么是快速线性回归
快速线性回归通常指的是使用高效算法求解线性回归问题的方法。线性回归是一种统计分析方法,用于建立自变量和因变量之间的线性关系模型。这里主要应用在巡线上。
快速线性回归应用领域
快速线性回归在巡线应用领域中主要用于图像处理和机器视觉任务,尤其是在机器人导航和自动引导车(AGV)中。通过快速线性回归算法,可以分析图像中的线条特征,并实时计算出机器人或车辆的行进路径,使其能够沿着预定的线路行驶。
1.机器人竞赛
在机器人比赛中,快速线性回归可以帮助机器人识别赛道并沿着赛道进行循迹。
2.自动引导车(AGV):
在工业自动化中,AGV使用快速线性回归来沿着地面标记的路径运输物料,确保精确导航。
3.智能交通系统:
在智能交通系统中,快速线性回归可以用于车辆的车道保持辅助系统,帮助车辆识别道路标线并保持车道。
快速线性回归的优势在于其计算速度快,能够实时处理图像数据,适用于需要快速响应的应用场景。
K230应用
相关函数
get_regression对象
构造函数
image.get_regression(thresholds[, invert=False[, roi[, x_stride=2[, y_stride=1[,
area_threshold=10[, pixels_threshold=10[, robust=False]]]]]]])
线性回归计算。对图像所有阈值像素进行线性回归计算,通过最小二乘法进行,通常速度较快,但不能处理任何异常值;
参数 | 说明 |
---|---|
threshold: 必须是元组列表 | (lo, hi) 定义你想追踪的颜色范围。 |
对于灰度图像,每个元组需要包含两个值:最小灰度值和最大灰度值。
例:thresholds=(0,100)
,则该函数表示将(0,100)灰度值范围变成白色。
官方例程
'''
实验名称:快速线性回归(巡线)
实验平台:01Studio CanMV K230
教程:wiki.01studio.cc
'''
import time, os, sys
from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口
THRESHOLD = (0, 100) # 黑白图像的灰度阈值
BINARY_VISIBLE = True # 使用二值化图像你可以看到什么是线性回归。
# 这可能降低 FPS(每秒帧数).
try:
sensor = Sensor(width=1280, height=960) #构建摄像头对象
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(width=640, height=480) #设置帧大小,默认通道0
sensor.set_pixformat(Sensor.GRAYSCALE) #设置输出图像格式,默认通道0
Display.init(Display.ST7701, to_ide=True) #同时使用3.5寸mipi屏和IDE缓冲区显示图像,800x480分辨率
#Display.init(Display.VIRT, sensor.width(), sensor.height()) #只使用IDE缓冲区显示图像
MediaManager.init() #初始化media资源管理器
sensor.run() #启动sensor
clock = time.clock()
while True:
os.exitpoint() #检测IDE中断
################
## 这里编写代码 ##
################
clock.tick()
#image.binary([THRESHOLD])将灰度值在THRESHOLD范围变成了白色
img = sensor.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else sensor.snapshot()
# 返回一个类似 find_lines() 和find_line_segments()的对象.
# 有以下函数使用方法: x1(), y1(), x2(), y2(), length(),
# theta() (rotation in degrees), rho(), and magnitude().
#
# magnitude() 代表线性回归的指令,其值为(0, INF]。
# 0表示一个圆,INF数值越大,表示线性拟合的效果越好。
line = img.get_regression([(255,255) if BINARY_VISIBLE else THRESHOLD])
if (line):
img.draw_line(line.line(), color = 127,thickness=4)
print(line) #打印结果
#显示图片,仅用于LCD居中方式显示
Display.show_image(img, x=round((800-sensor.width())/2),y=round((480-sensor.height())/2))
print("FPS %f, mag = %s" % (clock.fps(), str(line.magnitude()) if (line) else "N/A"))
###################
# IDE中断释放资源代码
###################
except KeyboardInterrupt as e:
print("user stop: ", e)
except BaseException as e:
print(f"Exception {e}")
finally:
# sensor stop run
if isinstance(sensor, Sensor):
sensor.stop()
# deinit display
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
# release media buffer
MediaManager.deinit()
https://wiki.01studio.cc/docs/canmv_k230/machine_vision/image_detection/linear_regression_fast
从左往右依次为 91°->180°(0°)-> 90° 变化,大家可以结合上图观察实验数据理解,巡线行走的小车本质就是让这个拟合线段保持在0°位置行走。
实现图像在HDMI显示器进快速线性回归(巡线)
效果并不好,毕竟是在小车上用的。看一下效果就行。主要是了解返回的参数。
'''
实验名称:快速线性回归(巡线)
实验平台:01Studio CanMV K230
说明:实现图像在HDMI显示器进快速线性回归(巡线)
测试人:咸鱼浆 2024年9月6日15:39:10
'''
import time, os, sys
from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口
THRESHOLD = (0, 100) # 黑白图像的灰度阈值
BINARY_VISIBLE = True # 使用二值化图像你可以看到什么是线性回归。
# 这可能降低 FPS(每秒帧数).
try:
sensor = Sensor(width=1280, height=960) #构建摄像头对象,将摄像头长宽设置为4:3
sensor.reset() #复位和初始化摄像头
sensor.set_framesize(width=640, height=480) #设置帧大小为(width=640, height=480)太大了就显示不出来了,默认通道0
sensor.set_pixformat(Sensor.GRAYSCALE) #设置输出图像格式,默认通道0
#使用IDE缓冲区输出图像,显示尺寸和sensor配置一致。
Display.init(Display.LT9611, to_ide=True)
MediaManager.init() #初始化media资源管理器
sensor.run() #启动sensor
while True:
os.exitpoint() #检测IDE中断
################
## 这里编写代码 ##
################
#image.binary([THRESHOLD])将灰度值在THRESHOLD范围变成了白色
img = sensor.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else sensor.snapshot()
# 返回一个类似 find_lines() 和find_line_segments()的对象.
# 有以下函数使用方法: x1(), y1(), x2(), y2(), length(),
# theta() (rotation in degrees), rho(), and magnitude().
#
# magnitude() 代表线性回归的指令,其值为(0, INF]。
# 0表示一个圆,INF数值越大,表示线性拟合的效果越好。
line = img.get_regression([(255,255) if BINARY_VISIBLE else THRESHOLD])
if (line):
img.draw_line(line.line(), color = 127,thickness=4)
print(line) #打印结果
Display.show_image(img, x=round((1920-sensor.width())/2),y=round((1080-sensor.height())/2))
#Display.show_image(img) #显示图片
###################
# IDE中断释放资源代码
###################
except KeyboardInterrupt as e:
print("user stop: ", e)
except BaseException as e:
print(f"Exception {e}")
finally:
# sensor stop run
if isinstance(sensor, Sensor):
sensor.stop()
# deinit display
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
# release media buffer
MediaManager.deinit()
两个点坐标,长度,以及非常重要的theta角度信息,theta角度表示如下: