树莓派编程基础与硬件控制
1.编程语言
交互式编程是一种非常便利的 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.机器视觉与图像识别
6.机器视觉技术的常见应用
1.相似图像搜索
2009—2010 年,谷歌、百度等搜索公司相继推出了以图搜图的图片搜索功能。这一功能可以分析图片上的特征信息,并从互联网上找到与该图片相似的图片。现在,各类手机购物 App 也可以以类似的原理实现拍摄商品照片,找到相似商品的功能。2.文字识别很多电子设备都可以使用 OCR(光学字符识别)技术识别纸质资料上的文字,目前较为成熟的 OCR 技术可以以较高的成功率读取手写文字。3.面部识别当前的智能手机上大多搭载了利用手机摄像头结合人工智能算法实现的面部识别功能。结合这一功能,智能手机可以以较高的安全性进行解锁、支付等操作。 除此以外,面部识别还被广泛应用于公共安全领域,不单可以在特定场所保护公共安全, 还可以帮助侦破刑事案件。4.目标检测人工智能图像识别的一个关键是识别图像中的物体并对它们进行分类。现在,随着人工神经网络技术的发展,我们可以更轻松地使用一些开源的神经网络工具“训练”AI 识别物体。图 5.8 所示为目标检测工具识别指定种类的物体。![]()
7.认识 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 识别颜色
8.1HSV 颜色空间
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.图像的二值化
这种定义方式事实上是建立了元组类型的变量
9.1找到轮廓的位置
这里,我们传入的第一个参数“图像信息”是二值化的图像信息。第二个参数“输出模式”指定输出轮廓的类型,主要有以下 3 种类型。cv2.RETR_EXTERNAL:只输出外轮廓。cv2.RETR_LIST:输出所有轮廓。cv2.RETR_TREE:输出所有轮廓,并输出轮廓间的包含关系。第三个参数“输出方法”指的则是输出的轮廓信息所包含的内容,主要有以下两种输出方法。cv2.CHAIN_APPROX_SIMPLE:只输出拐角点的坐标。cv2.CHAIN_APPROX_NONE:输出所有连续点的坐标
- 将图像进行二值化并寻找外轮廓的完整代码如下

我们首先将图像按照设定的颜色区间转换为二值化图像信息,并用
相关文章:
树莓派编程基础与硬件控制
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类,在persion的基础上定义Student类,并基础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 : 是一个静态嵌套类,它是在外部类中定义的一个静态类。它可以访问外部类的静态成员和方法,但不能直接访问外部类的非静态成员和方法。静态嵌套类可以独立于外部类实例化,即可以…...
LeetCode、208. 实现 Trie (前缀树)【中等,自定义数据结构】
文章目录 前言LeetCode、208. 实现 Trie (前缀树)【中等,自定义数据结构】题目链接与分类思路 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领…...
java数据结构与算法刷题-----LeetCode151. 反转字符串中的单词
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题,可以理解为,将字符串颠倒…...
《Java 简易速速上手小册》第8章:Java 性能优化(2024 最新版)
文章目录 8.1 性能评估工具 - 你的性能探测仪8.1.1 基础知识8.1.2 重点案例:使用 VisualVM 监控应用性能8.1.3 拓展案例 1:使用 JProfiler 分析内存泄漏8.1.4 拓展案例 2:使用 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交替打印数字与字母 题目如下: 使用两个goroutine交替打印序列,一个goroutine打印数字,另外一个goroutine打印字母,最终效果如下: 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 命令详解|K8S资源对象管理|K8S集群管理 kubectl管理命令kubectl get 查询资源常用的排错命令kubectl run 创建容器 POD原理pod的生命周期 k8s资源对象管理资源文件使用资源文件管理对象Pod资源文件deploy资源文件 集群调度的规则扩容与缩减集群更…...
【设计模式】springboot3项目整合模板方法深入理解设计模式之模板方法(Template Method)
🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀…...
Windows搭建docker+k8s
安装Docker Desktop 从官网下载,然后直接安装即可,过程很简单,一直Next就行。 有一点需要注意就是要看好对应的版本,因为后边涉及到版本的问题。 https://www.docker.com/products/docker-desktop 安装完成,双击图…...
年假作业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空间,这是技术老兵重学ai以及成长思考的第4篇分享内容! 转眼已经到了大年初三,但是拜年的任务还只完成了一半,准备的大部头的书,现在也就看了两本,还好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…...
备战蓝桥杯---图论基础理论
图的存储: 1.邻接矩阵: 我们用map[i][j]表示i--->j的边权 2.用vector数组(在搜索专题的游戏一题中应用过) 3.用邻接表: 下面是用链表实现的基本功能的代码: #include<bits/stdc.h> using nam…...
[office] excel2003进行可视性加密的方法 #媒体#其他#知识分享
excel2003进行可视性加密的方法 Excel如何对重要文件进行可视性的加密处理呢?下面是小编带来的关于excel2003进行可视性加密的方法,希望阅读过后对你有所启发! excel2003进行可视性加密的方法: 可视性加密步骤1:打开你要加密的excel2003文档…...
算法沉淀——分治算法(leetcode真题剖析)
算法沉淀——分治算法 快排思想01.颜色分类02.排序数组03.数组中的第K个最大元素04.库存管理 III 归并思想01.排序数组02.交易逆序对的总数03.计算右侧小于当前元素的个数04.翻转对 分治算法是一种解决问题的算法范式,其核心思想是将一个大问题分解成若干个小问题&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深度解析:从“业务语义本体“到“智能体矩阵“的技术架构
一、行业背景:CRM的AI进化分水岭2026年,企业面临获客成本飙升、销售周期拉长、客户需求日益挑剔的多重挑战。传统CRM依赖人工录入且缺乏智能分析能力,往往沦为滞后的记录工具。市场正在寻找能够主动思考、预判和执行的下一代CRM架构。销售易基…...
别再死记硬背了!图解MATLAB形态学:用‘膨胀腐蚀’和‘开闭运算’修复破损老照片
用MATLAB形态学魔法修复老照片:从膨胀腐蚀到开闭运算的实战指南 翻开泛黄的相册,那些承载着记忆的老照片往往布满时间的痕迹——划痕、斑点、缺失的角落。作为图像处理领域的瑞士军刀,MATLAB提供了一套强大的形态学工具,能像数字修…...
DeepSeek LeetCode 2509.查询树中环的长度 public int[] cycleLengthQueries(int n, int[][] queries)
这道题的核心是找到两个节点在完全二叉树中的路径长度,然后计算环的长度。关键思路:1. 完全二叉树的节点编号规律:节点 i 的父节点是 i/2 2. 两个节点之间的路径长度 深度差 2 LCA深度差 3. 环的长度 路径长度 1(加回重复的L…...
告别‘偏科’模型:用CAST双流架构搞定视频动作识别,兼顾时空理解
时空双流协同:CAST架构如何重塑视频动作识别的平衡之道 视频动作识别正面临一个关键瓶颈——现有模型往往在时空理解上"偏科"。就像人类大脑需要左右半球协同工作才能完整理解世界一样,理想的视频理解模型也需要同时具备敏锐的空间感知和精准的…...
433MHz无线模块解码避坑指南:从示波器抓波形到STM32代码实现的完整流程
433MHz无线模块解码实战:从波形分析到STM32代码优化的全流程解析 1. 解码前的硬件准备与信号捕获 当你第一次拿到433MHz无线模块时,最令人困惑的往往是"为什么我的代码无法正确解码?"要解决这个问题,我们需要从最基础的…...
ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试!
ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试! 在射频电路设计中,ADF4350作为一款集成VCO的宽带频率合成器,因其出色的性能和灵活性广受工程师青睐。然而,许多开发者在实际应用中…...
告别臃肿PDF!用Ghostscript命令行批量压缩/拆分/合并的保姆级教程
Ghostscript实战指南:PDF批量处理的高效命令行艺术 每次面对动辄上百兆的扫描版PDF报告时,你是否也经历过邮箱附件发送失败、云盘上传卡在99%的崩溃瞬间?当领导临时要求合并二十份季度报表,或是学术期刊需要按章节拆分投稿时&…...
告别Mac与Windows传文件烦恼:一招教你将APFS格式的移动硬盘永久改成ExFAT通用格式
跨平台文件共享终极方案:APFS与ExFAT格式深度解析与转换指南 当你在Mac上插入新买的移动硬盘准备备份重要设计稿时,系统默认将其格式化为APFS;三天后客户紧急需要修改方案,你带着硬盘赶到Windows电脑前——却发现根本无法读取内容…...
Pandas/NumPy数据处理中,科学计数法如何‘隐形’影响你的结果?附解决方案
Pandas/NumPy数据处理中科学计数法的隐形陷阱与实战解决方案 当你处理一组看似普通的销售数据时,可能会遇到这样的情况:某个产品的单价被记录为1.23e-5,而另一个产品的单价则是0.0000123。在肉眼看来,这两个数字似乎相等ÿ…...








