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

OpenCV 光流估计:从原理到实战

在计算机视觉领域,光流估计(Optical Flow Estimation)是一项至关重要的技术,它能够通过分析视频序列中图像像素的运动信息,捕捉物体和相机的运动情况。OpenCV 作为强大的计算机视觉库,为我们提供了高效实现光流估计的工具。本文将深入探讨光流估计的原理,并结合 OpenCV 代码进行实战演示,带你快速掌握这项技术。

一、光流估计原理

光流(Optical Flow)是指图像中像素点在相邻帧之间的运动矢量。其基本假设是:相邻帧之间物体的亮度恒定,并且相邻帧之间的运动较小。基于这两个假设,我们可以通过数学推导得到光流的约束方程。

假设在 \(t\) 时刻,图像中某点 \((x, y)\) 的亮度为 \(I(x, y, t)\) ,在 \(t + dt\) 时刻,该点运动到 \((x + dx, y + dy)\) ,亮度为 \(I(x + dx, y + dy, t + dt)\) 。根据亮度恒定假设,有 \(I(x, y, t) = I(x + dx, y + dy, t + dt)\) 。

利用泰勒展开,将 \(I(x + dx, y + dy, t + dt)\) 展开:

\( I(x + dx, y + dy, t + dt) = I(x, y, t) + \frac{\partial I}{\partial x}dx + \frac{\partial I}{\partial y}dy + \frac{\partial I}{\partial t}dt + \epsilon \)

由于 \(\epsilon\) 是高阶无穷小,可忽略不计,结合亮度恒定假设,得到:

\( \frac{\partial I}{\partial x}\frac{dx}{dt} + \frac{\partial I}{\partial y}\frac{dy}{dt} + \frac{\partial I}{\partial t} = 0 \)

令 \(u = \frac{dx}{dt}\) ,\(v = \frac{dy}{dt}\) ,分别表示 \(x\) 方向和 \(y\) 方向的光流速度,\(\frac{\partial I}{\partial x} = I_x\) ,\(\frac{\partial I}{\partial y} = I_y\) ,\(\frac{\partial I}{\partial t} = I_t\) ,则光流约束方程为:

\( I_xu + I_yv + I_t = 0 \)

然而,一个方程无法求解两个未知数 \(u\) 和 \(v\) ,因此需要额外的约束条件。常见的方法有基于梯度的方法(如 Lucas - Kanade 方法)和基于能量的方法(如 Horn - Schunck 方法) 。

1. Lucas - Kanade 方法

Lucas - Kanade 方法假设在一个小的窗口内,光流是恒定的。通过在一个小窗口内对多个像素点建立光流约束方程,利用最小二乘法求解超定方程组,得到该窗口内像素点的光流估计。

具体来说,对于一个 \(n \times n\) 的窗口,窗口内有 \(N = n^2\) 个像素点,每个像素点都满足光流约束方程 \(I_{xi}u + I_{yi}v + I_{ti} = 0\) (\(i = 1, 2, \cdots, N\))。将这些方程写成矩阵形式:

\( \begin{bmatrix} I_{x1} & I_{y1} \\ I_{x2} & I_{y2} \\ \vdots & \vdots \\ I_{xN} & I_{yN} \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} -I_{t1} \\ -I_{t2} \\ \vdots \\ -I_{tN} \end{bmatrix} \)

记为 \(A\begin{bmatrix}u \\ v\end{bmatrix} = -b\) ,通过最小二乘法求解 \(\begin{bmatrix}u \\ v\end{bmatrix}\) :

\( \begin{bmatrix}u \\ v\end{bmatrix} = (A^TA)^{-1}A^T(-b) \)

2. Horn - Schunck 方法

Horn - Schunck 方法引入了全局平滑约束,将光流估计问题转化为一个能量最小化问题。定义能量函数:

\( E = \sum_{x,y}[(I_xu + I_yv + I_t)^2 + \alpha^2(|\nabla u|^2 + |\nabla v|^2)] \)

其中,\((I_xu + I_yv + I_t)^2\) 是数据项,保证光流满足光流约束方程;\(\alpha^2(|\nabla u|^2 + |\nabla v|^2)\) 是平滑项,\(\alpha\) 是平滑系数,用于控制平滑程度,\(|\nabla u|^2\) 和 \(|\nabla v|^2\) 分别表示 \(u\) 和 \(v\) 的梯度平方,使得光流在空间上更加平滑。

通过变分法求解能量函数的最小值,得到光流的迭代更新公式,不断迭代直到收敛。

二、OpenCV 中的光流估计实现

OpenCV 提供了多种光流估计算法的实现,下面以 Lucas - Kanade 方法和 Farneback 算法为例进行介绍。

1. Lucas - Kanade 稀疏光流

Lucas - Kanade 稀疏光流适用于跟踪少量特征点的运动。在 OpenCV 中,可以使用 cv2.calcOpticalFlowPyrLK() 函数来实现。

import cv2import numpy as np# 读取视频cap = cv2.VideoCapture('your_video.mp4')# 角点检测参数feature_params = dict( maxCorners = 100,qualityLevel = 0.3,minDistance = 7,blockSize = 7 )# Lucas - Kanade光流参数lk_params = dict( winSize = (15,15),maxLevel = 2,criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# 随机颜色color = np.random.randint(0,255,(100,3))# 读取第一帧并检测角点ret, old_frame = cap.read()old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)# 创建一个用于绘制的掩码图像mask = np.zeros_like(old_frame)while(1):ret,frame = cap.read()frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算光流p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# 选择好的点good_new = p1[st==1]good_old = p0[st==1]# 绘制轨迹for i,(new,old) in enumerate(zip(good_new,good_old)):a,b = new.ravel()c,d = old.ravel()mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)img = cv2.add(frame,mask)cv2.imshow('frame',img)k = cv2.waitKey(30) & 0xffif k == 27:break# 更新上一帧和上一帧的角点old_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)cv2.destroyAllWindows()cap.release()

上述代码首先读取视频,使用 cv2.goodFeaturesToTrack() 函数检测第一帧中的角点作为跟踪的初始点。然后在每一帧中,通过 cv2.calcOpticalFlowPyrLK() 函数计算这些角点在下一帧中的位置,并绘制出角点的运动轨迹。

2. Farneback 稠密光流

Farneback 稠密光流可以计算图像中所有像素点的光流,得到一个稠密的光流场。在 OpenCV 中,使用 cv2.calcOpticalFlowFarneback() 函数实现。

import cv2import numpy as npcap = cv2.VideoCapture('your_video.mp4')ret, prev_frame = cap.read()prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)while True:ret, frame = cap.read()if not ret:breakframe_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算Farneback光流flow = cv2.calcOpticalFlowFarneback(prev_gray, frame_gray, None,0.5, 3, 15, 3, 5, 1.2, 0)# 计算光流的大小和方向magnitude, angle = cv2.cartToPolar(flow[..., 0], flow[..., 1])# 将角度映射到0-180度angle = np.arctan2(flow[..., 1], flow[..., 0]) * 180 / np.pi# 归一化光流大小magnitude = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX)# 转换为8位无符号整数magnitude = np.uint8(magnitude)# 生成颜色映射图像color = cv2.applyColorMap(magnitude, cv2.COLORMAP_HSV)# 将角度转换为HSV颜色空间的色调值color[..., 0] = angle % 180# 将HSV转换为BGRcolor = cv2.cvtColor(color, cv2.COLOR_HSV2BGR)cv2.imshow('Optical Flow', color)if cv2.waitKey(1) & 0xFF == ord('q'):breakprev_gray = frame_gray.copy()cap.release()cv2.destroyAllWindows()

上述代码通过 cv2.calcOpticalFlowFarneback() 函数计算每一帧与前一帧之间的稠密光流场,然后将光流的大小和方向转换为 HSV 颜色空间,再转换为 BGR 颜色空间进行可视化。

三、光流估计的应用场景与局限性

1. 应用场景

  • 运动目标跟踪:通过光流估计可以跟踪视频中物体的运动轨迹,在安防监控、自动驾驶等领域有广泛应用。例如,在安防监控中,跟踪人员或车辆的移动;在自动驾驶中,跟踪前方车辆和行人的运动。
  • 视频压缩:光流信息可以用于视频压缩算法中,减少相邻帧之间的冗余信息,提高压缩效率。
  • 动作识别:分析视频中人体或物体的动作,在人机交互、体育动作分析等方面发挥作用 。例如,在人机交互中,根据用户的动作执行相应的操作;在体育动作分析中,评估运动员的动作是否标准。

2. 局限性

  • 亮度恒定假设不满足:当光照条件发生剧烈变化时,光流估计的准确性会受到严重影响。例如,视频中突然开灯或关灯,会导致像素点的亮度发生突变,破坏亮度恒定假设。
  • 大运动目标:对于运动速度过快或运动幅度较大的物体,光流估计可能无法准确捕捉其运动信息。因为光流估计的基本假设是相邻帧之间的运动较小,大运动目标可能超出这个假设范围。
  • 遮挡问题:当物体发生遮挡时,被遮挡部分的光流无法准确估计。例如,在视频中一个物体被另一个物体遮挡,遮挡部分的像素点运动信息丢失,导致光流估计错误。

四、总结

本文详细介绍了光流估计的原理,包括 Lucas - Kanade 方法和 Horn - Schunck 方法,并结合 OpenCV 代码演示了稀疏光流(Lucas - Kanade 方法)和稠密光流(Farneback 算法)的实现过程。同时,分析了光流估计的应用场景和局限性。光流估计作为计算机视觉领域的重要技术,在众多领域都有着广泛的应用前景。通过学习和实践,我们可以更好地利用这项技术解决实际问题。

希望本文能帮助你深入理解 OpenCV 光流估计,如果你在实践过程中有任何问题或有新的想法,欢迎在评论区交流讨论!

相关文章:

OpenCV 光流估计:从原理到实战

在计算机视觉领域,光流估计(Optical Flow Estimation)是一项至关重要的技术,它能够通过分析视频序列中图像像素的运动信息,捕捉物体和相机的运动情况。OpenCV 作为强大的计算机视觉库,为我们提供了高效实现…...

星火杯大模型应用创新赛学习笔记——datawhale

背景——赛事任务 聚焦大学生真实应用场景,围绕阅读、写作、搜索、聊天、问答等方向,聚焦口语学习、面试招聘、论文写作、学习笔记等一个或多个细分应用场景,完成具有创新性、实用性的应用方案,呈现可演示、可落地、具备商业价值…...

Ulyssess Ring Attention

https://zhuanlan.zhihu.com/p/689067888https://zhuanlan.zhihu.com/p/689067888DeepSpeed Ulysess:切分Q、K、V序列维度,核心卖点保持通信复杂度低,和GPU数无关,和序列长度呈线性关系。 Ring-Attention:切分Q、K、V序…...

c++重要知识点汇总(不定期更新)

前言 真心希望各位dalao点赞收藏~ 树状数组 作用:高效求出区间前缀和,允许进行修改操作。 举个栗子: 刚开始有8项,分别为1-8。 首先构建二叉树: 1-8/ |/ |/ |/ |/ |1-4 5-8/ | / |/ | / |1-…...

重排序模型解读 mxbai-rerank-base-v2 强大的重排序模型

mxbai-rerank-base-v2 强大的重排序模型 模型介绍benchmark综合评价安装 模型介绍 mxbai-rerank-base-v2 是 Mixedbread 提供的一个强大的重排序模型,旨在提高搜索相关性。该模型支持多语言,特别是在英语和中文方面表现出色。它还支持代码和 SQL 排序&a…...

电子电路:到底该怎么理解电容器的“通交流阻直流”?

电容器“通交流,阻直流”的特性源于其对不同频率电信号的响应差异,具体可通过以下步骤理解: 一、电容器的基本结构与充放电机制 结构:由两个导体极板(如金属)和中间的绝缘介质组成。充放电过程&#xff1a…...

售前工作.工作流程和工具

第一部分 售前解决方案及技术建议书的制作 售前解决方案编写的标准操作步骤SOP: 售前解决方案写作方法_哔哩哔哩_bilibili 第二部分 投标过程关键活动--商务标技术方案 1. 按项目管理--售前销售项目立项 销售活动和销售线索的跟踪流程和工具 1)拿到标书&#xff…...

ORACLE数据库实例报错ORA-00470: LGWR process terminated with error宕机问题分析报告

服务概述 10月21号03:22分,BOSS数据库实例发生异常宕机;工程师及时响应此问题并对此故障原因进行分析及相关建议,详细的故障情况及相关日志、TRACE文件的分析及总结、建议,请参阅本文档。 hzboss数据库实例宕机分析 4.1 数据库层面日志的分…...

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义: 知识蒸馏是一种模型压缩与迁移技术,通过将复杂高性能的教师模型(Teacher Model)所学的“知识”迁移到轻量级的学生模型(Student Model),使学生模型在参数量和计…...

AI日报 - 2024年5月17日

🌟 今日概览 (60秒速览) ▎🤖 大模型前沿 | OpenAI推出自主编码代理Codex;Google DeepMind发布Gemini驱动的编码代理AlphaEvolve,能设计先进算法;Meta旗舰AI模型Llama 4 Behemoth发布推迟。 Codex能并行处理多任务&…...

OAuth2.0

OAuth2.0 1. 什么是OAuth2.02.OAuth2.0的应用场景3. OAuth2.0基本概念4. 经典OAuth2.0认证流程5. 四种授权模式5.1 授权码模式(Authorization Code Grant)5.2 隐式授权(Implicit Grant)5.3 密码模式(Resource Owner Pa…...

deepin v23.1 音量自动静音问题解决

有的机器上会有音量自动静音问题, 如果你的电脑上也遇到, 这个问题是 Linux 内核的原因, ubuntu上也可能会遇到相同问题(比如你升级了最新内核6.14), 而我测试得6.8.0的内核是不会自动静音的. Index of /mainline 到上面这个链接(linux 内核的官方链接)下载6.8.0的内核, s…...

Spring Security 集成指南:避免 CORS 跨域问题

Spring Security 集成指南:避免 CORS 跨域问题 在现代 Web 应用开发中,前后端分离架构已成为主流。当我们使用 Spring Security 保护后端 API 时,经常会遇到跨域资源共享(CORS)问题。这篇文章将详细解析 Spring Secur…...

stack和queue简单模拟实现

stackreverse_iteratorqueuepriority_queue仿函数具体代码 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…...

2.单链表两数相加(java)

题目描述: 分析: 1.首先创建一个虚拟节点 ListNode dummy new ListNode(-1);再创建一个节点来保存虚拟节点,因为使用虚拟节点来移动,如果不保存,最后就会丢失。保存虚拟节点:ListNode pdummy; 2.进位标志…...

JDBC 的编写步骤及原理详解

一、JDBC 简介 JDBC(Java DataBase Connectivity)即 Java 数据库连接,是 Java 语言用于操作数据库的一套 API。它为多种关系数据库提供了统一的访问方式,允许 Java 程序与不同类型的数据库(如 MySQL、Oracle、SQL Ser…...

AIStarter Windows 版本迎来重磅更新!模型插件工作流上线,支持 Ollama / ComfyUI 等多平台本地部署模型统一管理

如果你正在使用 AIStarter 工具进行本地 AI 模型部署 ,那么这条消息对你来说非常重要! 在最新推出的 AIStarter Windows 正式版更新中 ,官方对整个平台进行了功能重构和性能优化,尤其是新增了「模型插件工作流 」功能&#xff0c…...

卸载和安装JDK

文章目录 卸载JDK安装JDK 卸载JDK 删除java的安装目录删除JAVA_HOME删除path下关于java的目录在cmd命令提示符中输入 java -version 安装JDK 浏览器搜索JDK8 下载电脑对应版本 双击安装JDK 记住安装的路径 配置环境变量 我的电脑 -> 右键 -> 属性 新建系统环境变量…...

【蓝桥杯省赛真题51】python石头运输 第十五届蓝桥杯青少组Python编程省赛真题解析

python石头运输 第十五届蓝桥杯青少年组python比赛省赛真题详细解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解 <...

USRP 射频信号 采集 回放 系统

USRP 射频信号采集回放系统 也可以叫做&#xff1a; 利用宽带RF录制和回放系统实现6G技术研究超宽带射频信号采集回放系统使用NI USRP平台实现射频信号录制和回放操作演示USRP也能实现多通道宽带信号流盘回放了&#xff01; 对于最简单的实现方法就是使用LabVIEW进行实现 采…...

产品经理入门(2)产品体验报告

产品体验报告大纲&#xff1a;重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结...

区块链基本理解

文章目录 前言一、什么是分布式账本(DLT)二、什么是P2P网络?二、共识算法三、密码算法前言 区块链是由一个一个数据块组成的链条,按照时间顺序将数据块逐一链接,通过哈希指针链接,所有的数据块共同维护一份分布式账本(DLT),每个节点(可以理解为一个玩家,一台计算机)都拥…...

数字万用表与指针万用表使用方法及注意事项

在电子测量领域&#xff0c;万用表是极为常用的工具&#xff0c;数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项&#xff0c;能确保测量的准确性与安全性。下面为您详细介绍&#xff1a; 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […...

C语言查漏补缺

1、数组初始化时&#xff0c;例如char arr[5] "abcde"&#xff0c;因为字符串中有6个字符&#xff0c;即末尾还有个结束符&#xff0c;但是数组容量为5&#xff0c;所以仅接纳5个字符&#xff0c;末尾的结束符不会被接纳&#xff0c;故而这样的字符数组在直接输出时…...

【JDBC】JDBC常见错误处理方法及驱动的加载

MySQL8中数据库连接的四个参数有两个发生了变化 String driver "com.mysql.cj.jdbc.Driver"; String url "jdbc:mysql://127.0.0.1:3306/mydb?useSSLfalse&useUnicodetrue&characterEncodingutf8&serverTimezoneAsia/Shanghai"; 或者Strin…...

从紫光集团看基本财务分析

PE 46PE 代表投资人对他的期望是它的业绩至少要增长50%才算及格。 但实际业绩 一年不如一年. 所以&#xff0c;这个PE 应该是 业绩倒退了&#xff0c;但是市值还没有掉下去&#xff0c;导致运算的结果处在高PE阶段。 那么随着股价的下跌&#xff0c;这个数字会慢慢变小。 当然…...

软件调试纵横谈-17-win32堆的调试支持

17.Win32堆的调试支持_哔哩哔哩_bilibili 继续边看录像边做实验。 堆上的内存时用size表达的&#xff0c;组成一个链表。 创建一个FreCheck应用 上次看heap&#xff0c;直接使用下载的文件&#xff0c;本次要做实验了&#xff0c;就需要自己动手&#xff0c;搞个VC proje…...

CANoe CAPL TCP DoIP通信问题

目录 问题Class: TcpSocketdemo示例client注释掉配置TCP/IP stack改demo代码过滤IP,与需要的IP建立连接问题 使用CANoe进行DoIP通信时,如果是标准的DoIP节点,可以使用DoIP相关函数进行通信。 以下两篇文章是按照此方式实现的。 十六、DoIP诊断通信 1 (专栏:从零开始搭建…...

理解 plank 自动生成的 copyWithBlock: 方法

当你使用 plank 命令自动生成一个类时 ./plank --objc_class_prefix=PUG --no_runtime --no_recursive user.json分析 在 JSON 目录下, 执行如上命令后, 生成的 PUGUser 对象, 会自带 copyWithBlock: 方法, 这个方法是用来做什么的 ? copyWithBlock: (注意末尾有一个冒号,因…...

FreeCAD源码分析: Transaction实现原理

本文阐述FreeCAD中Transaction的实现原理。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 一、概念 Ref. from What is a Transaction? A transaction is a group of operations that have the f…...

黑马点评-用户登录

文章目录 用户登录发送短信验证码注册/登录校验登录 用户登录 发送短信验证码 public Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合&#xff0c;返回错误信息return Result.fail("手机…...

OpenAI新发布Codex的全面解析

一 . 介绍 人工智能技术的飞速发展正在重塑各行各业的运作方式&#xff0c;特别是在软件工程领域。随着生成式AI模型能力的不断提升&#xff0c;代码生成与软件开发领域正经历一场前所未有的变革。OpenAI作为人工智能领域的领军企业&#xff0c;其每一次技术突破都备受全球科技…...

【AI算法工程师面试指北】ResNet为什么用avgpool结构?

在ResNet&#xff08;残差网络&#xff09;中&#xff0c;最后使用平均池化&#xff08;AvgPool&#xff09;结构主要有以下几个关键原因&#xff0c;这些设计与网络的效率、性能和泛化能力密切相关&#xff1a; 1. 减少参数与计算量&#xff0c;避免过拟合 替代全连接层的冗…...

单调栈和单调队列

一、单调栈 1、使用场景 解决元素左 / 右侧第一个比他大 / 小的数字。 2、原理解释 用栈解决&#xff0c;目标是栈顶存储答案。 以元素左侧第一个比他小为例&#xff1a; &#xff08;1&#xff09;遍历顺序一定是从左向右。 &#xff08;2&#xff09;由于栈顶一定是答…...

DeepSeek-R1 Supervised finetuning and reinforcement learning (SFT + RL)

DeepSeek-R1Supervised finetuning and reinforcement learning (SFT RL) 好啊&#xff0c;我们今天的直播会非常透彻的跟大家系统性的分享一下整个agents AI就大模型智能体系统和应用程序。我们在做开发的时候&#xff0c;或者实际做企业级的产品落地的时候&#xff0c;你必…...

【部署】读取excel批量导入dify的QA知识库

回到目录 【部署】读取excel批量导入dify的QA知识库 0. 背景 dify的知识库支持QA模式&#xff0c;分段效果不算太理想&#xff0c;在我们的项目里面&#xff0c;手工编辑高质量QA文档&#xff0c;没有办法批量导入系统。 项目dify_import&#xff0c;支持读取excel文件批量导…...

Scanner对象

文章目录 Scanner对象基本语法使用next()接受使用nextLine()接受小案例总结 Scanner对象 java给我们提供了一个工具类&#xff0c;我们可以获取用户的输入 java.util.Scanner是java5的新特性&#xff0c;我们可以通过Scanner类来获取用户的输入 基本语法 Scanner s new Sc…...

Java 面向对象详解和JVM底层内存分析

先关注、点赞再看、人生灿烂&#xff01;&#xff01;&#xff01;&#xff08;谢谢&#xff09; 神速熟悉面向对象 表格结构和类结构 我们在现实生活中&#xff0c;思考问题、发现问题、处理问题&#xff0c;往往都会用“表格”作为工具。实际上&#xff0c;“表格思维”就是…...

PIC16F18877 ADC 代码

这段代码是为PIC16F18877微控制器设计的嵌入式系统程序,主要实现了LCD显示屏控制、DHT11温湿度传感器数据采集和ADC模拟量读取三大功能。程序通过配置32MHz内部时钟源初始化系统,使用4位数据总线驱动LCD显示模块,定时读取DHT11传感器获取温湿度数据并校验,同时通过ADC通道采…...

Visual Studio2022跨平台Avalonia开发搭建

由于我已经下载并安装了 VS2022版本&#xff0c;这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 ‌“.NET 桌面开发”‌ 和“Visual Studio扩展开发”‌ &#xff0c;这里由于不是用的微软的MAUI&#xff0c;所以不用选择其他的来支持跨平台开发&a…...

灵光一现的问题和常见错误1

拷贝构造函数显式写&#xff0c;编译器还会自动生成默认构造函数吗&#xff0c;还有什么函数会出现这种问题 在C中&#xff0c;当类显式定义某些特殊成员函数时&#xff0c;编译器可能不再自动生成其他相关函数。以下是详细分析&#xff1a; I. 显式定义拷贝构造函数对默认构造…...

React学习(二)-变量

也是很无聊,竟然写这玩意,毕竟不是学术研究,普通工作没那么多概念性东西,会用就行╮(╯▽╰)╭ 在React中,变量是用于存储和管理数据的基本单位。根据其用途和生命周期,React中的变量可以分为以下几类: 1. 状态变量(State) 用途:用于存储组件的内部状态,状态变化会触…...

我的世界模组开发——特征(2)

原版代码 AbstractHugeMushroomFeature 以下是对AbstractHugeMushroomFeature类代码的逐段解析,结合Minecraft游戏机制和蘑菇形态学特征进行说明: 1. 类定义与继承关系 public abstract class AbstractHugeMushroomFeature extends Feature<HugeMushroomFeatureConfigu…...

中国30米年度土地覆盖数据集及其动态变化(1985-2022年)

中文名称 中国30米年度土地覆盖数据集及其动态变化(1985-2022年) 英文名称&#xff1a;The 30 m annual land cover datasets and its dynamics in China from 1985 to 2022 CSTR:11738.11.NCDC.ZENODO.DB3943.2023 DOI 10.5281/zenodo.8176941 数据共享方式&#xff1a…...

2000 元以下罕见的真三色光源投影仪:雷克赛恩Cyber Pro1重新定义入门级投影体验

当性价比遇上技术瓶颈 在 2000元以下的1080P投影仪&#xff0c;单LCD 技术长期主导。而三色光源的DLP和3LCD真1080P都在4000元以上。 单LCD投影为纯白光光源&#xff0c;依赖CF滤光膜导致光效低下&#xff0c;普遍存在" 色彩失真 " 等问题。数据显示&#xff0c;该价…...

数学复习笔记 19

前言 向量收尾。线代大概是学了一半了。 向量 向量可以认为是一个矩阵。 线性组合 前面加一个系数就可以了。线性组合和线性表示实际上就是一个意思。 线性相关性 实际上就是内部的向量&#xff0c;至少有一个可以用其他向量表示出来。存在一种情况&#xff0c;系数不全…...

信息收集+初步漏洞打点

目标&#xff1a;理解信息收集在渗透测试中的意义&#xff0c;熟悉常用工具用法&#xff0c;完成基本打点测试 一.理论学习&#xff1a; 模块内容说明信息收集分类主动信息收集 vs 被动信息收集目标发现子域名、IP、端口、子站点、目录、接口技术指纹识别Web框架&#xff08;如…...

计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)

EMD-SSA-VMD-LSTM混合模型 一、环境配置与依赖二、数据生成&#xff08;示例数据&#xff09;三、多级信号分解1. 经验模态分解&#xff08;EMD&#xff09;2. 奇异谱分析&#xff08;SSA&#xff09;3. 变分模态分解&#xff08;VMD&#xff09; 四、数据预处理1. 归一化处理2…...

Linux线程同步信号量

什么是信号量&#xff08;Semaphore&#xff09;&#xff1f; 信号量&#xff08;Semaphore&#xff09; 是一种用于线程同步和进程间通信的机制&#xff0c;它用于控制多个线程对共享资源的访问。在 Linux 中&#xff0c;信号量通常用于防止多个线程同时访问有限的资源&#…...

日志系统**

1.设置日志级别 enum LogLevel{TRACE,DEBUG,INFO,WARN,ERROR,FATAL,NUM_LOG_LEVELS,}; 2.日志格式 TimeStamp 级别 内容 [2025-05-17 20:32:41][ERROR]This is an error message 3.输出&#xff1a;控制台/文件 4.注意 #include <chrono> #include <iomanip&g…...