OpenMV的单颜色识别讲解

2023-05-16

OpenMV的官方教程:寻找色块;single_color_rgb565_blob_tracking示例讲解;视频讲解

需要提前看的文章:程序烧录;颜色阈值设置

目录

threshold_index和thresholds解析

固定代码部分

死循环部分

clock.tick()讲解

sensor.snapshot()讲解

for ... in ...部分

image.find_blobs()函数讲解

blob.elongation()讲解

img.draw_edges()和 img.draw_line部分解析

 img.draw_rectangle(blob.rect())解析。

print()解析 

结论:


我们点击右上角文件——>示例——>OpenMV——>Color Tracking——>single_color_rgb565_blob_tracking,打开单颜色识别的代码。代码如下,我增加了中文注释,你打开的将会是英文的注释。


# 这个例子展示了使用OpenMV Cam的单色RGB565跟踪。
import sensor, image, time, math

threshold_index = 0 # 0 for red, 1 for green, 2 for blue

# 颜色跟踪阈值 (L Min, L Max, A Min, A Max, B Min, B Max)
# 下面的阈值通常跟踪红色/绿色/蓝色的东西。您可能希望调整它们……
thresholds = [(30, 100, 15, 127, 15, 127), # 通用的红色阈值
              (30, 100, -64, -8, -32, 32), # 通用的绿色阈值
              (0, 30, 0, 64, -128, 0)]     # 通用的蓝色阈值

sensor.reset()                      #重置感光元件,重置摄像机
sensor.set_pixformat(sensor.RGB565) #设置颜色格式为RGB565,彩色,每个像素16bit。
sensor.set_framesize(sensor.QVGA)   #图像大小为QVGA
sensor.skip_frames(time = 2000)     #跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
sensor.set_auto_gain(False)         #颜色识别必须关闭自动增益,会影响颜色识别效果
sensor.set_auto_whitebal(False)     #颜色识别必须关闭白平衡,会影响颜色识别效果,导致颜色的阈值发生改变
clock = time.clock()

# 只有像素大于“pixels_threshold”和面积大于“area_threshold”的区域才会
# 由下面的"find_blobs"返回。如果更改相机分辨率,则更改“pixels_threshold”和   
# “area_threshold”。"merge=True"合并图像中所有重叠的斑点。。

while(True):
    clock.tick()             # 追踪两个snapshots()之间经过的毫秒数.
    img = sensor.snapshot()  #截取感光元件中的一张图片
    #在img.find_blobs这个函数中,我们进行颜色识别
    #roi是“感兴趣区”,是在画面的中央还是右上方或者哪里进行颜色识别。此处我们没有进行配置,默认整个图像进行识别
    for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True):
        # 这些值依赖于blob不是循环的-否则它们将不稳定。
        if blob.elongation() > 0.5:
            img.draw_edges(blob.min_corners(), color=(255,0,0))     #利用一个红色的方框,绘制出Blob的最小边界
            img.draw_line(blob.major_axis_line(), color=(0,255,0))  #利用一个绿色的线,绘制穿过最小面积矩形的最长边
            img.draw_line(blob.minor_axis_line(), color=(0,0,255))  #利用一个蓝色的线,绘制穿过最小面积矩形的最短边
        # 这些值始终是稳定的。
        img.draw_rectangle(blob.rect())      #用矩形标记出目标颜色区域
        img.draw_cross(blob.cx(), blob.cy()) #在目标颜色区域的中心画十字形标记
        # 注意- blob的旋转是唯一的0-180。
        img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)
    print(clock.fps()) #打印帧率,可在OpenMV IDE的左下角串行终端查看

threshold_index和thresholds解析

threshold_index:设置要识别的颜色值,示例中的0表示识别红色,1识别绿色,2识别蓝色。

thresholds:存放可能要识别物体的LAB阈值。此处分别是红色,绿色,蓝色的阈值

threshold_index = 0 # 0 for red, 1 for green, 2 for blue

# 颜色跟踪阈值 (L Min, L Max, A Min, A Max, B Min, B Max)
# 下面的阈值通常跟踪红色/绿色/蓝色的东西。您可能希望调整它们……
thresholds = [(30, 100, 15, 127, 15, 127), # 通用的红色阈值
              (30, 100, -64, -8, -32, 32), # 通用的绿色阈值
              (0, 30, 0, 64, -128, 0)]     # 通用的蓝色阈值

固定代码部分

以下是固定代码,没什么好讲的。只需要注意,因为我们是颜色识别,所以必须关闭白平衡和自动增益。如果不关闭会导致颜色阈值发生改变,影响识别效果。感光元件介绍,这是官方介绍。RGB565表示是彩色识别,GRAYSCALE是黑白的。set_framesize是设置图像大小。

sensor.reset()                      #重置感光元件,重置摄像机
sensor.set_pixformat(sensor.RGB565) #设置颜色格式为RGB565,彩色,每个像素16bit。
sensor.set_framesize(sensor.QVGA)   #图像大小为QVGA
sensor.skip_frames(time = 2000)     #跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
sensor.set_auto_gain(False)         #颜色识别必须关闭自动增益,会影响颜色识别效果
sensor.set_auto_whitebal(False)     #颜色识别必须关闭白平衡,会影响颜色识别效果,导致颜色的阈值发生改变
clock = time.clock()


死循环部分

进入死循环

while(True):

clock.tick()讲解

clock.tick() ,OpenMV官方文档的解释是开始追踪运行时间。我将其注释掉也可以正常运行。应该就只是记录OpenMV运行时间而已,返回值并没有接收,可有可无。

 clock.tick()             # 追踪两个snapshots()之间经过的毫秒数.

sensor.snapshot()讲解

img = sensor.snapshot(),截取感光元件中的照片,将截取的图片存入辅助帧缓冲存储区,返回参数image对象。这个时候,img这个变量就是image,可以理解为等价。

img = sensor.snapshot()#截取感光元件中的一张图片

for ... in ...部分

image.find_blobs()函数讲解

这个for ... in ...,我们先看img.find_blobs。前面说了,这个时候,img这个变量就是image。也就是说img.find_blobs=image.find_blobs。我们查官方手册查看此函数内容,可以看到第一个参数thresholds表示颜色阈值,也就是上面我们自己设置的LAB值。

第二个参数是roi,感兴趣区,通俗来说就是,我们要在画面中的哪一部分进行颜色识别。此处没有设置,就表面是整个区域都要进行颜色识别。

第三,四个参数是x_stride ,y_stride 。表示x和y轴上像素点个数大于等于x_stride和y_stride才会被识别。比如说, x_stride=2, y_stride=1是默认参数,此处这里没有设置,系统就认定X轴像素点不能小于2个。如果识别到x和y轴仅有一个像素点宽度,将会被忽略。

第五个参数是invert, 反转阈值,把阈值以外的颜色作为阈值进行查找。意思就是说,如果invert=True,而我们设置的颜色阈值是红色。那么OpenMV将会识别除红色以外的所有区域。

第六,七个参数分别是area_threshold (面积阈值),pixels_threshold (像素个数阈值)。如果如果色块被框起来的面积小于area_threshold,或者色块像素数量小于pixels_threshold,会被过滤掉。

第八个参数是merge 。默认为False,如果merge=True,那么识别到的所有色块将会合并成一个大色块。例如,OpenMV识别到右上方,中间分别一个色块(注:两个没有连接,具有明显的距离)。如果merge=False,那么图像上将会出现两个方框。而如果merge=True,那么将会是一个大方框将两个方框都包含。

第九个参数margin ,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。通俗来说就是,如果左边a个像素点,右边b个像素点,这两个都被识别。但是a和b中间有一个像素点不属于识别单位,因为margin=1,我们会将这一个不是识别单位强行变成识别单位。但是假如a和b之间有两个像素点不属于识别单位,这样着两个像素点就不会被强行变成识别单位。

之后的四个参数我也没搞明白,默认参数就行,不用管。

此处,我们对这个img.find_blobs传入了四个值,分别是目标LAB阈值,目标像素个数低于200个的忽略,被框选面积小于200也被忽略。具体值可以根据需求调整。识别到的所有色块将会合并成一个大色块。(注意,如果我们不是按照规定的顺序给函数传入参数,必须前面加参数类型=传入值。如,thresholds[threshold_index]就是第一个参数值,所以不需要写成thresholds=[thresholds[threshold_index]],而后面三个需要,因为他们具体传参不是在第二,三,四位置)

之后img.find_blobs这个函数会根据传入参数进行输出一个包括每个色块的色块对象的列表,此列表存入blob中。

for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True):


# 如果我们需要配置感兴趣区,方法如下。roi的格式是(x, y, w, h)的tupple.
# x:ROI区域中左上角的x坐标
# y:ROI区域中左上角的y坐标
# w:ROI的宽度
# h:ROI的高度
left_roi = [0,0,160,240]  
blobs = img.find_blobs([red],roi=left_roi)

blob.elongation()讲解

后面这句if blob.elongation() > 0.5:,blob.elongation()这个函数的作用就是看这个图案是否像圆形,如果越像圆,这个值越小,越不像圆,这个值越大。

if blob.elongation() > 0.5:  #可忽略

img.draw_edges()和 img.draw_line部分解析

 接下来这三句话也可以注释,因为我们只需要把目标框选出来就可以了。这三句话作用就是利用一个红色的方框,绘制出Blob的最小边界。利用一个绿色的线,绘制穿过最小面积矩形的最长边。利用一个蓝色的线,绘制穿过最小面积矩形的最短边。如果我这么说不理解,可以分别注释掉着三句话,查看OpenMV的反应,就能理解了。

            img.draw_edges(blob.min_corners(), color=(255,0,0))     #利用一个红色的方框,绘制出Blob的最小边界
            img.draw_line(blob.major_axis_line(), color=(0,255,0))  #利用一个绿色的线,绘制穿过最小面积矩形的最长边
            img.draw_line(blob.minor_axis_line(), color=(0,0,255))  #利用一个蓝色的线,绘制穿过最小面积矩形的最短边

 
img.draw_rectangle(blob.rect())解析。

img.draw_rectangle(blob.rect())就是利用矩形将目标单位框选出来。blob.rect(),返回一个色块边界框,矩形元组(x, y, w, h) ,对应左上角x,y坐标,矩形宽和高。image.draw_rectangle(),利用(x, y, w, h) 绘制矩形,颜色默认为白色。


blob.cx(), blob.cy()分别返回色块中心点的x,有坐标。利用 img.draw_cross()绘制一个十字形标记。
  
        img.draw_rectangle(blob.rect())      #用矩形标记出目标颜色区域
        img.draw_cross(blob.cx(), blob.cy()) #在目标颜色区域的中心画十字形标记

print()解析 

最后这句就是打印帧率(帧率是每秒图像的数量)。如果只想用于颜色识别,可注释掉。

    print(clock.fps()) #打印帧率

结论:

 最后结果如下,可删除注释部分

# 这个例子展示了使用OpenMV Cam的单色RGB565跟踪。
import sensor, image, time, math

threshold_index = 0 # 0 for red, 1 for green, 2 for blue

# 颜色跟踪阈值 (L Min, L Max, A Min, A Max, B Min, B Max)
# 下面的阈值通常跟踪红色/绿色/蓝色的东西。您可能希望调整它们……
thresholds = [(16, 8, -39, 18, -31, 9), # generic_red_thresholds
              (54, 77, -9, 9, 85, 47), # generic_green_thresholds
              ]     # generic_blue_thresholds

sensor.reset()#重置感光元件,重置摄像机
sensor.set_pixformat(sensor.RGB565) #设置颜色格式为RGB565,彩色,每个像素16bit。
sensor.set_framesize(sensor.QVGA)   #图像大小为QVGA
sensor.skip_frames(time = 2000)     #跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
sensor.set_auto_gain(False)         #颜色识别必须关闭自动增益,会影响颜色识别效果
sensor.set_auto_whitebal(False)     #颜色识别必须关闭白平衡,会影响颜色识别效果,导致颜色的阈值发生改变
clock = time.clock()

# 只有像素大于“pixels_threshold”和面积大于“area_threshold”的区域才是
# 由下面的"find_blobs"返回。更改“pixels_threshold”和“area_threshold”
# 相机的分辨率。"merge=True"合并图像中所有重叠的斑点。

while(True):
    clock.tick()# 追踪两个snapshots()之间经过的毫秒数.
    img = sensor.snapshot()#截取感光元件中的一张图片
    #在img.find_blobs这个函数中,我们进行颜色识别
    #roi是“感兴趣区”,是在画面的中央还是右上方或者哪里进行颜色识别。此处我们没有进行配置,默认整个图像进行识别
    for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True):
        # 这些值依赖于blob不是循环的-否则它们将不稳定。
        #if blob.elongation() > 0.5:
            #img.draw_edges(blob.min_corners(), color=(255,0,0))    #利用一个红色的方框,绘制出Blob的最小边界
            #img.draw_line(blob.major_axis_line(), color=(0,255,0)) #利用一个绿色的线,绘制穿过最小面积矩形的最长边
            #img.draw_line(blob.minor_axis_line(), color=(0,0,255)) #利用一个蓝色的线,绘制穿过最小面积矩形的最短边
        # 这些值始终是稳定的。
        img.draw_rectangle(blob.rect())      #用矩形标记出目标颜色区域
        img.draw_cross(blob.cx(), blob.cy()) #在目标颜色区域的中心画十字形标记
        # 注意- blob的旋转是唯一的0-180。
        #img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)
    #print(clock.fps()) #打印帧率

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMV的单颜色识别讲解 的相关文章

  • SpringSecurity用户密码验证过程

    SpringSecurity过滤链当中的UsernamePasswordAuthenticationFilter负责登陆密码验证 AbstractAuthenticationProcessingFilter是UsernamePassword
  • 项目实战:基于 TCP 的局域网内高性能文件传输系统设计与实现

    0 写在前面1 系统设计目标2 系统整体设计思路 2 1 网络传输协议的选择与通信协议的设计2 2 数据库设计 3 上传 下载文件的设计方案4 断点续传的原理及设计5 秒传的原理及设计6 数据库设计 API 编程与 shell 脚本的结合7
  • 进程与线程学习心得

    一 进程与线程的区别 1 进程是操作系统进行资源调度和分配的基本单位 线程是操作系统可执行的最小调度和分配单位 2 一个线程属于一个进程 一个进程可以有多个线程 3 一个进程崩溃不影响其他进程 但是一个线程崩溃会让进程崩溃 4 进程在执行过
  • 《网络编程》C语言 创建TCP服务器(三种)

    一 循环服务器 伪代码 xff1a sfd 61 socket bind listen while 1 newfd 61 accept while 1 recv send close newfd
  • 《网络编程》C语言 使用select函数搭建TCP客户端和服务器

    IO 多路复用概念 1 允许同时多个 IO 进行操作 xff0c 内核一旦发现进程执行一个或多个 IO 事件 xff0c 就会通知该进程 2 应用程序中同时需要处理多路输入输出流 select 功能 xff1a 让内核监听指定集合中的文件描
  • ubuntu下切换python版本(python2与python3之间的切换,python3与python3之间的切换)

    目录 1 问题2 重装python3 83 配置 python3 8 为系统默认 python34 切换回系统自带的python3 1 问题 有点无语 xff0c python3 8明明下载安装好 但是设置python默认版本为python
  • Ubuntu22.04中解决mNetassist无法打开问题

    因为本人在安装mNetassist遇到很多问题 xff0c 也是查找了很多资料 xff0c 最终解决了问题 因为每个人遇到的问题会有所不同 xff0c 故把本人的安装经历记录下来 xff0c 以供参考 大家可参考的文章是这篇 xff0c 但
  • C++中常用的库函数 (自用)

    常用的库函数 一 前言二 内容1 sort 题目 2 upper bound 与lower bound 题目 3 to string 4 string 内嵌的 find 函数 注 xff1a vector无find 函数5 大小写转换 to
  • 四轴飞行器PID调参建议

    在动态控制中 xff0c 我们通过调整PID三个参数来获得动力 xff0c 同时消除振荡 xff0c 找到对你当前的飞行场景来说更优的手感 P xff08 Propotional xff09 是比例的简称 P 单元控制着控制系统的所有动力
  • C语言string库strcpy、strcmp、strcat函数详解

    strcpy 即string copy 语法格式为strcpy str1 str2 作用是将str2赋值给str1 使用方法类似于 char str1 10 str2 61 34 abc 34 strcpy str1 34 bcd 34 s
  • VScode常用快捷键、

    VScode常用快捷键 xff1a 英文 按回车enter xff1a 会快速打出html 后缀名 自行填写 shift xff0b alt xff08 鼠标放在复制行代码区 xff0c 或者鼠标选择区域 xff09 按控制 向下 键 xf
  • 深入了解运行时栈(C语言)

    文章目录 运行时栈函数的栈帧寄存器与机器指令寄存器 xff1a 机器指令 程序计数器控制转移数据传送参数的传递返回值的传递 举例 xff1a 函数栈帧创建和销毁的全过程小结 运行时栈 栈是一种数据结构 xff1a 我们可以向这种结构中存入数
  • 小四轴调试记录

    从准备理论到实际动手调试大约耗时半年吧 xff0c 期间看了很多理论知识 xff0c 惯性导航方面的文章 至于为什么选择从小四轴入手 xff0c 当时的理由很简单 xff1a 1 便宜 xff0c 2 空心杯电机虽然有刷会坏但便宜 xff0
  • 登录 账号密码验证

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta http equiv 61 34 X U
  • 关于C++变量重复定义

    本人是刚入学的大一计算机类学生 xff0c 最近在学习C 43 43 xff0c 在回顾这个代码时候发现 xff0c 这个重复定义i和j会导致之前定义的全局变量i和j并不能起作用 xff0c 现在还不太清楚为什么 xff0c 请小伙伴们注意
  • OpenMV——色块识别

    OpenMV有很多示例代码 xff0c 下面是我学习过程中有关知识的总结 目录 前言 一 阈值选择 二 代码 前言 函数RGB 255 0 0 表示的是红色 RGB 255 0 0 含义 xff1a 红色值 Red 61 255 xff1b
  • 链表的概念以及相关基础操作

    前言 xff1a 链表是数据结构里面最开始的章节 xff0c 也是对新手的理解有困难的第一章 笔者大二下学校才开设数据结构 xff0c 以防自己忘记 xff0c 遂记录之 链表的概念 xff1a 链表是一种物理存储单元上非连续 非顺序的存储
  • Sqoop数据导入 第2关:Mysql导入数据至HDFS上

    为了完成本关任务 你需要掌握 1 数据库 MySQL 建表 2 Mysql 数据导入至 HDFS 中 数据库 MySQL 建表 用命令进入 MySQL 客户端 mysql uroot p123123 h127 0 0 1 创建数据库hdfs
  • 一、单链表创建以及操作

    链表操作全内容 xff1a 1 xff0c 链表创建 2 xff0c 创建头结点 xff08 赋值 xff09 3 xff0c 输出当前链表 4 xff0c 连接节点形成链表 5 xff0c 插入节点函数 6 xff0c 删除节点函数 7
  • STL常用的容器

    STL常用容器 目录 STL常用容器vector容器pair c 43 43 内置二元组 不需要头文件stringqueue 队列priority queue 优先队列stack 栈deque 双端队列 速度异常的慢set map mult

随机推荐

  • Ubuntu网页连接失败的解决方法

    问题如下 xff1a 一 首先你要先检查自己的Ubuntu是否能连接上网络 二 在确保自己能连接上网络时 xff0c 网页连接失败的原因可能是你的Firefox浏览器的默认搜索引擎时Google xff0c 只需要在网页设置 搜索 中将搜索
  • Hal库_stm32开发之串口IDLE空闲中断+DMA接收不定长数据并修改数据

    本文写自于博主编写平衡智能车程序的时候 xff0c 由于中断使用的较多 xff0c 如定时器中断 xff0c 串口中断等等 为了避免MCU运行程序时卡死 xff0c 我就将串口中断改为串口IDLE空闲接收中断 可以实现不定长数据的接收 xf
  • PCB学习(一)——立创EDA边框设置

    一 伴随原理图转PCB生成的边框 通过在 原理图界面 点击 设计 下的 原理图转PCB xff08 Alt 43 P xff09 xff0c 可以得到如下 矩形边框 二 PCB界面设置边框 在 PCB界面 点击 工具 下的 边框设置 xff
  • c++模板类/模板函数的声明与定义应该放在头文件里

    c 43 43 模板类 模板函数的声明与定义应该放在头文件里 xff0c 不要分开来写类中函数的声明与定义 xff08 比如在 H文件里声明某个成员函数 xff0c 在 CPP文件里定义该成员函数 xff09 xff0c 这样会导致连接错误
  • STM32的GPIO端口配置八种模式的理解

    文章目录 一 GPIO的结构框图二 八种模式1 模拟输入 xff08 GPIO Mode AIN xff09 2 浮空输入 xff08 GPIO Mode IN FLOATING xff09 3 上拉输入 xff08 GPIO Mode I
  • ESP32 micro-usb 多数据量并简单加密的串口通信

    文章目录 前言一 ESP32和上位机的环境二 上位机部分1 串口通信的准备2 数据的准备与发送 三 下位机部分1 ESP32串口通信准备2 数据的接收四 同时测试 总结 前言 最近在研究单片机与上位机的串口通信 xff0c 刚好手头有一块E
  • boost之跨平台 错误处理

    system C 43 43 中处理错误的最佳方式是使用异常 xff0c 但操作系统和许多底层AP工不具有这个能力 xff0c 它们一般使用更通用也更难以操作的错误代码来表示出错的原因 xff0c 不同的操作系统的错误代码通常不是兼容的 x
  • 记录一下vector基本用法(简单易懂)

    vector容器的初始化 vector的使用首先需要加一个头文件 include lt vector gt xff1b vector lt int gt a 最一般的初始化方法 xff0c 就是定义一个容器啊a xff1b vector l
  • MPU6050基本原理介绍及程序配置

    一 MPU6050简介 1 内部主要结构 xff1a 陀螺仪 加速度计 数字运动处理器DMP xff08 Digital Motion Processor xff09 PS MPU6050还含有第二IIC接口 xff0c 用于连接一个 第三
  • Robomaster上位机视觉摘要——比赛规则篇

    本文是笔者多日来总结的2023赛季中针对上位机组的比赛规则摘要 xff0c 力求一文让你看懂上位机在赛场中的飒爽身影 目录 电力元件 电池 遥控器 激光 涂装 机器人 飞镖 雷达 空中机器人 工程机器人 哨兵机器人 英雄与步兵机器人 视觉应
  • C语言:结构体——关于内存字节对齐图文详解

    前言 xff1a 我们在学到c语言内存管理的时候总是一遍惊叹 xff0c 其聪明的内存管理策略 xff0c 一遍抱怨其难以理解的方法 xff0c 网上的资料要不讲究的太详细 xff0c 要不没能讲解清楚 xff0c 今天我们根据实例来学习一
  • 结构体+联合体 详解

    文章目录 一 结构体1 结构体变量2 特殊声明3 结构体的引用1 嵌套调用2 自引用 三 结构体的初始化四 结构体的内存对齐1 用法2 练习题3 修改对齐数 五 位段1 用法2 练习题 六 联合体1 用法2 练习题1 正常算法题2 用联合体
  • Ubuntu20.04——一篇文章让你从零配置VINS_Mono环境以及运行(2023年最新)

    注 xff1a 文末包含该文章涉及的所有安装包的网盘链接 零 换源 xff08 也可以先不换 xff0c 后面觉得下载慢再换也行 xff09 1 备份原来的源 sudo cp etc apt sources list etc apt sou
  • 学C语言推荐的书和软件—C Primer Plus和Dev C++

    写这个的目的是复习巩固C Primer Plus的知识 xff0c 我会一直更新这个系列 对于这本书 xff0c 入门C语言是完全够了 xff0c 后面的链表 队列和二叉树比较综合 xff0c 难度大一些 用这本书学C语言非常好 xff0c
  • mavlink python

    from pymavlink import mavutil Create the connection m 61 mavutil mavlink connection 39 udpin 0 0 0 0 14550 39 dir m mav
  • C++Vector浅析,Vector用法大全

    vector基本概念 功能 xff1a vector数据结构和数组非常相似 xff0c 也成为单端数组 vector与普通数组的区别 xff1a 不同之处在与数组是静态空间 xff0c 而vector可以动态扩展 动态扩展 xff1a 并不
  • 网络通信--Linux

    文章目录 网络通信的基础通信模型IP地址和端口port 网络套接字网络字节序初识UDP与TCP两种协议sockaddr结构体家族认识一些网络常用基础函数 UDP实现简单通信TCP实现简单通信总结 网络通信的基础 网络通信是建立在多层协议之下
  • Git分支和版本(标签)

    目录 一 Git分支 1 1 四大环境 xff08 分支 xff09 1 1 1 分支和标签的关系 1 2 分支的作用 1 3 演示分支 1 3 1 在Gitee中创建项目 1 3 2 克隆到本地 1 3 3 建立分支 1 3 4 切换分支
  • 前端必会算法——栈和队列

    上一篇 前端必会算法 标准快速排序 栈和队列 栈 xff08 Stack xff09 可以理解为是一个箱子 xff0c 存放东西的容器 栈结构的特点 xff1a 先入后出 xff0c 栈相当于一个箱子 xff0c 先放进去的东西被压在了下面
  • OpenMV的单颜色识别讲解

    OpenMV的官方教程 xff1a 寻找色块 xff1b single color rgb565 blob tracking示例讲解 xff1b 视频讲解 需要提前看的文章 xff1a 程序烧录 xff1b 颜色阈值设置 目录 thresh