Openmv(一)OpenMV图像处理的基本方法

2023-05-16

一、图像处理基础知识

  1. 摄像头:光学信号转换成电信号。计算机视觉中,最简单的模型是小孔成像模型。
    小孔成像是一种理想模型,实际镜头会存在场曲和畸变等,但可以通过在标定过程中引入畸变参数解决,仍可广泛使用。

  2. 像素和分辨率

  3. 帧率:每秒钟处理的图片数量,>20人眼分辨不出卡顿。

  4. 颜色:不同波长的电磁波
    通过RGB. CMYK HSB LAB色域来描述
    RGB:三原色原理不是物理原因而是人的生理原因造成(锥形感光细胞)
    LAB:L(亮度)、A(+:红色,-:绿色)、B(+:黄色,-:蓝色)用来接近人类视觉
    L用来调整亮度对,a和b用来输出色阶来做精确的颜色平衡(查找色块算法)
    HSB/HSV:H(Hue色相)、S(Saturation饱和度)、B(Brightness明度)
    HSL:L(亮度)
    CMYK:C(蓝色)、M(红色)、Y(黄色)、K(黑色)
    CMYK和RGB的区别:
    (1)CMYK是减色模式,而RGB是加色模式
    (2)CMYK需要外界光源才能看到,印刷品颜色;RGB是屏幕显示发光的色彩模式,在黑暗房间也能看到

  5. 光源的选择(光源对整个画面的颜色变化有很大影响)

  6. 镜头的焦距和镜头畸变
    焦距决定了拍摄的成像大小,视场角大小,景深大小和画面的透视强弱。焦距长成像大(视角越小),焦距短成像小
    镜头畸变:用代码矫正镜头或直接使用无畸变镜头(加入了额外的矫正透镜部分)
    在感光芯片上的不同位置,与镜头距离不同近大远小,在边缘出现鱼眼效果(桶形畸变)
    标配镜头——桶形畸变
    广角镜头——同样的区域取景范围大了
    无畸变镜头
    长焦镜头——锁定原来图像中的某一具体物体

  7. 镜头的滤片
    滤掉红外光(根据需要滤掉不同波长的光),红外光在正常分析颜色图片的时候会使图像泛白影响分析。(只能通过650nm以内的)

二、OpenMV图像处理的基本方法

1. 感光元件

sensor模块,用于设置感光元件的参数。

sensor常用函数:

import sensor # 引入感光元件部分
# 设置摄像头
sensor.reset() # 初始化感光元件
sensor.set_pixformat(sensor.RGB565)# 设置像素模式 sensor.GRAYSCALE:灰度,每个像素8bit, sensor.RGB565:彩色。每个像素16bit
sensor.set_framesize(sensor.QVGA)# 设置图像大小
sensor.skip_frames(n)# n是跳过的帧数,等待感光元件稳定
# 拍摄
while(True):
   img = sensor.snapshot();# 拍摄一张照片,img为一个image对象

# 自动增益/白平衡/曝光
sensor.set_auto_gain() # True开启;False关闭,使用颜色追踪时,需关闭
sensor.set_auto_whitebal() # True开启;False关闭,使用颜色追踪时,需关闭
sensor.set_auto_exposure(enable[\,exposure_us])
# enable True打开/False关闭
# 如果关闭可以自己设置一个曝光值us为单位

# 设置窗口ROI
sensor.set_windowing(roi) #roi的格式是(x, y, w, h)的tupple.
sensor.set_framesize(sensor.VGA)
sensor.set_windowing((640,80))#选择出自己想要的元素

# 设置翻转
sensor.set_hmirror(True)# 水平方向翻转
sensor.set_vflip((True)# 垂直方向翻转
sensor图像大小常用数据
sensor.QQCIF: 88x72
sensor.QCIF: 176x144
sensor.CIF: 352x288
sensor.QQSIF: 88x60
sensor.QSIF: 176x120
sensor.SIF: 352x240
sensor.QQQQVGA: 40x30
sensor.QQQVGA: 80x60
sensor.QQVGA: 160x120
sensor.QVGA: 320x240
sensor.VGA: 640x480
sensor.HQQQVGA: 80x40
sensor.HQQVGA: 160x80
sensor.HQVGA: 240x160
sensor.B64X32: 64x32 #(用于帧差异 image.find_displacement())
sensor.B64X64: 64x64 #用于帧差异 image.find_displacement())
sensor.B128X64: 128x64 #(用于帧差异 image.find_displacement())
sensor.B128X128: 128x128 #(用于帧差异 image.find_displacement())
sensor.LCD: 128x160 #(用于LCD扩展板)
sensor.QQVGA2: 128x160 #(用于LCD扩展板)
sensor.WVGA: 720x480 #(用于 MT9V034)
sensor.WVGA2:752x480 #(用于 MT9V034)
sensor.SVGA: 800x600 #(仅用于 OV5640 感光元件)
sensor.XGA: 1024x768 #(仅用于 OV5640 感光元件)
sensor.SXGA: 1280x1024 #(仅用于 OV5640 感光元件)
sensor.UXGA: 1600x1200 #(仅用于 OV5640 感光元件)
sensor.HD: 1280x720 #(仅用于 OV5640 感光元件)
sensor.FHD: 1920x1080 #(仅用于 OV5640 感光元件)
sensor.QHD: 2560x1440 #(仅用于 OV5640 感光元件)
sensor.QXGA: 2048x1536 #(仅用于 OV5640 感光元件)
sensor.WQXGA: 2560x1600 #(仅用于 OV5640 感光元件)
sensor.WQXGA2: 2592x1944 #(仅用于 OV5640 感光元件)

相关名词解释

  1. 自动增益
    为了能在不同的景物照度条件下都能输出的标准视频信号,必须使放大器的增益能够在较大的范围内进行调节。这种增益调节通常都是通过检测视频信号的平均电平而自动完成的,实现此功能的电路称为自动增益控制电路,简称AGC电路 。具有AGC功能的摄像机,在低照度时的灵敏度会有所提高,但此时的噪点也会比较明显。这是由于信号和噪声被同时放大的缘故
  2. 白平衡
    就是让白色看起来是白色。在日光灯的房间里拍摄的影像会显得发绿,在室内钨丝灯光下拍摄出来的景物就会偏黄,而在日光阴影处拍摄到的照片则莫名其妙地偏蓝,其原因就在于白平衡的设置上。
  3. 色温
    光线的温度——暖光或冷光(K:开尔文)冷光色温高偏蓝;暖光色温低偏红
    光的色调是通过色温来实现的,色温会告诉相机这些光是暖色调还是冷色调
    在这里插入图片描述
  4. 曝光
    光圈越大,单位时间内通过的光越多;快门,允许光通过的时间。
    光圈表示方法:F+数值,数值越小光圈越大,相邻差2倍
    快门表示方法:1/30s,直接使用时间单位,相邻差2倍
    光圈和快门的组合形成了曝光量(不同的组合虽然能够达到相同的曝光量,但是所拍摄出来的图片效果是不同的)
    根据物体运动的规律选择快门,在拍摄运动物体时发现,往往拍摄出来的主体是模糊的,这多半就是因为快门的速度不够快。快门快了,进光量可能减少,色彩偏淡,这就需要增加曝光来加强图片亮度。
    曝光模式是计算机采用自然光源的模式——快门优先、光圈优先、手动曝光、AE锁等模式。
    (1)快门和光圈优先:机器自动测光系统计算出曝光量的值,然后自己选择快门和光圈,系统根据你选的快门或光圈去确定另一个的参数(在手动定义快门(光圈)的情况下通过相机测光而获取光圈(快门)值)
    (2)手动曝光模式
    每次拍摄时都需手动完成光圈和快门速度的调节
    (3)AE模式(Auto Exposure自动曝光)
    光圈优先AE式,快门速度优先AE式,程式AE式,闪光AE式和深度优先AE式
  5. ROI
    要处理的图像中提取出的要处理的区域
    在这里插入图片描述
    roi的格式是(x, y, w, h)的tupple.
    x:ROI区域中左上角的x坐标
    y:ROI区域中左上角的y坐标
    w:ROI的宽度
    h:ROI的高度

2. 图像的基本运算

相关函数:

# 1. 获取/设置像素点
image.get_pixel(x,y)
# 获取一个像素点的值
# 灰度:得到灰度值
# RGB:得到(r,g,b)的tuple

image.set_pixel(x,y,pixel)
# 设置一个像素点的值
# 灰度:设置灰度值
# RGB:设置(r,g,b)的tuple

# 2. 获取图像的宽度和高度
image.width()
image.height()
image.format()# 返回灰度还是彩色
image.size() # 返回图像大小byte

# 3. 图像的运算
# 图像可以是从文件读入的iamge对象,但是二者必须是相同的尺寸和类型(灰色/彩色)
image.invert() # 取反,二值图像0变1,1变0
image.nand(image) #与非
image.nor(image) #或非
image.xor(image) #异或
image.xnor(image) # 异或非
image.difference(image) # 从一张图片减去另一张图片,绝对值相减,经常用于移动检测

3. 使用图像的统计信息

使用ROI选择需要处理的图像区域,然后根据相应函数返回对所要研究区域的对应值。

image.get_statistics(roi=Auto)# roi bins之类的参数一定要显式声明 

image.get_statistics(roi=(0,0,10,20))
#statistics.mean() 返回灰度的平均数(0-255) (int)。你也可以通过statistics[0]获得。
#statistics.median() 返回灰度的中位数(0-255) (int)。你也可以通过statistics[1]获得。
#statistics.mode() 返回灰度的众数(0-255) (int)。你也可以通过statistics[2]获得。
#statistics.stdev() 返回灰度的标准差(0-255) (int)。你也可以通过statistics[3]获得。
#staistics.min() 返回灰度的最小值(0-255) (int)。你也可以通过statistics[4]获得。
#statistics.max() 返回灰度的最大值(0-255) (int)。你也可以通过statistics[5]获得。
#statistics.lq() 返回灰度的第一四分数(0-255) (int)。你也可以通过statistics[6]获得。
#statistics.uq() 返回灰度的第三四分数(0-255) (int)。你也可以通过statistics[7]获得。

# lab三个通道的相关信息
#l_mean,l_median,l_mode,l_stdev,l_min,l_max,l_lq,l_uq,
#a_mean,a_median,a_mode,a_stdev,a_min,a_max,a_lq,a_uq,
#b_mean,b_median,b_mode,b_stdev,b_min,b_max,b_lq,b_uq,

4. 画图

将所研究区域标注出来

# 颜色可以是灰度值0-255,也可以是彩色值(r,g,b)的tuple,但是color必须显式注明,默认是白色
image.draw_line((10,10,20,30),color=(255,0,0))
image.draw_rectangle(rect_tuple,color=(255,0,0))

# 画直线
image.draw_line(line_tuple,color=White) 
# line_tuple=(x1,y1,x2,y2) 从(x1,y1)到(x2,y2)的直线
# 颜色可以是灰度值(0-255),也可以是彩色值(r,g.b)的tuple

# 在图像中画一个矩形框
image.draw_rectangle(rect_tuple, color=White) 
# 在图像中画一个矩形框
# rect_tuple 的格式是 (x, y, w, h)

# 画圆
image.draw_circle(x, y, radius, color=White) 
# 在图像中画一个圆
# 圆心+半径

# 画十字
image.draw_cross(x, y, size=5, color=White) 
# 在图像中画一个十字
# size是两侧的尺寸

# 写字
image.draw_string(x, y, text, color=White)
# 在图像中写字 8x10的像素
# xy是坐标,使用\n\r或\r\n会使光标移动到下一行
# text是要写的字符串

5. 寻找色块

find_blobs函数的参数介绍:

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, 
area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, 
merge_cb=None)
# thresholds 颜色的阈值
# roi感兴趣区
# x_stride 查找的色块的x方向上最小宽度的像素,比如想要找x方向上宽度大于10的像素,=10即可(默认是2)
# y_stride 查找的色块的y方向上最小宽度的像素(默认是1)
# invert 反转阈值,将阈值以外的颜色作为阈值进行查找
# area_threshold 面积阈值,如果色块被包围起来的面积小于这个值会被舍弃
# pixels_threshold 像素个数阈值,如果色块的像素数量小于这个值,会被过滤掉
# merge True,合并所有重叠的blob为1个,这个是合并所有的blob,无论什么颜色,如果想要分别混合的话,分别调用不同颜色阈值的find_blobs
# margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并
# 合并所有
all_blobs = img.find_blobs([red,blue,yellow],merge=True)
# 单个合并
red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)

find_blobs的返回值介绍:
find_blobs对象返回的是多个blob的列表,一个blobs列表里面包含很多的blob对象,blobs对象就是色块,每个blobs对象包含一个色块的信息。
可以使用for循环遍历色块:

blobs = img.find_blobs([red])
for blob in blobs:
	print(blob.cx())

色块blob对象

常见blob的方法:

blob.rect() #返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。
blob.x() #返回色块的外框的x坐标(int),也可以通过blob[0]来获取。
blob.y() #返回色块的外框的y坐标(int),也可以通过blob[1]来获取。
blob.w() #返回色块的外框的宽度w(int),也可以通过blob[2]来获取。
blob.h() #返回色块的外框的高度h(int),也可以通过blob[3]来获取。
blob.pixels() #返回色块的像素数量(int),也可以通过blob[4]来获取。
blob.cx() #返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
blob.cy() #返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。
blob.rotation() #返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。
blob.code() #返回一个16bit数字,每一个bit会对应每一个阈值。
# 一个色块red-0001,blue-0010,如果是red和blue的merge得到的blob-0011
blob.count() #如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取
blob.area() #返回色块的外框的面积。应该等于(w * h)
blob.density() #返回色块的密度。这等于色块的像素数除以外框的区域。
#如果密度较低,那么说明目标锁定的不是很好。
#比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。

颜色阈值

# 分别是LAB的最小值和最大值
red = (minL, maxL, minA, maxA, minB, maxB)
# 如果是灰度图的话,只有min和max
grey = (min,max)


颜色阈值的获得:

在这里插入图片描述
在这里插入图片描述
帧缓冲区是IDE实时获取的图像;图像文件是SD卡中存储的。

在这里插入图片描述
拖动滑块可以直接看到阈值的效果,想要的结果就是将目标颜色都变成白色,其他颜色全为黑色

6. AprilTag实现标记跟踪

AprilTag是一个视觉基准系统,可用于各种任务,包括AR,机器人和相机校准。这个tag可以直接用打印机打印出来,而AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id在这里插入图片描述
可以得到空间位置量和旋转角度进行3D定位
在这里插入图片描述
???

6. 模版匹配NCC

归一化互相关匹配
???
注意:

  1. 模版图片的大小如果超过openmv内置的flash,需要SD卡
  2. 创建或导入的模版必须是pgm格式的,而且大小不能超过openmv的像素大小
  3. 可以直接使用openmv截取模版图像,但是一定要注意转换成pgm格式

7. 多模版匹配

提前存取多个模版即可

8. 特征点检测

特征点检测要比模版匹配更加灵活,模版匹配只要大小和角度有一点不同,就可能匹配失败。但是特征点检测,在刚开始运行程序的时候,例程提取最开始的图像作为目标物体特征,kpts1保存目标物体的特征。默认会匹配目标特征的多种比例大小和角度,而不仅仅是保存目标特征时的大小角度。也可以提前保存目标特征,之前不这么做是因为每次运行程序光线不同特征不同,匹配度会降低,但是增加了对曝光度、白平衡、自动增益值的调节之后,相对来说会减弱光线的干扰,也可以提前保存特征(车里光线的干扰情况也得考虑。。)

例程有参考价值(待。。)
例程只支持灰度图,注意一下使用的特征提取算法是FAST/AGAST算法

9. 测距

  1. 第一种方法是Apriltag进行3D定位测距
  2. 第二种方法按照参照物距离的比例进行测距
    得第一次通过一个实际距离已知的测距来得到参数k的值,然后再进行后面的计算。

OpenMV使用的是单目摄像头。
关于单目摄像头和双目摄像头:
无人驾驶的智能摄像头要求:看得远,质量高。
看得远长焦距,但视角会变窄,主要是反应时间充足;质量高采用黑白相机成像。
测距原理上,两种摄像头便完全不同。单目摄像头需要对目标进行识别,也就是说在测距前先识别障碍物是车、人还是别的什么。在此基础上再进行测距。而双目摄像头则更加像人类的双眼,主要通过两幅图像的视差计算来确定距离。​双目摄像头当然也不是十全十美,因为需要靠计算来进行测距。其最大的难点就在于计算量巨大。这带来的直接问题就是小型化难度很大。

例程有参考价值(待。。)

10. 扫码识别

暂时没用

11. 颜色形状同时识别

例程是首先在图像中进行圆形识别,然后统计圆形中的图像颜色

12. 颜色模版匹配同时识别

首先进行颜色识别,然后再去识别到的颜色区域里去找到所要的模版
和11一样,例程具有参考价值而且如何进行算法的组合使用需要考虑(待。。)

13.分辨不同人脸

例程可用(待。。)
使用LBP特征分辨不同的人脸。这里是首先选择了20张同一个人不同表情的人脸保存(通过不同的灯光显示告知被采集数据者数据采集完成与否)
然后识别的是当前摄像头视野内的人脸并输出与当前对象最匹配的人。

14. 高级特征

HAAR
HOG
LBP
看一下其他实际应用效果比较好的特征可以应用的选择一下

(待。。)

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

Openmv(一)OpenMV图像处理的基本方法 的相关文章

  • Deep Meta Learning for Real-Time Target-Aware Visual Tracking 论文阅读

    这篇文章是韩国的一个组做的 一直没中 直到19年中了ICCV xff0c 据说是第一篇将元学习引入目标跟踪的文章 xff0c 用的架构是siamese网络的架构 xff0c 但是在模型在线更新的时候使用了meta learning的思想 M
  • 单链表倒序

    单链表倒序 题目来源 牛客网 题目描述 输入一个链表 xff0c 按链表从尾到头的顺序返回一个ArrayList span class token keyword public span span class token keyword c
  • VS2019中编写C语言

    建立C 43 43 控制台程序 xff0c 将main函数所在的文件后缀名从cpp改成c xff0c 然后复制下列模板即可 xff1b 模板如下 xff1a dsa zju cpp 此文件包含 34 main 34 函数 程序执行将在此处开
  • CMake编译工程/第一个CMakeLists.txt(最详细案例演示)

    目录 在 linux 平台下使用 CMake 构建C C 43 43 工程的流程 当前项目目录结构 最小CMake工程 进入文件夹5 3 1 xff0c VScode打开项目文件5 3 1 在项目5 3 1顶层目录中 xff0c New F
  • 数据分析岗-机器学习相关知识

    1 解释共线性 我们进行回归分析需要了解每个自变量对因变量的单纯效应 xff0c 多重共线性就是说自变量间存在某种函数关系 xff0c 如果你的两个自变量间 xff08 X1和X2 xff09 存在函数关系 xff0c 那么X1改变一个单位
  • make,Makefile简易教程

    一 概述 make是一个类UNIX系统下的编译命令 xff0c 也可以理解为一个项目管理工具 xff0c 通过make可以按照自己指定的编译命令编译整个项目 xff0c 相当于将在命令行的编译命令按序执行 xff0c 省去了反复键入编译命令
  • @Transactional注解事务失效的七种原因分析

    64 Transactional是一种基于注解管理事务的方式 xff0c spring通过动态代理的方式为目标方法实现事务管理的增强 64 Transactional使用起来方便 xff0c 但也需要注意引起 64 Transactiona
  • C头文件相互包含

    今天遇见一个很头疼的事 xff0c 就是1 h头文件包含2 h xff0c 但是1 h里面却找不到2 h定义的一个结构体变量 最后排查发现是2 h里面又包含了1 h导致的 C语言中头文件包含的处理原则 之前一直以为 xff0c 一个 c文件
  • spring-kafka通过@KafkaListener实现消费者监听流程分析

    文章目录 主流程处理EnableKafka注解实现BeanPostProcessor接口postProcessAfterInitialization扫描 64 KafkaListenerregisterListenerContainer注册
  • c语言strrchr函数,strrchr_字符串 | Strings_C_参考手册_非常教程

    strrchr 在头文件中定义 char strrchr const char str xff0c int ch 通过 str 指向的以空字符结尾的字节字符串 每个字符解释为无符号字符 查找 ch 的最后一次出现 在转换为 char 之后
  • cmake中多级CMakeLists.txt调用

    文章目录 一 工程目录结构二 工程源代码2 1 上层目录2 1 1 cmaketest CMakeLists txt2 1 2 cmaketest main cpp2 1 3 cmaketest inc func1 hpp2 1 4 cma
  • c++ 函数后面加一个冒号的含义

    转载自 xff1a https www cnblogs com Allen rg p 11529949 html 冒号后面跟的是赋值 xff0c 这种写法是C 43 43 的特性 括号赋值只能在变量定义并初始化中 不能用在变量定义后再赋值
  • 理解死锁产生的四个必要条件

    死锁的定义 死锁是指两个或两个以上的进程在执行过程中 xff0c 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 xff0c 若无外力作用 xff0c 它们都将无法推进下去 此时称系统处于死锁状态或系统产生了死锁 xff0c 这些永远在
  • c++ error 2064: term does not evaluate to a function taking 1 arguments解决方法

    首先来看一个简单的示例 xff1a class T public T 61 default T 61 default int convertToInt double x return ceil x void doSomething vect
  • SZU_OnlineJudge_C++多态实验总结

    父类和子类的赋值问题 1 子类可以直接赋值给父类 如Cpoint 61 CRect 2 通过强制类型转换 xff0c 可以让父类赋值给子类 如 Cpoint Crect 61 cpoint 3 派生类对象指针 或引用 可以赋值给基类对象指针
  • 奇偶校验码原来这样算!!!

    数据传输的正误 数据发出方A像数据接收方B发送一串加密过后的情书 但是信息在传输过程中可能发生错误 比如某人截获并修改内容 一段美好的爱情就结束了 手动狗头 在电路传输中 电信号很容易受到干扰 电梯打电话你就知道了 于是我们要在原有的信息之
  • 手把手教你打造自己的4G数传模块

    如何低成本打造自己的4G数传模块 大家好 xff0c 现在给大家介绍一种简单的方法打造自己的4G数传 目录 一 背景 1 二 材料清单 2 2 1 G43模块 2 2 2 PSHAT接口板 5 三 使用方法 5 3 1 硬件连接 6 3 2
  • .error: C++ requires a type specifier for all declarations

    error C 43 43 requires a type specifier for all declarations 出错原因 xff1a 代码片段没有写在函数中 解决方法 xff1a 将代码片段写进函数中
  • 4g图传数传实测

    又一位客户极高的评价 xff0c 为了反馈大家 xff0c 从文章看到的并且加我qq1767893964 xff0c 备注gslink购买者 xff0c 毕淘宝搜索下单的有很大的优惠哦 下面是客户的测试 xff1a 最近南京天气开始变暖 x
  • Unable to locate package错误解决办法

    Ubuntu下执行apt install python pip得到如下错误提示 xff1a Reading package lists Done Building dependency tree Reading state informat

随机推荐

  • 树莓派编译卡死用交换空间问题的解决

    今天在树莓派编译一个ros包时发现 xff0c 每次编译到后速度会特别慢并且卡死 xff0c 经过各种尝试 xff0c 增加2G交换空间后才解决问题 xff0c 编译只花了不到10s xff0c 之前折腾了大半天啊 树莓派3B默认的swap
  • SpringAOP中@EnableAspectJAutoProxy注解的作用

    文章目录 前言从注解开始Import注解封装对象 注入容器 AnnotationAwareAspectJAutoProxyCreator的作用类图回顾IOC对象初始化后置处理器 总结 前言 如果要使用SpringAOP的功能 xff0c 必
  • HDMI转CSI转换板给你做出来了

    小编前段时间一直在做无人机图像的项目 因为项目要求飞机飞行速度较快 小编就像找一款是全局快门 防抖 自动对焦 焦距定焦镜头的一款相机和镜头 首先想到的就是gopro 体积不大 价格也还行 小编之前出去玩一直用对成像效果也是很满意 于是小编就
  • cmakelist.txt 编写教程

    1 CMake编译原理 CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件
  • VS Code在线安装ESP-IDF出现乱码(已解决)

    VS Code在线安装ESP IDF出现乱码 xff08 已解决 xff09 VS Code安装ESP IDF插件的安装乱码解决办法 VS Code安装 按照乐鑫给出的要求是安装VS Code之前需要安装Git和Python3 xff08
  • ffmpeg推流rtmp指定udp传输

    RTMP Real Time Messaging Protocol 是一个用于音频 视频和数据的传输协议 RTMP 协议本身可以支持 TCP 或 UDP 作为其底层传输协议 在 RTMP 中 xff0c TCP 是默认的传输协议 xff0c
  • 单片机小白学习之路(十五)---定时器和计数器的理解(一)

    目标 xff1a 定时器和计数器的理解 一 1 定时器 计数器简介 定时器 计数器 xff08 Timer Counter xff0c 简称T C xff09 是单片机中最基本的接口之一 即可以定时又可以计数 常用于计数 延时 测量周期 脉
  • stm32---ADXL345

    ADXL345是一款三轴加速度传感器 xff0c 广泛用于手机 游戏手柄等设计 ADXL 支持标准的 I2C 或 SPI 数字接口 xff0c 自带 32 级 FIFO 存储 xff0c 并且内 部有多种运动状态检测和灵活的中断方式等特性
  • fastjson中JSONObject.parse方法使用注意

    今天遇到有同事在使用fastjson的JSONObject时 xff0c 直接在parse方法中传入了一个非json格式的字符串 xff0c 造成有时候报错 xff0c 有时候又能正常返回 问题现象 当你传入一个数值类型时 xff0c 可以
  • HZ和秒之间换算

    Hz和毫秒不能直接换算 xff0c 两者是交流电频率与周期的关系 xff0c 并且是倒数关系 xff1a 周期T 61 1 100 61 0 01秒 61 10毫秒 100Hz即100次 秒 xff0c 即60x100 60秒 xff0c
  • 野火 FireConfig 从SD卡下载镜像到EMMC

    1 用balenaEtcher把镜像下载到SD卡 2 拨码到SD卡启动 3 用MobaXterm当串口终端 xff0c 选择115200 xff0c 取消硬件流 4 输入用户名cat 密码fish 5 输入sudo fire config
  • VCC、VDD、VSS以及VBAT的区别

    原链接 xff1a https blog csdn net LemonLeeB article details 99417945 在STM32 的学习中 xff0c 发现有几种看起来相关的名称 xff0c 分别是VCC VDD VSS VB
  • LWIP_MDNS

    一 xff0e mdns1 什么是mdns xff1f mDNS协议适用于局域网内没有DNS服务器时的域名解析 xff0c 设备通过组播的方式交互DNS记录来完成域名解析 xff0c 约定的组播地址是 xff1a 224 0 0 251 x
  • 组播IGMP

    一 xff0e 什么是组播 xff1f 1 一个发送 组播源 xff0c 多个接收 xff0c 接收的有个特点就是在同一个组播组里面 xff0c 组播组有自己的IP 2 对于组播源来说 xff0c 发送命令到组播IP等于把命令发送到所有组成
  • 单片机小白学习之路(四十三)---LCD12864液晶显示

    目标 xff1a LCD12864原理的理解 1 LCD12864简介 LCD12864可以用来显示字符 数字 汉字 图形等内容 xff0c 其分辨率是128 64点 意思是横着有128个点 xff0c 竖直方向有64点 LCD12864
  • stm32---红外接受

    一个脉冲对应 560us 的连续载波 xff0c 一个逻辑 1 传输需要 2 25ms xff08 560us 脉冲 43 1680us 低电平 xff09 xff0c 一个逻辑 0 的传输需要 1 125ms xff08 560us 脉冲
  • printf重定向

    C语言中printf默认输出设备是显示器 xff0c 当开发板没有时我们就用串口来打印数据 int fputc int ch FILE p USART SendData USART1 ch 如果用串口2打印 xff0c 和换成USART2
  • SPI的CRC校验计算

    22 3 6 CRC计算 CRC校验仅用于保证全双工通信的可靠性 数据发送和数据接收分别使用单独的CRC计算器 通过对每一个接收位进行可编程的多项式运算来计算CRC CRC的计算是在由SPI CR1寄存器 中CPHA和CPOL位定义的采样时
  • 记录JPA并发save时遇到的坑

    前言 在JPA中 xff0c 使用save方法时是这样的 xff1a 如果我们save的对象指定了主键 xff0c 那么会根据主键先进行一次查询 xff0c 如果查询记录不存在则执行insert语句 xff0c 如果查询记录存在则执行upd
  • Openmv(一)OpenMV图像处理的基本方法

    一 图像处理基础知识 摄像头 xff1a 光学信号转换成电信号 计算机视觉中 xff0c 最简单的模型是小孔成像模型 小孔成像是一种理想模型 xff0c 实际镜头会存在场曲和畸变等 xff0c 但可以通过在标定过程中引入畸变参数解决 xff