【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪
文章目录
- 【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪
- 一、引言
- 二、Android 开发与 AI 的融合趋势
- 三、OpenCV 简介
- 四、运动跟踪原理
- (一)光流法
- (二)卡尔曼滤波
- (三)粒子滤波
- 五、基于 OpenCV 实现运动跟踪的步骤
- (一)环境搭建
- (二)初始化 OpenCV
- (三)实现运动跟踪
- 六、代码优化与调试
- (一)性能优化
- (二)调试技巧
- 七、应用案例与前景展望
- (一)应用案例
- (二)前景展望
- 八、参考链接
【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪
一、引言
在当今数字化时代,人工智能(AI)与移动开发的融合正深刻改变着我们的生活。从智能相机到自动驾驶辅助系统,AI 技术的应用无处不在。在 Android 开发领域,借助 AI 实现强大的视觉功能,如目标跟踪,为开发者开辟了新的创意空间。本文将深入探讨如何基于 OpenCV 库在 Android 平台上实现运动跟踪,带你领略 AI 与移动开发碰撞出的奇妙火花。
二、Android 开发与 AI 的融合趋势
随着智能手机性能的不断提升,Android 设备已经具备了运行复杂 AI 算法的能力。AI 技术的引入,使得 Android 应用能够实现更智能的交互、更精准的图像识别以及更高效的数据分析。在众多 AI 应用场景中,目标跟踪作为计算机视觉的核心任务之一,具有广泛的应用前景,如安防监控、智能交通、增强现实等。
三、OpenCV 简介
OpenCV(Open Source Computer Vision Library)是一个基于 Apache2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件库。它由一系列 C 函数和少量 C++ 类构成,同时提供了 Python、Ruby、MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 在 Android 开发中具有极高的应用价值,它提供了丰富的函数和工具,能够帮助开发者快速实现各种视觉功能,大大降低了开发成本和难度。
四、运动跟踪原理
运动跟踪是指在视频序列中对目标物体的运动轨迹进行实时监测和记录。其基本原理是通过分析视频帧之间的差异,识别出目标物体的位置变化,并根据这些变化预测目标物体的下一位置。在基于 OpenCV 的运动跟踪中,常用的算法包括光流法、卡尔曼滤波、粒子滤波等。这些算法各有优缺点,开发者需要根据具体的应用场景选择合适的算法。
(一)光流法
光流法是一种基于像素点运动的跟踪算法。它假设在相邻两帧图像中,同一物体上的像素点具有相似的运动趋势。通过计算相邻两帧图像中像素点的亮度变化,光流法可以估计出像素点的运动速度和方向,从而实现目标物体的跟踪。
(二)卡尔曼滤波
卡尔曼滤波是一种基于线性系统状态空间模型的最优估计算法。它通过对系统的状态进行预测和更新,能够有效地处理噪声和不确定性,提高跟踪的准确性和稳定性。在运动跟踪中,卡尔曼滤波常用于预测目标物体的下一位置,为后续的跟踪提供参考。
(三)粒子滤波
粒子滤波是一种基于蒙特卡罗方法的贝叶斯滤波算法。它通过在状态空间中随机采样大量的粒子,并根据观测数据对粒子的权重进行更新,从而实现对目标物体状态的估计。粒子滤波适用于处理非线性、非高斯的系统,在复杂环境下具有较好的跟踪性能。
五、基于 OpenCV 实现运动跟踪的步骤
(一)环境搭建
- 安装 Android Studio:Android Studio 是官方推荐的 Android 开发集成环境,可从官网下载安装。
- 配置 OpenCV 库:下载 OpenCV for Android 库,解压后将其中的
sdk
目录复制到项目的app
目录下。在build.gradle
文件中添加 OpenCV 库的依赖:
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':openCVLibrary3410')
- 添加权限:在
AndroidManifest.xml
文件中添加相机和存储权限:
<uses - permission android:name="android.permission.CAMERA" />
<uses - permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(二)初始化 OpenCV
在MainActivity.java
文件中,重写onCreate
方法,初始化 OpenCV 库:
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;public class MainActivity extends AppCompatActivity {private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {switch (status) {case LoaderCallbackInterface.SUCCESS: {// OpenCV库加载成功}break;default: {super.onManagerConnected(status);}break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (!OpenCVLoader.initDebug()) {// 加载失败时的处理} else {mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);}}@Overrideprotected void onResume() {super.onResume();OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_10, this, mLoaderCallback);}
}
(三)实现运动跟踪
- 获取相机图像:使用
CameraBridgeViewBase
类获取相机图像,并将其传递给 OpenCV 进行处理。在activity_main.xml
文件中添加相机视图:
<org.opencv.android.JavaCameraViewandroid:id="@+id/camera_view"android:layout_width="match_parent"android:layout_height="match_parent" />
在MainActivity.java
文件中,实现JavaCameraView
的回调方法:
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.core.Mat;public class MainActivity extends AppCompatActivity implements CvCameraViewListener2 {private CameraBridgeViewBase mOpenCvCameraView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mOpenCvCameraView = findViewById(R.id.camera_view);mOpenCvCameraView.setCvCameraViewListener(this);}@Overridepublic void onCameraViewStarted(int width, int height) {}@Overridepublic void onCameraViewStopped() {}@Overridepublic Mat onCameraFrame(CvCameraViewFrame inputFrame) {Mat frame = inputFrame.rgba();// 在此处进行运动跟踪处理return frame;}
}
- 运动跟踪算法实现:以光流法为例,使用 OpenCV 的
calcOpticalFlowPyrLK
函数实现运动跟踪。首先,在onCreate
方法中初始化光流法所需的参数:
private Mat mGrayFrame;
private Mat mPrevGrayFrame;
private Mat mStatus;
private Mat mError;
private List<Point> mPrevPoints = new ArrayList<>();
private List<Point> mCurrPoints = new ArrayList<>();@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mOpenCvCameraView = findViewById(R.id.camera_view);mOpenCvCameraView.setCvCameraViewListener(this);mGrayFrame = new Mat();mPrevGrayFrame = new Mat();mStatus = new Mat();mError = new Mat();
}
然后,在onCameraFrame
方法中实现光流法的计算:
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {Mat frame = inputFrame.rgba();Imgproc.cvtColor(frame, mGrayFrame, Imgproc.COLOR_RGBA2GRAY);if (mPrevGrayFrame.empty()) {mGrayFrame.copyTo(mPrevGrayFrame);}if (!mPrevPoints.isEmpty()) {Features2d.calcOpticalFlowPyrLK(mPrevGrayFrame, mGrayFrame, mPrevPoints, mCurrPoints, mStatus, mError);int index = 0;for (Point point : mCurrPoints) {if (mStatus.get(index, 0)[0] == 1.0) {Core.circle(frame, point, 3, new Scalar(0, 255, 0), -1);}index++;}mPrevPoints.clear();mPrevPoints.addAll(mCurrPoints);mCurrPoints.clear();}MatOfPoint2f corners = new MatOfPoint2f();Imgproc.goodFeaturesToTrack(mGrayFrame, corners, 100, 0.01, 10);mPrevPoints.addAll(corners.toList());mPrevGrayFrame.release();mPrevGrayFrame = mGrayFrame.clone();return frame;
}
六、代码优化与调试
(一)性能优化
- 减少内存开销:及时释放不再使用的 Mat 对象,避免内存泄漏。
- 优化算法:根据实际应用场景选择更高效的跟踪算法,或对现有算法进行优化。
- 多线程处理:将耗时的计算任务放到子线程中执行,避免阻塞主线程,提高应用的响应速度。
(二)调试技巧
- 日志输出:使用
Log
类输出关键变量的值和程序执行流程,便于定位问题。 - 断点调试:在 Android Studio 中设置断点,逐行调试代码,观察变量的变化情况。
- 图像可视化:将处理后的图像保存到本地或显示在界面上,直观地查看跟踪效果。
七、应用案例与前景展望
(一)应用案例
- 安防监控:实时跟踪监控画面中的人员和物体,及时发现异常行为。
- 智能交通:跟踪车辆和行人的运动轨迹,实现交通流量监测和智能驾驶辅助。
- 增强现实:在 AR 应用中,准确跟踪用户的动作和周围环境,提供更沉浸式的体验。
(二)前景展望
随着 AI 技术的不断发展和 Android 设备性能的进一步提升,基于 OpenCV 的运动跟踪技术将在更多领域得到应用。未来,我们有望看到更精准、更智能的运动跟踪算法,以及与其他 AI 技术(如深度学习)的深度融合,为用户带来更加丰富和便捷的体验。
八、参考链接
OpenCV官方文档
相关文章:
【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪
文章目录 【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪一、引言二、Android 开发与 AI 的融合趋势三、OpenCV 简介四、运动跟踪原理(一)光流法(二)卡尔曼滤波(三)粒子滤波 五、基于…...
深入浅出:Python 中的异步编程与协程
引言 大家好,今天我们来聊聊 异步编程 和 协程,这是近年来编程语言领域中的热点话题之一,尤其在 Python 中,它作为一种全新的编程模型,已经成为处理 IO密集型 任务的强力工具。尽管很多人对异步编程望而却步࿰…...
iOS Swift算法之KDF2
后端用Java开发的,用到了org.bouncycastle.crypto.generators.KDF2BytesGenerator,一开始在网上各种搜,没找到相关的接口或第三方库,白白浪费了几天时间,后面才想到照着Java代码自己实现,于是乎参考BaseKDF…...
PyQt6/PySide6 QImage 类
PyQt6/PySide6 QImage 类详解 一、QImage 概述 QImage 是 Qt 框架中用于处理图像数据的核心类,提供: 独立于硬件的图像表示像素级访问和操作多种图像格式支持(PNG/JPEG/BMP等)图像转换和基本处理功能 from PyQt6.QtGui import…...
Java8新特性Optional,Function,Supplier,Consumer
Java8新特性 1.Optional 首先,Optional 它不是一个函数式接口,设计它的目的是为了防止空指针异常(NullPointerException),要知道在 Java 编程中, 空指针异常可是臭名昭著的。 让我们来快速了解一下 Opti…...
腾讯云服务器中Ubuntu18.04搭建python3.7.0与TensorFlow1.15.0与R-4.0.3环境
所有踩过的坑,都化成了这条平坦的路 云服务器配置 基础配置选择竞价实例(便宜/需求小) 选择地区(距离自己近的就行) 实例配置选择异构计算(能力较强,性价比高)根据GPU显存需求选择…...
01.Docker 概述
Docker 概述 1. Docker 的主要目标2. 使用Docker 容器化封装应用程序的意义3. 容器和虚拟机技术比较4. 容器和虚拟机表现比较5. Docker 的组成6. Namespace7. Control groups8. 容器管理工具9. docker 的优缺点10. 容器的相关技术 docker 官网: http://www.docker.com 帮助文档…...
DedeBIZ系统审计小结
之前简单审计过DedeBIZ系统,网上还没有对这个系统的漏洞有过详尽的分析,于是重新审计并总结文章,记录下自己审计的过程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip 📌DedeBIZ 系统并非基于 MVC 框架&…...
docker运行perplexica
序 本文主要研究一下如何用docker运行perplexica 步骤 git clone git clone https://github.com/ItzCrazyKns/Perplexica.gitapp.dockerfile FROM docker.1ms.run/node:20.18.0-alpineARG NEXT_PUBLIC_WS_URLws://127.0.0.1:3001 ARG NEXT_PUBLIC_API_URLhttp://127.0.0.1…...
【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景
文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先,新建一个空的文件夹,然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…...
解决珠玑妙算游戏问题:C 语言实现
一、引言 珠玑妙算游戏(the game of master mind)是一个有趣的逻辑推理游戏。在编程领域,我们可以通过编写代码来模拟游戏中计算猜中与伪猜中次数的过程。本文将详细介绍如何使用 C 语言实现这一功能,并对核心代码进行解析。 二、…...
【清晰教程】本地部署DeepSeek-r1模型
【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面-CSDN博客 目录 Ollama 安装Ollama DeepSeek-r1模型 安装DeepSeek-r1模型 Ollama Ollama 是一个开源工具,专注于简化大型语言模型(LLMs)的本地部署和管理。它允许用户在本地计算机…...
Java/Kotlin 使用 Chrome 无头浏览器
1. 概念 无头浏览器在类似于流行网络浏览器的环境中提供对网页的自动控制,但是通过命令行界面或使用网络通信来执行。 它们对于测试网页特别有用,因为它们能够像浏览器一样呈现和理解超文本标记语言,包括页面布局、颜色、字体选择以及JavaSc…...
AI前端开发:赋能开发者,提升解决实际问题的能力
近年来,人工智能技术飞速发展,深刻地改变着各行各业。在软件开发领域,AI写代码工具的出现更是引发了一场革命,尤其是前端开发领域,AI的应用正在显著提升开发者的解决实际问题的能力。本文将探讨AI前端开发如何提升效率…...
【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)
接着上一篇文章;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询(2)Filter【结果过滤】(3)term(4)Aggregation(执行聚合) (1) bool用来做复合查询 复合语…...
ASP.NET Core SignalR的分布式部署
假设聊天室程序被部署在两台服务器上,客户端1、2连接到了服务器A上的ChatRoomHub,客户端3、4连接到服务器B上的ChatRoomHub,那么客户端1发送群聊消息时,只有客户端1、2能够收到,客户端3、4收不到;在客户端3…...
kafka的架构和工作原理
目录 Kafka 架构 Kafka 工作原理 Kafka 数据流 Kafka 核心特性 总结 Kafka 架构 1. 生产者(Producer) 2. 消费者(Consumer) 3. 主题(Topic) 4. 分区(Partition) 5. 副本(Replica) 6. 代理(Broker) 7. ZooKeeper(旧版本)/KRaft(新版本) Kafka 工作…...
当没有OpenGL时,Skia如何绘制?
Skia 是可以在没有 OpenGL 的情况下进行图形绘制的,但是具体能否成功绘制图形,取决于 Skia 是如何配置的,以及平台上是否提供了其他的底层图形 API。 Skia 的底层依赖 Skia 的目标是提供一种跨平台的 2D 图形绘制接口。为了加速图形渲染&…...
Java小白入门基础知识(一)
1.初识Java java源程序通过javac 编译生成字节码文件,通过java命令运行java程序 总结: 1)在一个Java文件中,只能有一个public class 2)public class一定要和文件名一致 3)类里面包含方法 4)…...
游戏内常见加密
加密只是增大破解难度,没法说绝对安全,避免过度加密导致性能消耗过大。 通用算法库 lua的加密算法库:https://github.com/somesocks/lua-lockbox/tree/master 比如通信协议就用到里面一些算法cry.encrypt 算法优劣:AES加解密-CBC…...
【Java八股文】02-Java集合面试篇
【Java八股文】02-Java集合面试篇 概念数组与集合区别常用集合Java中的线程安全的集合是什么?Collections和Collection的区别 Listjava中list的几种实现把ArrayList变成线程安全的有哪些方法?CopyOnWriteArrayList是如何保证线程安全的? Mapj…...
springCloud-2021.0.9 之 GateWay 示例
文章目录 前言springCloud-2021.0.9 之 GateWay 示例1. GateWay 官网2. GateWay 三个关键名称3. GateWay 工作原理的高级概述4. 示例4.1. POM4.2. 启动类4.3. 过滤器4.4. 配置 5. 启动/测试 前言 如果您觉得有用的话,记得给博主点个赞,评论,收…...
公然上线传销项目,Web3 的底线已经被无限突破
作者:Techub 热点速递 撰文:Yangz,Techub News 今天早些时候,OKX 将上线 PI 的消息在圈内引起轩然大波,对于上线被板上钉钉为传销盘子的「项目」 ,Techub News 联系了 OKX 公关,但对方拒绝置评…...
SQL数据清理:去除字段值中的多余符号(Demo例子)
目录 前言1. 基础2. 进阶 前言 Excel中有大量不合法的符号,导入到系统之后,数据库有很多脏数据,对此下述展开sql的清洗教程 在数据库的文本字段中,可能会存在多余的逗号或符号,如,销售,, 或 二手车,销售,,这种情况 希…...
MongoDB 的使用场景
一、内容管理系统 1. 博客平台 文章内容、作者信息、标签、评论等数据结构多样,MongoDB 的无模式特性可轻松应对。比如 WordPress 等博客系统,使用 MongoDB 能灵活存储不同格式和长度的文章内容,以及与文章相关的各种元数据。 2. 新闻网站…...
STM32 RTC 实时时钟说明
目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…...
微服务SpringCloud Alibaba组件nacos教程【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】
一.Nacos教程 文章目录 一.Nacos教程1.1 Nacos简介1.2 nacos基本使用直接下载打包服务源码方式启动 1.3 创建nacos客服端1.4 nacos集群配置1.5 nacos配置中心 1.1 Nacos简介 nacos是spring cloud alibaba生态中非常重要的一个组件,它有两个作用: 1:注册…...
深度整理总结MySQL——Expalin指南(二)
Expalin指南(二 前言Extrano tables usedImpossible whereNo matching min/max rowUsing indexUsing index conditionUsing whereUsing join buffer (Block Nested Loop)Not existsUsing intersect(...)、Using union(...)和Using sort_union(...)Zero limitUsing filesortUsin…...
【机器学习】常见采样方法详解
在机器学习领域,数据采样(Sampling)是一项至关重要的技术。它不仅影响模型的训练效率,还直接关系到模型的性能与泛化能力。本文将从基础概念出发,逐步深入介绍机器学习中常见的采样方法,帮助读者全面理解并…...
Kubernetes 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
1. 如何在 Kubernetes 中设置资源请求和限制? 资源请求确保容器有最小资源量(CPU/内存),而限制则强制容器消耗的最大资源量。这有助于高效资源分配并防止资源争用。 示例: resources:requests:memory: "256Mi&…...
Python自动化办公之Excel拆分
在日常办公中,我们经常需要将包含多个Sheet页的Excel文件拆分成多个独立的Excel文件。例如,当我们要把一份Excel表格发给各部门确认时,出于控制信息知悉范围、确保数据保密性等方面的考虑,每个部门仅需查看和确认与自己部门对应的…...
Mac上搭建宝塔环境并部署PHP项目
安装Docker Desktop》搭建Centos版本的宝塔环境》部署PHP项目 1. 下载Docker for mac 软件:https://www.docker.com/ 或使用终端命令:brew install --cask --appdir/Applications docker 2. 使用命令安装宝塔环境的centos7系统: docker pul…...
qt 控件的焦点事件
在 Qt 中,设置焦点策略是通过 QWidget 的 setFocusPolicy() 方法来实现的。焦点策略控制了一个控件何时和如何获取焦点。Qt 提供了几种常见的焦点策略,以帮助管理控件的焦点行为。 常见的焦点策略 Qt::NoFocus:控件不接受焦点。Qt::TabFocus&…...
深度学习_学习笔记
pandas Pandas 是一个强大的数据分析库,它封装和集成了多个其他库的功能,以便为用户提供更加便捷的数据处理能力。 pandas与csv 都可用于处理csv文件(注意csv文件不是excel文件) csv 是 Python 标准库的一部分,适合…...
如何在 Elasticsearch 中设置向量搜索 - 第二部分
作者:来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇,深入探讨了向量搜索(也称为语义搜索)的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…...
leetcode 面试经典 150 题:跳跃游戏 II
链接跳跃游戏 II题序号45题型数组题解贪心算法难度中等熟练度✅✅✅ 题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums…...
C++20 新特性解析
1. 概念(Concepts) 概念是 C++20 引入的一项重要特性,它允许程序员定义类型约束,从而在编译时检查模板参数是否符合某些要求。概念提供了模板参数的限制,使得模板代码更加可读和易于维护。 示例代码: #include <iostream> #include <concepts>// 定义一个…...
vue不是内部或外部命令?
问题:当我们在使用脚手架创建项目之前,执行了npm i vue/cli -g或yarn global add vue/cli之后,再执行vue --version无法执行,vue不是内部或外部命令。 前几天在学vue时也是遇到了这个问题,现在来分享一下解决方法。 …...
C#中的Frm_Welcome.Instance.Show(),是什么意思
Frm_Welcome.Instance.Show() 是一种常见的单例模式(Singleton Pattern)实现方式,通常用于在应用程序中确保某个窗体(Form)只有一个实例,并通过该实例显示窗体。以下是对这段代码的详细解释: 代…...
k8s优雅操作pod容器组
k8s优雅操作pod容器组 回退备份 kubectl get deploy deployName -o yaml>>deployName-bak-date "%Y-%m-%d".yaml获取副本数 replicasecho | kubectl get -o template deploy/deployName --template{{.spec.replicas}}停止容器组 kubectl scale deployment …...
【LeetCode: 1760. 袋子里最少数目的球 + 二分】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
动态规划LeetCode-416.分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...
kotlin-kapt
kotlin-kapt kotlin-kapt 是 Kotlin 的一个插件,专门用于处理注解处理器(Annotation Processor)。以下是对该插件的详细解释和指南: kotlin-kapt 是什么? kotlin-kapt 是 Kotlin 官方提供的一个插件,用于在…...
网络安全技术复习总结
1|0第一章 概论 1.网络安全发展阶段包括四个阶段:通信安全、计算机安全、网络安全、网络空间安全。 2.2017年6月1日,我国第一部全面规范网络空间安全的基础性法律《中华人民共和国网络安全法》正式实施。 3.2021年 6月10日,《中华人民共和…...
java 集合
Java集合框架(Java Collections Framework)是一个强大的工具库,旨在简化数据存储和操作的任务。它提供了一组接口、类和算法,帮助开发者高效地管理数据,如列表、集合和映射。下面是Java集合框架的详细介绍:…...
Java常见排序算法及代码实现
1、选择排序算法 选择排序(Selection Sort)是一种简单直观的排序算法,它的工作原理是每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。 2、冒泡排序算法 冒泡排序(Bubble…...
130,[1] 攻防世界 very_easy_sql
进入靶场 典型SQL注入页面 先查看源码 访问 试试http://127.0.0.1/ 还尝试了其他都是nonono 回归第一个登录页面 提交的内容不在url处显示,反而第二个url页面会在url处显示 明白第一个页面是通过post方式提交,反正没得到什么信息,去抓…...
Spring Boot从入门到精通:核心知识点+实战指南
目录 一、Spring Boot 是什么?为什么它如此流行? 二、快速创建你的第一个Spring Boot应用 2.1 使用Spring Initializr生成项目 2.2 核心代码示例 三、深度解析Spring Boot核心机制 3.1 自动配置原理揭秘 3.2 自定义Starter实战 四、生产环境必备…...
深入探索现代CSS:从基础到未来趋势
引言:CSS的进化之路 CSS(层叠样式表)自1996年诞生以来,已从简单的样式描述语言发展为构建现代Web体验的核心技术。截至2023年,超过98%的网站使用CSS3技术,其发展历程见证了Web从静态文档到富交互应用的蜕变…...
python-leetcode 23.反转链表
题目: 给单链表的头节点,反转链表,并返回反转后的链表。 方法一:迭代 在遍历链表时,将当前节点的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此要先存储前一个节点,在更改引…...