当前位置: 首页 > news >正文

树莓派编程基础与硬件控制

1.编程语言

Python 是一种泛用型的编程语言,可以用于大量场景的程序开发中。根据基于谷歌搜
索指数的 PYPL(程序语言流行指数)统计,Python 是 2019 年 2 月全球范围内最为流行
的编程语言
           相比传统的 C、Java 等编程语言,Python 具备一些优势。
(1)较强的易读性。Python 是一种高级编程语言,其在设计上更为接近人类使用的
自然语言(英语)。具备英语基础和少许编程基础的人可以很轻松地阅读 Python 代码。
(2)简洁的语法(规则)。Python 语言的设计哲学是“优雅”“明确”和“简单”,
力图用最简洁的方式完成程序内容。相比于传统编程语言,Python 通常可以用更短的语句
执行同样的功能。
(3)强大的可扩展性。由于 Python 是一个完全开放的编程语言环境,其拥有大量强
大的扩展包,例如数学计算包 NumPy、游戏开发包 pygame、机器学习包 TensorFlow 等。
正是因为这一特点,Python 目前是人工智能编程的首选语言。
(4)便利的可移植性。Python 几乎可以运行于任何操作系统,将 Python 代码移植
到 Windows、macOS、Linux 等不同环境中非常便利。
交互式编程是一种非常便利的 Python 编程方式,常用于程序测试的场景。首先通过任
务栏打开树莓派的“终端”,在其中输入“python3”并回车即可进入 Python 3 的交互式
编程环境
用 Geany 编辑器编写 Python 程序
虽然交互式编程环境可以很方便地输出语句的结果,但它并不能将大段的程序内容存
储起来反复运行,因此只适用于程序测试的场景。绝大多数情形下,我们需要将完整的
Python 程序存储为 .py 格式的文件,再调用它进行运行。
可以使用任意的文本编辑器编写 Python 程序。我们在后续的课程中统一使用树莓派系
统预装的轻量级文本编辑器 Geany 来编写 Python 程序。Geany 可在树莓派任务栏的开
始菜单中选择“编程”找到。
            使用 Geany 编辑器的图标可以方便地进行文件的新建、打开、保存以及 Python 程序
的运行操作
              打开 Geany 后,我们先新建一个空白文档,再单击文档→设置文件类型→脚本语
言→ Python 源文件,将其设为 Python 程序文件

2.树莓派的 GPIO 接口

 

树莓派 3B+ 主控板可以通过上面的 40 个引脚连接电子设备输入或输出电信号。

  3. 点亮一盏小灯 

导入 Python 扩展包

要使用 Python 程序对 GPIO 连接的输入 / 输出设备进行控制,需要用到一个名为
RPi.GPIO 的扩展包。在 Python 程序中,许多功能被写在了一些额外的官方或第三方扩展
包中,可以通过如下两种方式导入扩展包。
第一种方式为直接导入,后面的“as 自定义名称”可以不写。不写时,使用“扩展包
名 . 包内的函数或变量名”的形式可以调用包内预先设定好的函数或变量。若设定了自定义
名称,则使用“自定义名称 . 包内的函数或变量名”的形式调用。
第二种导入方式则可以选择性导入包中设定的函数或变量,导入多个函数或变量时需使
用逗号隔开。若使用“import *”则可导入包中的所有函数及变量。用这种方式导入扩展包时,
我们可以直接用导入的函数或变量名来调用它们而不用再写包名。
中除了 1~40 的编号外,每个 GPIO 引脚后面还有另一个编号。在 Python
程序中使用 GPIO 时,需要指定程序应该使用哪一种编号方式。其设定方法是:
树莓派的所有 GPIO 口既可以连接输入设备,也可以连接输出设备,因此需要事先设
定其为输入模式还是输出模式:
模式有两种:gpio.IN 代表这是一个输入设备,gpio.OUT 代表这是一个输出设备。
例如,对 LED 连接的 GPIO 接口进行设定的完整程序如下: 设定 GPIO 接口输出高、低电平的语句为:
电平状态只有两种:gpio.HIGH 代表高电平,gpio.LOW 代表低电平。
为了让程序能控制小灯亮灭一段时间,需要引入 Python 中
time 扩展包的 sleep 函数。 sleep 后的参数表示需等待的时间,单位为秒。

4.用按钮控制灯的状态 

与 LED 模块类似,我们也要先设定按钮连接的 GPIO 接口的输入 / 输出状态。 我们可以通过一个简单的函数来读取接口的电平状态:
这个函数可能得到两个返回值:gpio.HIGH(高电平)或 gpio.LOW(低电平)。我
们可以通过判断按钮的电平状态来执行不同的操作。例如,在按钮被按下时将小灯点亮,否
则将小灯熄灭。
但是这个程序并不能真正实现预想的功能,因为这段程序仅仅在程序刚刚运行的一瞬间
进行按钮按压状态的读取与判断。若要实现持续判断的功能,需要增加一个 while 循环结构。

4.1两个按钮的控制与逻辑运算符 

将这个逻辑转化为程序:

但这样编写的程序看上去有一点复杂。在需要同时判断多个条件的真假时,我们可以通
过逻辑运算符来处理它们的关系。
逻辑运算符有 and(与)、or(或)、not(非)三种。
与运算符 and:用 and 连接两个条件,当两个条件都为真时,返回真;有一个为假时,
返回假。等同于我们常说的“并且”。
或运算符 or:用 or连接两个条件,当两个条件有一个为真时,返回真;都为假时,返回假。
等同于我们常说的“或者”。
非运算符 not:在条件前加上 not,可以得到与条件真假相反的结果。等同于对条件加
上了“不”字。
上面程序的功能实质上是:按钮 1 被按下并且按钮 2 被按下时点亮小灯,否则熄灭小灯。
所以可以利用逻辑运算符编写以下程序。

4.2抢答器的完整示例程序 

 5.机器视觉与图像识别

人工智能系统的一个重要发展方向是对人类机能的模拟,因而学会“看”对人工智能而
言是非常关键的一步。
在分析机器如何“看”之前,我们先简单了解一下人类的视觉机制。我们天生就能使用
眼睛接收光线,从而可以看到五彩斑斓的世界,这是因为人眼的视觉细胞中存在分别对红色、
绿色、蓝色敏感的 3 种细胞,从而可以识别出这 3 种颜色,并可以通过它们的融合识别其
他颜色。
因此,红、绿、蓝 3 种颜色被称为视觉三原色,它们的任意组合可以构成可见光的所
有颜色。
人工智能视觉的关键就在于如何从图像中分析出各种物体的颜色、形状等基本信息,进
而分析它们所蕴含的意义。这个过程就被称为图像识别,或者机器视觉。

6.机器视觉技术的常见应用 

1.相似图像搜索

2009—2010 年,谷歌、百度等搜索公司相继推出了以图搜图的图片搜索功能。这一
功能可以分析图片上的特征信息,并从互联网上找到与该图片相似的图片。现在,各类手机
购物 App 也可以以类似的原理实现拍摄商品照片,找到相似商品的功能。
2.文字识别
很多电子设备都可以使用 OCR(光学字符识别)技术识别纸质资料上的文字,目前较
为成熟的 OCR 技术可以以较高的成功率读取手写文字。
3.面部识别
当前的智能手机上大多搭载了利用手机摄像头结合人工智能算法实现的面部识别功能。
结合这一功能,智能手机可以以较高的安全性进行解锁、支付等操作。 除此以外,面部识别还被广泛应用于公共安全领域,不单可以在特定场所保护公共安全, 还可以帮助侦破刑事案件。
4.目标检测
人工智能图像识别的一个关键是识别图像中的物体并对它们进行分类。现在,随着人工
神经网络技术的发展,我们可以更轻松地使用一些开源的神经网络工具“训练”AI 识别物体。
图 5.8 所示为目标检测工具识别指定种类的物体。

7.认识 OpenCV 

通过前面的学习,我们知道,计算机等电子设备中存储的图像信息实质上是以像素排列
的颜色值信息,也就是大量的数据。要从图像信息中得到有意义的信息,就必须对这些数据
进行分析与处理。
计算机科学家和相关领域的从业者在过往几十年时间内发展出了大量用于处理计算机图
像信息的数学方法。开源的计算机视觉库 OpenCV 内置了大量这类数学方法,可以帮助我
们分析图像信息。

7.1OpenCV 简介

英特尔公司于 1999 年发起了一个以计算机图像处理为主题的开源程序库项目OpenCV(开源计算机视觉库),它已成为目前影响力最大 的一个开源计算机视觉库。OpenCV 在面部识别、手势识别、 目标识别、增强现实(AR)等问题上都能发挥重要的作用。 2009 年,OpenCV 发布了其第一个第二代正式版本。 自 2012 年起,一个专门的非营利组织负责 OpenCV 项目 的后续支持。OpenCV 2015 年发布其第三代,2018 年发 布到第四代。在我们后续的项目中,将使用目前应用最为广 泛的 OpenCV 第三代版本。 OpenCV 本体以 C++ 程序语言编写,但也提供了包括 Python 在内的其他编程语言的扩展接口。

视频的帧与分辨率 

OpenCV 不单可以用于处理静态的图像信息,其很重要的一个目标是对实时的动态图
像进行处理。
我们可以运用摄像头来捕获动态的视频图像。摄像头的基本成像原理与数码相机完全相
同,只不过它可以实时以较短的时间间隔连续获取图像信息。这些图像信息按时间顺序排列
起来就组成了我们常说的视频。
我们看到的视频实际上都是由若干张静态图片连续播放而成的。人类大
脑的视觉系统会将连续播放的相似图片自动连接成连贯的影像。
视频中每一张静态图片被称为视频的一帧(frame)。视频每秒输出的帧数量是一个很
重要的指标,这被称为帧率(单位为帧 / 秒)。现在主流的视频帧率是 30 帧 / 秒或 60 帧 / 秒。 帧率越高,视频越流畅。
一个视频中每一帧图像的像素排列是完全一致的。视频中每帧图片的横轴、纵轴像素的
数量被称为视频的分辨率。以树莓派官方摄像头为例,该摄像头拍摄的图像横轴拥有 640
个像素,而纵轴拥有 480 个像素,所以其分辨率为 640 像素 ×480 像素。
橙色点所示,我们可以将每个像素定位到其在 x 轴(横轴)和 y 轴(纵轴)
方向的位置,并标注为 ( x 坐标, y 坐标 )。
视频的分辨率常以纵轴的像素数量来表示,例如标清视频为 480p,指的是纵轴有 480
个像素。而高清视频为 720p,全高清视频为 1080p,4K 视频则为 2160p。标准视频的横
纵像素比通常为 16 :9或4 :3。显然,分辨率越高,视频越清晰。

7.2opencv安装:

欲哭无泪555555555555555555,走了一天弯路,晕

结果在终端窗口输入sudo apt-get install -y libopencv-dev python3-opencv

sudo pip3 install numpy

输入python3验证

再import cv2没有报错就ok了

 7.21用树莓派摄像头调取图像

使用 OpenCV 测试摄像头的完整程序如下。

运行程序后将在弹出的窗口中看到其拍摄到的实时画面。如果未能看到画面,请检查摄
像头的连接。
现在我们来分析一下这段程序代码的运作过程。OpenCV 可以使用 VideoCapture 读
取视频。其后的括号中填写序号“0”将可以读取树莓派的默认摄像头信号。如果连接了其
他摄像头,可以用其他序号来获取。此外,在这里填写视频存储地址,也可以直接读取树莓
派系统中存储的视频。
将读取视频的结果创建为 cap 后,使用 isOpened 函数可以返回其读取视频的结果。
如果读取成功,则返回 True(真),否则返回 False(假)。因此,我们可以将它作为
while 循环的条件实现循环读取视频信号。
对 cap 使用 read 函数将返回视频中一帧的信息,这个函数存在两个返回值:该帧是否
存在以及这一帧的具体信息。我们可以用形如 (ret, frame) = cap.read() 的格式将第一个返
回值存为 ret,第二个返回值存为 frame。
ret 在帧存在时为 True(真),否则为 False(假)。frame 则包含了这一帧中所有像
素点的三原色值信息及其排列方式。OpenCV 读取的帧信息的每一个像素由三原色值按照
B(蓝)、G(绿)、R(红)的顺序排列,每一个值的范围为 0(最暗)~255(最亮)。
使用 imshow 函数可以将图像信息显示为一个窗口中的图像,其格式为:
OpenCV 中使用 imshow 显示图像后必须使用一个 waitKey 函数。函数的参数值为以

毫秒为单位的时间,表示在显示一帧后等待这些时间再继续。

 8.用 OpenCV 识别颜色

使用 OpenCV 调取图像的信息只是我们分析图像的第一步,OpenCV 的强大之处在
于它可以通过一些预置函来方便地处理这些信息。机器视觉技术识别物体首先需要确定物体
的位置,勾勒出其轮廓,而区分物体与背景的关键在于颜色的分界。

8.1HSV 颜色空间

OpenCV 读取的图像信息在每一像素上都由 B、G、R 的颜色值排列而成,但事实上
用这 3 个颜色值来区分颜色并不像想象中那么简单:同一物体的三原色值在环境光照变化
的情况下将发生很大的变化,使用一定的颜色区间来锁定特定物体几乎是不可能完成的任务。
为了解决这一问题,我们可以使用另一种描述颜色的方式:HSV 颜色空间
相比直接用三原色值来表述颜色,使用颜色的另外一些属性来描述它们更符合人眼对颜
色的认知。这些属性包括颜色的色相(Hue)、饱和度(Saturation)、亮度(Value)
使用这 3 种颜色属性描绘颜色的方法于 1978 年由计算机科学家 Alvy Ray Smith 提出,这
些值可以用三原色值经过简单的数学转换得到。
色相(H)是颜色的基本属性。我们可以将三原色红、绿、蓝置于一个圆盘的 0°、
120°和 240°位置,然后将其他颜色插入排列。
饱和度(S)代表颜色的纯度或“鲜艳程度”。颜色的饱和度越高,则色彩越“纯正”。
亮度(V)代表颜色的明亮程度。亮度越大则颜色越亮,否则越暗。
图 5.13 所示为 HSV 颜色空间的图示,这种描绘颜色的方式相对三原色更接近人的视
觉感受,H、S、V 三种颜色值的变化可以被人眼敏锐地感觉到。通常,色相(H)的取值
范围为 0~360,而饱和度(S)与亮度(V)被划为 100 份,取值范围为 0~100。
在 Geany 中,我们可以单击运行键右侧的按键打开颜色选择器,从这里可以获取不同
颜色的 HSV 值与 RGB 值
OpenCV 中有一个内置函数 cvtColor 可以方便地将图像信息从一个颜色空间转换到另
一个颜色空间,例如:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
这一语句可以将原本 BGR 颜色空间上的 frame 信息转换为 HSV 颜色空间并存储到
hsv 中。需要注意的是,OpenCV 中 H 值的取值范围是 0~180,S 和 V 值则是 0~255。
若将通常的 HSV 值代入 OpenCV 中分析,须先对 H、S、V 分别按比例转换。

 

我们常见的颜色都处于 HSV 颜色空间的某个范围内。图 5.15 所示为一些颜色的大致
范围(按照 OpenCV 的取值范围)。

9.图像的二值化

在 HSV 颜色空间中,我们可以设定出待检测物体颜色所在的区间。假定待检测物
体是一个较均匀的黄色物体,其颜色值的范围为:H 值 26~34,S 值 43~255,V 值
46~255。我们可以将这个范围设定一个下限和上限并分别定义: 这种定义方式事实上是建立了元组类型的变量
接下来为了勾勒出这个物体的轮廓,需要先将图像中属于这个区间的像素与不属于这
个区间的像素进行分割。为了方便,我们可以将属于这个区间的像素直接取值为 1,而将
不属于这个区间的像素取值为 0,这样就构成了一个只由 0 和 1 排列的图像信息。使用
OpenCV 中的 inRange 函数可以轻松地完成这一步骤:
函数返回一个 0 和 1 排列而成的图像信息。这种将图像的所有像素用 0 和 1 表示的方
法被称为图像的二值化。二值化是处理计算机图像时常用的一种数学方法。若将值为 0 的
像素用黑色标出,而将 1 用白色标出,inRange 函数可以完成图 5.16 所示的转换。

 9.1找到轮廓的位置

 

接下来我们可以通过二值化图像方便地找出黑、白区域分界线的位置,即待检测物体的
轮廓。寻找二值化图像轮廓可以用 findContours 函数来实现:
这里,我们传入的第一个参数“图像信息”是二值化的图像信息。
第二个参数“输出模式”指定输出轮廓的类型,主要有以下 3 种类型。
cv2.RETR_EXTERNAL:只输出外轮廓。
cv2.RETR_LIST:输出所有轮廓。
cv2.RETR_TREE:输出所有轮廓,并输出轮廓间的包含关系。
第三个参数“输出方法”指的则是输出的轮廓信息所包含的内容,主要有以下两种输出
方法。
cv2.CHAIN_APPROX_SIMPLE:只输出拐角点的坐标。
cv2.CHAIN_APPROX_NONE:输出所有连续点的坐标

 

在 本 例 中, 为 简 便 起 见, 我 们 采 用 cv2.RETR_EXTERNAL 与 cv2.CHAIN_
APPROX_SIMPLE 两个参数。函数一共存在 3 个连续的返回值:传入的图像信息本身
轮廓坐标的信息各个轮廓之间的包含关系。在指定只输出外轮廓的情况下,我们实际上只需要用到其第二个返回值。
  •  将图像进行二值化并寻找外轮廓的完整代码如下

 我们首先将图像按照设定的颜色区间转换为二值化图像信息,并用

mask 变量存储 。然后,我们寻找图像中的轮廓,并用 cnts 变量存储找到的全部轮廓信息。但是,这样找到的轮廓包含了图像中所有处于该颜色区间中的物体轮廓, 例如图 5.16 右侧 的一些噪点也会被检测出来。为了只输出待检测物体的轮廓,我们需要找到所有轮廓中面积 最大的一个
Python 中存在一个 max 函数,它可以输出一组数据中最大的一个。在本例中,我们
需要输出的数据并非绝对数值最大,而是 包围面积最大 。这种情况下,在 max 函数中设定
比较方式即可实现:
找最大面积的比较方式在 OpenCV 中被设定为 contourArea,我们可以用下面的语句
将 cnts 中面积最大的轮廓存储在变量 c 中:
最后,我们需要从 c 中得到这个轮廓的 具体位置 。使用 minEnclosingCircle 函数可以
得到一个轮廓的最小包围圆(指能包围这个轮廓的最小的圆)的圆心坐标和半径。
minEnclosingCircle 函数只有一个参数:轮廓信息。而函数将连续返回两组值:圆心
的坐标(横坐标,纵坐标)、圆的半径。
使用 ((x, y), radius) = cv2.minEnclosingCircle(c) 将可以直接存储这些信息。我们用
变量 x 存储横坐标,变量 y 存储纵坐标,变量 radius 则存储圆的半径。
不过,如果摄像头没有捕捉到任何指定颜色的物体,cnts 将是完全“空”的,这将导
致 max 函数报错。我们可以加入下列判断。
这里 len 可以表示一组数据的“长度”。若 len 大于 0,表示其不为“空”。
len 函数的对象事实上是列表类型

相关文章:

树莓派编程基础与硬件控制

1.编程语言 Python 是一种泛用型的编程语言,可以用于大量场景的程序开发中。根据基于谷歌搜 索指数的 PYPL(程序语言流行指数)统计,Python 是 2019 年 2 月全球范围内最为流行 的编程语言 相比传统的 C、Java 等编程语言&#x…...

autojs通过正则表达式获取带有数字的text内容

视频连接 视频连接 参考 参考 var ctextMatches(/\d/).findOne()console.log("当前金币"c.text()) // 获取当前金币UiSelector.textMatches(reg) reg {string} | {Regex} 要满足的正则表达式。 为当前选择器附加控件"text需要满足正则表达式reg"的条件。 …...

Android java基础_类的继承

一.Android Java基础_类的继承 先封装一个persion类&#xff0c;在persion的基础上定义Student类&#xff0c;并基础persion类。 子类能访问父类的成员函数。 class Person {private int age;public void setAge(int age) {if (age < 0 || age > 200)age 0;else {thi…...

nginx stream proxy 模块的ssl连接源码分析

目录 1. 源起2. 分析验证环境的配置3. 源码分析3.1 代理模块的请求入口点分析3.2 发起与上游服务器的连接3.3 连接回调3.4 TCP连接建立成功后为上下游数据透传做准备3.5 TCP连接的ssl上下文初始化3.6 ssl握手成功后的处理3.7 连接数据的收与发1. 源起 我一直来对ssl建立连接的过…...

C#面:Static Nested Class 和 Inner Class 有什么不同

这是两种不同的类嵌套方式。 Static Nested Class &#xff1a; 是一个静态嵌套类&#xff0c;它是在外部类中定义的一个静态类。它可以访问外部类的静态成员和方法&#xff0c;但不能直接访问外部类的非静态成员和方法。静态嵌套类可以独立于外部类实例化&#xff0c;即可以…...

LeetCode、208. 实现 Trie (前缀树)【中等,自定义数据结构】

文章目录 前言LeetCode、208. 实现 Trie (前缀树)【中等&#xff0c;自定义数据结构】题目链接与分类思路 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…...

java数据结构与算法刷题-----LeetCode151. 反转字符串中的单词

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题&#xff0c;可以理解为&#xff0c;将字符串颠倒&#xf…...

《Java 简易速速上手小册》第8章:Java 性能优化(2024 最新版)

文章目录 8.1 性能评估工具 - 你的性能探测仪8.1.1 基础知识8.1.2 重点案例&#xff1a;使用 VisualVM 监控应用性能8.1.3 拓展案例 1&#xff1a;使用 JProfiler 分析内存泄漏8.1.4 拓展案例 2&#xff1a;使用 Gatling 进行 Web 应用压力测试 8.2 JVM 调优 - 魔法引擎的调校8…...

mysql全国省市县三级联动创表sql(一)

1. 建表sql CREATE TABLE province (id VARCHAR ( 32 ) PRIMARY KEY COMMENT 主键,code CHAR ( 6 ) NOT NULL COMMENT 省份编码,name VARCHAR ( 40 ) NOT NULL COMMENT 省份名称 ) COMMENT 省份信息表;CREATE TABLE city (id VARCHAR ( 32 ) PRIMARY KEY COMMENT 主键,code …...

go面试题--使用两个goroutine交替打印数字与字母

使用两个goroutine交替打印数字与字母 题目如下&#xff1a; 使用两个goroutine交替打印序列&#xff0c;一个goroutine打印数字&#xff0c;另外一个goroutine打印字母&#xff0c;最终效果如下&#xff1a; 12AB34CD56EF78GH910IZ1112KL1314MN1516OP1718QR1920ST2122UV2324W…...

DolphinScheduler-3.2.0 集群搭建

目录 一、基础环境准备 1.1 组件下载地址 1.2 前置准备工作 二、 DolphinScheduler集群部署 2.1 解压安装包 2.2 配置数据库 2.3 准备 DolphinScheduler 启动环境 2.3.1 配置用户免密及权限 2.3.2 配置机器 SSH 免密登陆 2.3.3 启动 zookeeper集群 2.3.4 修改instal…...

07:Kubectl 命令详解|K8S资源对象管理|K8S集群管理(重难点)

Kubectl 命令详解&#xff5c;K8S资源对象管理&#xff5c;K8S集群管理 kubectl管理命令kubectl get 查询资源常用的排错命令kubectl run 创建容器 POD原理pod的生命周期 k8s资源对象管理资源文件使用资源文件管理对象Pod资源文件deploy资源文件 集群调度的规则扩容与缩减集群更…...

【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…...

Windows搭建docker+k8s

安装Docker Desktop 从官网下载&#xff0c;然后直接安装即可&#xff0c;过程很简单&#xff0c;一直Next就行。 有一点需要注意就是要看好对应的版本&#xff0c;因为后边涉及到版本的问题。 https://www.docker.com/products/docker-desktop 安装完成&#xff0c;双击图…...

年假作业10

一、选择题 BBDBACCCAD 二、填空题 1,4,13,40 3715 358 5 2 6 1 5 4 8 2 0 2 三、编程题 1、 #include <iostream> #include<array> #include <limits> using namespace std; int main() {array<int,10> score;array<int,10>::iterat…...

[ai笔记4] 将AI工具场景化,应用于生活和工作

欢迎来到文思源想的AI空间&#xff0c;这是技术老兵重学ai以及成长思考的第4篇分享内容&#xff01; 转眼已经到了大年初三&#xff0c;但是拜年的任务还只完成了一半&#xff0c;准备的大部头的书&#xff0c;现在也就看了两本&#xff0c;还好AI笔记通过每天早起坚持了下来。…...

【生产实测可用】Redis修改集群弱口令

起因 漏扫redis连接发现弱口令需要修改 先连上去看看是空口令还是弱口令 redis-cli -p 6379 -h a.b.c.d info sentinel找到启动服务器的配置文件 cp -av /app/redis-7001/redis.conf /app/redis-7001/redis.conf.bak20240207 echo "requirepass 口令" >>/a…...

备战蓝桥杯---图论基础理论

图的存储&#xff1a; 1.邻接矩阵&#xff1a; 我们用map[i][j]表示i--->j的边权 2.用vector数组&#xff08;在搜索专题的游戏一题中应用过&#xff09; 3.用邻接表&#xff1a; 下面是用链表实现的基本功能的代码&#xff1a; #include<bits/stdc.h> using nam…...

[office] excel2003进行可视性加密的方法 #媒体#其他#知识分享

excel2003进行可视性加密的方法 Excel如何对重要文件进行可视性的加密处理呢?下面是小编带来的关于excel2003进行可视性加密的方法&#xff0c;希望阅读过后对你有所启发! excel2003进行可视性加密的方法&#xff1a; 可视性加密步骤1&#xff1a;打开你要加密的excel2003文档…...

算法沉淀——分治算法(leetcode真题剖析)

算法沉淀——分治算法 快排思想01.颜色分类02.排序数组03.数组中的第K个最大元素04.库存管理 III 归并思想01.排序数组02.交易逆序对的总数03.计算右侧小于当前元素的个数04.翻转对 分治算法是一种解决问题的算法范式&#xff0c;其核心思想是将一个大问题分解成若干个小问题&a…...

Blender-Armatures

导航 (返回顶部) 1. Blender-Armatures 1.1 骨架位置1.2 分类1.3 骨骼结构 2. 编辑 2.1 骨骼扭转2.2 拆分 split2.3 分离骨骼 separate2.4 切换方向 3. 镜像编辑 3.1 镜像挤出3.2 命名惯例3.3 对称 4. 属性 4.1 属性结构表4.2 柔性骨骼 Bendy Bones4.3 姿态4.4 关系 5. 骨骼约束…...

销售易NeoAgent 2.0深度解析:从“业务语义本体“到“智能体矩阵“的技术架构

一、行业背景&#xff1a;CRM的AI进化分水岭2026年&#xff0c;企业面临获客成本飙升、销售周期拉长、客户需求日益挑剔的多重挑战。传统CRM依赖人工录入且缺乏智能分析能力&#xff0c;往往沦为滞后的记录工具。市场正在寻找能够主动思考、预判和执行的下一代CRM架构。销售易基…...

别再死记硬背了!图解MATLAB形态学:用‘膨胀腐蚀’和‘开闭运算’修复破损老照片

用MATLAB形态学魔法修复老照片&#xff1a;从膨胀腐蚀到开闭运算的实战指南 翻开泛黄的相册&#xff0c;那些承载着记忆的老照片往往布满时间的痕迹——划痕、斑点、缺失的角落。作为图像处理领域的瑞士军刀&#xff0c;MATLAB提供了一套强大的形态学工具&#xff0c;能像数字修…...

DeepSeek LeetCode 2509.查询树中环的长度 public int[] cycleLengthQueries(int n, int[][] queries)

这道题的核心是找到两个节点在完全二叉树中的路径长度&#xff0c;然后计算环的长度。关键思路&#xff1a;1. 完全二叉树的节点编号规律&#xff1a;节点 i 的父节点是 i/2 2. 两个节点之间的路径长度 深度差 2 LCA深度差 3. 环的长度 路径长度 1&#xff08;加回重复的L…...

告别‘偏科’模型:用CAST双流架构搞定视频动作识别,兼顾时空理解

时空双流协同&#xff1a;CAST架构如何重塑视频动作识别的平衡之道 视频动作识别正面临一个关键瓶颈——现有模型往往在时空理解上"偏科"。就像人类大脑需要左右半球协同工作才能完整理解世界一样&#xff0c;理想的视频理解模型也需要同时具备敏锐的空间感知和精准的…...

433MHz无线模块解码避坑指南:从示波器抓波形到STM32代码实现的完整流程

433MHz无线模块解码实战&#xff1a;从波形分析到STM32代码优化的全流程解析 1. 解码前的硬件准备与信号捕获 当你第一次拿到433MHz无线模块时&#xff0c;最令人困惑的往往是"为什么我的代码无法正确解码&#xff1f;"要解决这个问题&#xff0c;我们需要从最基础的…...

ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试!

ADF4350频点锁定与电源滤波实战&#xff1a;为什么你的VCO输出有噪声&#xff1f;加个钽电容试试&#xff01; 在射频电路设计中&#xff0c;ADF4350作为一款集成VCO的宽带频率合成器&#xff0c;因其出色的性能和灵活性广受工程师青睐。然而&#xff0c;许多开发者在实际应用中…...

告别臃肿PDF!用Ghostscript命令行批量压缩/拆分/合并的保姆级教程

Ghostscript实战指南&#xff1a;PDF批量处理的高效命令行艺术 每次面对动辄上百兆的扫描版PDF报告时&#xff0c;你是否也经历过邮箱附件发送失败、云盘上传卡在99%的崩溃瞬间&#xff1f;当领导临时要求合并二十份季度报表&#xff0c;或是学术期刊需要按章节拆分投稿时&…...

告别Mac与Windows传文件烦恼:一招教你将APFS格式的移动硬盘永久改成ExFAT通用格式

跨平台文件共享终极方案&#xff1a;APFS与ExFAT格式深度解析与转换指南 当你在Mac上插入新买的移动硬盘准备备份重要设计稿时&#xff0c;系统默认将其格式化为APFS&#xff1b;三天后客户紧急需要修改方案&#xff0c;你带着硬盘赶到Windows电脑前——却发现根本无法读取内容…...

Pandas/NumPy数据处理中,科学计数法如何‘隐形’影响你的结果?附解决方案

Pandas/NumPy数据处理中科学计数法的隐形陷阱与实战解决方案 当你处理一组看似普通的销售数据时&#xff0c;可能会遇到这样的情况&#xff1a;某个产品的单价被记录为1.23e-5&#xff0c;而另一个产品的单价则是0.0000123。在肉眼看来&#xff0c;这两个数字似乎相等&#xff…...