- 博客(422)
- 资源 (62)
- 收藏
- 关注
原创 07_【正点原子】DNESP32S3开发板桌面天气助手(arduino)
本文介绍了基于正点原子DNESP32S3开发板实现天气时钟项目的开发过程。主要内容包括:1) 注册和风天气API获取天气数据;2) 硬件配置(8MB FLASH、64KB LVGL缓存、启用GIF解码库);3) 使用多种字体(阿里普惠字体、LED数码管字体等)显示信息;4) 实现开机界面显示太空人GIF动画及网络连接状态;5) 通过多任务处理WiFi连接、时间同步、温湿度采集和天气数据获取;6) 设计主界面显示天气、时间等信息。项目充分利用了ESP32的联网能力和LVGL图形库,实现了动态天气时钟功能。
2026-07-23 10:47:15
26
原创 06_【正点原子】DNESP32S3开发板使用TFT_eSPI 库(arduino)
本文介绍了在正点原子DNESP32S3开发板上驱动TFT液晶屏的完整流程。通过TFT_eSPI库实现屏幕控制,关键步骤包括:1)初始化XL9555(I2C引脚41/42);2)配置复位和背光引脚;3)执行硬件复位(严格遵循时序要求);4)初始化TFT前关闭背光避免花屏;5)使用tft.init()初始化屏幕。示例代码展示了屏幕初始化、红色填充及背光控制,注释部分还提供了多色填充的循环演示代码。
2026-07-20 16:33:12
161
原创 05_【正点原子】DNESP32S3开发板移植LVGL
本文介绍了在正点原子DNESP32S3开发板上移植LVGL图形库的实现方案。主要内容包括:1) 通过idf_component.yml配置LVGL 9.2.0依赖;2) 实现LVGL与ESP32-S3的硬件接口层,包括双缓冲DMA内存分配、SPI-LCD刷新回调、线程安全锁机制;3) 创建定时器任务处理LVGL事件循环;4) 主程序流程:初始化LCD驱动→配置LVGL显示→启动任务→构建UI界面。关键点包括RGB565字节序转换、局部渲染优化、看门狗防护等,为ESP32-S3平台提供完整的LVGL图形解决方
2026-07-19 15:04:28
248
原创 04_【正点原子】DNESP32S3开发板显示图片
本文介绍了基于正点原子DNESP32S3开发板驱动ST7789 SPI液晶屏的实现方案。通过ESP-IDF的esp_lcd框架,使用SPI总线初始化配置,结合XL9555扩展芯片控制屏幕电源。关键点包括:1)SPI总线与DMA配置实现高效传输;2)双缓冲机制分片处理320×240分辨率图像;3)支持波纹动画和静态图片两种显示模式。代码展示了SPI初始化、LCD适配器创建、ST7789驱动配置及图像显示函数,通过RGB565格式和DMA优化实现流畅刷屏效果,适用于嵌入式GUI开发场景。
2026-07-19 09:44:19
35
原创 02_ESP32S3点亮LED实验
摘要:本文介绍了在正点原子ESP32S3 BOX3开发板上使用GPIO_NUM_13引脚控制LED闪烁的实现方法。通过FreeRTOS任务方式,创建了一个周期为1秒的LED闪烁任务,包括GPIO初始化配置和状态切换逻辑。程序首先初始化NVS存储系统,然后创建LED任务,在任务中循环切换LED开关状态并通过串口打印状态信息。代码展示了ESP32的GPIO配置方法、FreeRTOS任务创建流程以及基本的延时控制,实现了稳定的LED闪烁效果。
2026-07-16 17:23:13
55
原创 01_ESP32S3读取芯片硬件信息
该代码展示了在正点原子DNESP32S3 BOX3开发板上进行基础硬件信息读取和日志打印的示例。程序首先初始化NVS闪存分区,然后获取并显示芯片硬件信息,包括CPU内核数、FLASH大小(以MB为单位)和PSRAM容量。最后进入主循环,每秒打印一次"Hello-ESP32_Box3"日志信息。代码使用了FreeRTOS的任务延时功能,演示了ESP32开发的基本流程和日志输出方法。运行效果通过串口输出硬件参数和循环日志信息。
2026-07-16 15:37:03
21
原创 图像检索系统
该文介绍了一个基于颜色特征的图像检索系统实现方法。系统首先通过RGBToHSV函数将图像转换为HSV颜色空间,然后计算图像的H、S、V三个通道的12维直方图特征。特征提取阶段采用颜色直方图和颜色矩等方法,计算图像的颜色分布特征。相似度计算采用距离度量方法(如欧氏距离)比较待检索图像与库中图像的特征差异。最后将相似度高的图像按顺序呈现作为检索结果。文中提供了核心的C++代码实现,包括颜色空间转换和直方图计算函数。
2025-08-07 15:47:20
395
原创 esp8266 GPIO
关于 FUNCTION 需要注意的是,如果需要配置为 FUNCTION3,应该往寄存器对应的位中写 2,如果需要配置为 FUNCTION2,应该往寄存器对应的位中写 1,以此类推。功能选择寄存器 PERIPHS_IO_MUX_MTDI_U(不同的 GPIO,该寄存器不同)需要 MTDI 配置输出低电平,将该函数的第 2 个参数设置为 0 即可。ESP8266 的 16 个通⽤ IO 的管脚位置和名称如下表所示。根据名字找到函数号码。此处的 FUNC_GPIO12=3。不同的 PIN 脚,配置不同。
2024-06-28 16:36:58
746
原创 C语言读取BMP文件
BMP图像编码BMP即bitmap,也就是位图,一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区。在图像数据之前,如图所示,共有54位数据其中,0x424d在十进制为19778,对应的ASCII码为BM,表示这是个bitmap文件。Windows的数据是倒着念的,这是PC电脑的特色。如果一段数据为42 4D,倒着念就是4D 42,即0x4D42。因此,如果bfSize的数据为A2 1E 04 00,实际上就成了0x00041EA2,也就是0x41EA2
2022-05-23 15:07:20
4592
3
原创 使用lambda在循环中传参时,参数总为同一个值
当我使用PyQt5时,需要在调用事件时传入参数,于是想到了lambda函数,代码如下: for i, button in enumerate(self.button_dict.values()): button.clicked.connect(lambda: self.click_checkbox(i))此时i都是同一个值。lambda函数(或称闭包)传递的不是参数的值,而是参数的物理地址,所以lambda传递的参数都会是同一个值。想要解决可以使用functools模块。解决方案
2022-04-28 13:29:51
713
原创 ES6 let 和 const 命令
let 基本用法let命令,用来声明变量。它的用法类似于varlet a = 10;var b = 1;不存在变量提升var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined// var 的情况console.log(foo); // 输出undefinedvar foo = 2;// let 的情况console.log(bar); // 报错ReferenceErrorlet bar = 2;暂时性死区ES6 明确规定,如果区块中存在let和co
2022-03-10 10:01:51
348
原创 Axios 使用说明
安装使用npm$ npm install axios使用cdn<script src="https://unpkg.com/axios/dist/axios.min.js"></script>GET// 为给定 ID 的 user 创建请求axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (error)
2022-03-09 17:27:46
589
原创 ES6 Promise 对象
Promise 是异步编程的一种解决方案:Promise是一个对象,通过它可以获取异步操作的消息;promise有三种状态:pending(等待态),fulfilled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。**基本用法 const promise = new Promise(function (resolve, reject) { let p = { co.
2022-03-09 07:00:52
299
原创 vscode 快速生成html模板
VSCode中,在新建html的页面生成代码,可以 输入! 然后回车或者Tab即可自动生成一个html文件模板,效果如下
2022-02-08 08:21:42
5936
17
原创 vs2019 使用向导生成一个MFC应用程序
创建项目选择mfc模板配置项目运行类视图双击类名即可跳转到类声明所在的.h文件下面为类中的成员函数,双击即可跳转到相应的定义部分消息处理的添加在CMainFrame添加消息处理,程序并没有反应,需要在view层操作上述过程。在消息列表中找到WM_LBUTTONDOWN消息,添加。工程文件增加几处改变。第一处:在框架类头文件中添加了鼠标左键消息函数的函数声明第二处:在框架类cpp文件中添加了消息映射宏第三处:在框架列cpp文件中添加了处理鼠标左键消息的函数定
2021-10-03 11:33:26
986
原创 vs2019 第一个MFC应用程序
创建项目项目的创建和之前一样,只是此次的源文件后缀为.cpp,因为MFC是由C++编写的,编写MFC程序需要包含**#include <afxwin.h>**头文件。编写代码mfc.h#pragma once#include <afxwin.h>class MyApp :public CWinApp//CWinApp应用程序类{public: //程序入口 virtual BOOL InitInstance();};class MyFrame :publ
2021-10-03 09:25:28
956
1
原创 vs2019 桌面程序快速入门
创建项目选择windows桌面向导配置项目选择程序类型编写代码#include <windows.h> //底层实现窗口 的头文件//6处理窗口过程//CALLBACK 代表__stdcall 参数的传递顺序:从右到左 以此入栈,并且在函数返回前 清空堆栈LRESULT CALLBACK WindowProc( HWND hwnd, //消息所属的窗口句柄 UINT uMsg, //具体消息名称 WM_XXXX 消息名 WPARAM wParam, //键盘
2021-10-03 08:06:48
2364
原创 python图像灰度变换
二值化非0元素取1法非零元素取一法是最基础的二值化算法。顾名思义,非零取一就是对于灰度图像f,若某像素灰度值为零,则其灰度值不变,仍为零;对于灰度值不为零的像素,将其像素值全部变为255。img = np.zeros((w, h), dtype=np.uint8) for j in range(h): for i in range(w): if grey[j, i] != 0: img[j, i] = 255固定阀值法固定阀值法就是为灰度
2021-09-28 21:30:04
3400
1
原创 python图像几何变换
图像的平移图像平移(Translation)是将图 像中所有的点都按照指定的平移量,进行水平、垂直移动。x=self.trans.xy=self.trans.y# img[x:h-1,y:w-1]=image[0:h-1-x,0:w-1-y]for j in range(h): for i in range(w): i0=i+x j0=j+y if(i0>=0) and (i0<w) and (j0>=0)and (j.
2021-09-25 21:45:22
771
原创 python 图像特效
图像扫描扫描是最基本的特效显示方式,它没有划分图像块,只是顺序地一行一行或一列一列地显示图像或清除图像。向下扫描、向上扫描、向右扫描、向左扫描。四种扫描的原理相同。只是显示图像的次序不同。 self.lb_2.setPixmap(QPixmap("")) # 绘制图像 image = self.image.xBitmap.img_org image = cv2.cvtColor(image, cv2.COLOR_BGR2RGBA) h,.
2021-09-24 18:16:07
796
原创 MTCNN人脸检测
MTCNN可实现两个任务——人脸检测与人脸关键点检测。MTCNN已经集成到了python的库中。安装注意:安装前需要确认以下依赖:python >= 3.4opencv >= 4.1Keras>=2.0.0pip install mtcnn人脸检测from mtcnn import MTCNNimport cv2img=cv2.imread("../datas/face/ldh2.jpg")img = cv2.cvtColor(img, cv2.COLOR_BG
2021-08-30 09:35:19
589
原创 人脸识别 face_recognition
导入face_recognition模块import face_recognitionload_image_file 加载图像调用face_recognition.load_image_file()读入图像。输出图像是rgb格式(opencv中是bgr格式)import face_recognitionimage = face_recognition.load_image_file("../datas/obama.jpg")face_locations 人脸检测能定位所有图像中识别出的人
2021-08-26 10:49:39
1234
原创 python数字图像处理笔记17 形态学
膨胀效果:扩大图像中的物体定义:设 A 为原始二值图像,B 是结构元素,则 A 被 B 膨胀定义为:def Morphology_Dilate(img, Dil_time=1): H, W = img.shape # kernel MF = np.array(((0, 1, 0), (1, 0, 1), (0, 1, 0)), dtype=np.int) # each dilate ti
2021-07-01 19:32:38
375
1
原创 python数字图像处理笔记16 滤波增强
空域滤波增强空域滤波增强也称为模板操作,主要以像素邻域为基础对图像进行增强,增强函数E()定义在像素点(x,y)的某个邻域上。模板是指滤波器、核、掩模或窗口。邻域可以是任意形状,通常采用正方形或矩形阵列。空域滤波增强的基本原理是利用图像与模板的卷积来进行。模板通常取尺寸为n×n的小图像,n一般为奇数,此时,模板的半径定义为:r=(n-1)/2。空域滤波增强可分为以下4类(1)线性平滑滤波器(2)非线性平滑滤波器(3)线性锐化滤波器(4)非线性锐化滤波器均值滤波均值滤波器使用网格内像素的平
2021-07-01 16:52:15
732
1
原创 python数字图像处理笔记15 灰度变换
灰度变换属于空域变换增强技术。目的:一般成像系统形成图像的亮度有限,对比度不足,使图像的视觉效果差,灰度变换即可有效地改善视觉效果。概念:灰度变换是一种点操作,根据原始图像中每个像素的灰度值,按照某种映射规则将其转化为另一灰度值。灰度变换可有效改善图像的视觉效果,变换原理可表示为如式所示:式中:k为原始图像的灰度值f(x,y),t为变换图像的灰度值g(x,y),E()为灰度增强函数。原理:灰度变换原理可由图来说明,其中,图(a)为原始图像,具有两种灰度级,分别用B和W来表示;图(b)为灰度增
2021-07-01 15:30:21
2846
原创 python数字图像处理笔记14 直方图处理
绘制直方图表示图像中具有某种灰度级的像素的个数,反映了图像中每种灰度出现的频率。它是图像最基本的统计特征。横坐标:灰度级;纵坐标:该灰度级出现的个数。def hist(img): list=np.zeros(256,dtype=np.float) if len(img.shape) == 3: img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) H, W=img.shape for y in range(H):
2021-07-01 10:47:50
450
原创 python数字图像处理笔记13 逻辑运算
与运算与运算是指将两幅原始图像对应位置处两个像素的灰度值通过与操作得到一个新的灰度值,作为结果图像对应位置处像素的灰度值。设两个像素为p和q,则与运算可表示为:两幅图像的矩阵数据如下所示,试求X·Y的结果。两幅图像相与的结果为:img1 = self.xBitMap1.imgimg2 = self.xBitMap2.imgout=img1&img2XImage.imShow(out, self.lb3)或运算或运算是指将两幅原始图像对应位置处两个像素的灰度值通过或操作得到
2021-06-30 22:44:51
1560
3
原创 python数字图像处理笔记12 算术运算
加法加法运算是指将两幅原始图像对应位置处两个像素的灰度值相加得到一个新的灰度值,作为结果图像对应位置处像素的灰度值。设两个像素为p和q,则加法运算可表示为:式中:f(x)为像素x的灰度值。注意:由于图像像素的灰度值范围为[0,255],因此,相加结果如果大于255,则取255。def add(img1,img2): H1, W1, C1 = img1.shape # H2, W2, C2 = img2.shape out = np.zeros((H1, W1, C1),
2021-06-30 16:50:57
1294
原创 python数字图像处理笔记11 几何变换代码实现
平移def translate(img, tx, ty): H, W, C = img.shape # out = np.zeros((H, W, C), dtype=np.uint) out1 = np.zeros((H + ty, W + tx, C), dtype=np.uint8) # 必须是8 不然显示不出图像 out2 = np.zeros((H, W, C), dtype=np.uint8) # 必须是8 不然显示不出图像 out3 = np.z
2021-06-30 10:37:27
529
原创 python数字图像处理笔记10 图像旋转
图像旋转旋转前旋转后矩阵表示def rotate(img, angle): H, W, C = img.shape anglePi = angle * math.pi / 180.0 cosA = math.cos(anglePi) sinA = math.sin(anglePi) out = np.zeros((H, W, C), dtype=np.uint8) # 必须是8 不然显示不出图像 for y in range(H):
2021-06-25 10:56:45
2094
2
原创 python数字图像处理笔记09 灰度插值算法 pyqt5界面
界面初始化图片 def initData(self): self.xBitMap = XImage.openImage(os.path.join(XImage.xpath,"ch03", "imori.jpg"), self.lb1)绑定按钮事件 self.btn_nearest.clicked.connect(lambda: self.nearest_handler()) self.btn_bilinear.clicked.connect(lambda:
2021-06-23 14:48:00
499
原创 python数字图像处理笔记08 双三次插值(没学会)
理解不了,暂时记录到这里吧!双三次插值是双线性插值的扩展,使用邻域 像素进行插值。我们要做的就是求出BiCubic函数中的参数x,从而获得上面所说的16个像素所对应的系数。
2021-06-23 14:20:37
396
原创 python数字图像处理笔记07 双线性插值法 ~~~这就是为什么要学数学的例子!
单线性插值已知中P1点和P2点,坐标分别为(x1, y1)、(x2, y2),要计算 [x1, x2] 区间内某一位置 x 在直线上的y值2点求一条直线公式
2021-06-23 10:53:44
754
原创 python数字图像处理笔记06 最近邻插值法
最近邻插值法在一维空间中,最近点插值就相当于四舍五入取整。在二维图像中,像素点的坐标都是整数,该方法就是选取离目标点最近的点。使用下面的公式放大图像! I’ 为放大后图像, I为放大前图像, a为放大率,方括号是四舍五入取证操作...
2021-06-22 21:19:00
2119
1
原创 python数字图像处理笔记05 几何变换
平移变换(Translation Transformation)指将图像沿某方向平移来获取新图像的变换方法。设空间中一个点的笛卡尔坐标为(x,y,z),基于平移向量(a,b,c)将其平移到新的坐标(x’,y’,z’)。放缩变换(Scale Transformation)也称为尺度变换,指将图像在某方向按比例缩放来获取新图像的变换方法。放缩变换改变了图像的尺寸,即改变了图像像素点间的距离。放缩变换一般沿坐标轴方向进行,或可分解为沿坐标轴方向进行。当放缩系数a、b、c不为整数时,原始图像中某些像素
2021-06-21 16:00:49
1850
原创 python数字图像处理笔记04 像素空间关系
像素的邻域一个像素的邻近像素组成该像素的邻域。像素邻域的类型如图所示:1. 4-邻域N4§由p的水平(左右)和垂直(上下)共4个近邻像素组成。这些近邻像素的坐标分别是(x+1,y),(x-1,y),(x,y-1),(x,y+1)。组成p的4-邻域的4个像素均用r表示。2. 对角邻域ND§由p的对角(左上、右上、左下、右下)共4个近邻像素组成。这些近邻像素的坐标分别是(x+1,y+1),(x+1, y-1),(x-1,y+1),(x-1,y-1)。组成p的对角邻域的4个像素均用s表示。3.
2021-06-20 21:58:52
1554
1
原创 python数字图像处理笔记03 代码实现
数字图像表示方式 self.xBitMap = XImage.openImage(os.path.join(XImage.xpath, "ch01","F1_7a.jpg"), self.lb1) self.xBitMap2 = XImage.openImage(os.path.join(XImage.xpath, "ch01","F1_7b.jpg"), self.lb2)图像质量空间分辨率变化、幅度分辨率不变 img=self.xBitMap.img dsize0 =
2021-06-20 21:36:57
540
6
vb在线升级程序(源码)
2009-01-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅