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

YOLO检测目标后实现距离测量

当我们使用YOLO检测器得到检测结果后,我们如何计算检测的物体距离相机的位置呢?
目前,有三种较为主流的距离计算方法,分别是单目测距、双目测距以及基于深度估计的测距方法。

单目测距

工作原理:单目测距使用一个摄像头来估计物体的距离。由于只有一个视角,无法直接计算深度信息,因此单目测距依赖于一些假设或先验知识,如物体的尺寸、颜色、纹理等特征。

优点: 简单且成本低。 易于部署和维护。
缺点: 准确度较低,因为缺乏直接的空间信息。 对环境和目标物体有特定要求,例如需要知道物体的实际大小。

应用场景:常用于简单场景下的距离估算,比如在已知背景环境中跟踪移动对象。

借助YOLO目标检测方法,计算检测到的物体距离:

from ultralytics import YOLO
import cv2# 已知参数:不同类别的真实宽度(单位:米)
KNOWN_WIDTHS = {0: 0.5,  # 均压环1: 0.5,  # 复合绝缘子2: 0.06,   # 挂点金具3: 0.5,   # 玻璃绝缘子4: 0.2,   # 连接金具5: 1,   # '避雷器6: 0.2,   # 防震锤
}# 不同类别的颜色(BGR 格式)
COLORS = {0: (0, 255, 0),  # 绿色1: (255, 0, 0),  # 蓝色2: (0, 0, 255),   # 红色3: (0, 225, 255),   # 红色4: (0, 128, 255),   # 红色5: (128, 0, 255),   # 红色6: (3, 0, 128)   # 红色
}# 相机焦距(单位:像素)
FOCAL_LENGTH = 4032def calculate_distance(known_width, focal_length, pixel_width):"""根据目标的真实宽度、相机焦距和目标在图像中的像素宽度,计算目标与相机的距离。"""return (known_width * focal_length) / pixel_widthdef adjust_exposure(image):"""使用CLAHE技术调整图像的曝光度。"""# 将图像转换为Lab色彩空间,以便单独处理亮度通道lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)l_channel, a_channel, b_channel = cv2.split(lab_image)# 应用CLAHE到L通道clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))cl = clahe.apply(l_channel)# 合并处理后的L通道和其他两个通道updated_lab_image = cv2.merge((cl, a_channel, b_channel))# 将Lab图像转换回BGR色彩空间adjusted_image = cv2.cvtColor(updated_lab_image, cv2.COLOR_LAB2BGR)return adjusted_imagedef adjust_exposure(image):"""使用CLAHE技术调整图像的曝光度。"""# 将图像转换为Lab色彩空间,以便单独处理亮度通道lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)l_channel, a_channel, b_channel = cv2.split(lab_image)# 应用CLAHE到L通道clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))cl = clahe.apply(l_channel)# 合并处理后的L通道和其他两个通道updated_lab_image = cv2.merge((cl, a_channel, b_channel))# 将Lab图像转换回BGR色彩空间adjusted_image = cv2.cvtColor(updated_lab_image, cv2.COLOR_LAB2BGR)return adjusted_image# 加载模型
model = YOLO("D:\project_mine\detection/ultralytics/runs\detect/train2\weights/best.pt")  # 预训练的 YOLO11n 模型# 读取原始图像
original_img = cv2.imread("images/test2.JPG")# 创建一个副本用于显示(调整曝光度)
adjusted_img = adjust_exposure(original_img.copy())# 使用调整后的图像进行目标检测
results = model(adjusted_img)  # 使用调整后的图像进行推理# 处理结果
for result in results:# 在原始图像上获取边界框坐标 (x1, y1, x2, y2)boxes = result.boxes  # 获取边界框对象cls_list = result.boxes.cls  # 获取类别 ID 列表for box, cls in zip(boxes, cls_list):cls = int(cls)  # 转换为整数类别 ID# 获取边界框坐标 (x1, y1, x2, y2)x1, y1, x2, y2 = map(int, box.xyxy[0])  # 提取单个边界框的坐标# 计算目标在原始图像中的宽度(像素)pixel_width = x2 - x1# 根据类别获取真实宽度known_width = KNOWN_WIDTHS.get(cls, 0.1)  # 默认宽度为 0.1 米(如果类别未定义)# 计算目标与相机的距离if pixel_width > 0:  # 确保像素宽度有效distance = calculate_distance(known_width, FOCAL_LENGTH, pixel_width)# 根据类别获取颜色color = COLORS.get(cls, (255, 255, 255))  # 默认颜色为白色# 在调整后的图像上绘制检测框cv2.rectangle(adjusted_img, (x1, y1), (x2, y2), color, 2)# 构造标注文本label = f"Class {cls}, Dist: {distance:.2f}m"# 计算文字放置位置(置于框内中心位置偏上一点)text_size, _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.9, 2)text_x = x1 + (x2 - x1 - text_size[0]) // 2  # 文字X坐标:框内居中text_y = y1 + (y2 - y1) // 2  # 文字Y坐标:框内垂直居中# 在检测框中央添加标注信息cv2.putText(adjusted_img, label, (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)else:print(f"无法计算距离:类别 {cls} 的目标宽度无效")# 保存带有标注的图片cv2.imwrite("调整曝光测距.jpg", adjusted_img)

双目测距

工作原理:双目测距模仿人类视觉系统,使用两个摄像头同时拍摄同一场景,通过比较两幅图像中的差异(视差)来计算每个点的深度信息。视差越大,物体越近;反之亦然。

优点: 相对准确,能够提供较为精确的深度信息。 不需要预先知道物体的具体信息。
缺点: 需要精确校准两个摄像头的位置关系。在低纹理区域或遮挡情况下性能下降。 成本较高,因为需要两个高质量的摄像头。

应用场景:适用于自动驾驶汽车、机器人导航等领域,其中精确的距离测量至关重要。

import cv2
import numpy as np
from ultralytics import YOLO# 辅助函数:计算距离
def calculate_distance(disparity, focal_length, baseline):"""根据视差计算目标距离"""return (focal_length * baseline) / disparity# 辅助函数:查找视差(简化实现)
def find_disparity(center_x, center_y, left_img, right_img):"""通过左右图像匹配点计算视差"""# 提取左图像和右图像的特征区域(简化实现:直接比较灰度值)gray_left = cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY)gray_right = cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY)# 固定搜索范围(假设目标不会偏离太多)search_range = 50  # 搜索范围为 50 像素min_error = float('inf')best_match_x = center_xfor offset in range(-search_range, search_range + 1):match_x = center_x + offsetif 0 <= match_x < gray_right.shape[1]:error = np.sum(np.abs(gray_left[center_y, center_x] - gray_right[center_y, match_x]))if error < min_error:min_error = errorbest_match_x = match_x# 视差为水平位移disparity = abs(center_x - best_match_x)return disparity# 假设已知的参数
FOCAL_LENGTH =448 # 焦距(单位为像素)
BASELINE = 0.03    # 基线长度(单位为米)
model = YOLO("yolo11n.pt")  # 预训练的 YOLO11n 模型
#model = YOLO("D:\project_mine\detection/ultralytics/runs\detect/train2\weights/best.pt")
# 读取左右图像
left_img = cv2.imread("images/right.jpg")
right_img = cv2.imread("images/left.jpg")# 使用调整后的左图像进行目标检测
results = model(left_img)  # 使用 YOLO 模型进行推理# 处理结果
for result in results:boxes = result.boxes  # 获取边界框对象for box in boxes:# 获取边界框坐标 (x1, y1, x2, y2)x1, y1, x2, y2 = map(int, box.xyxy[0])  # 提取单个边界框的坐标# 计算目标在左图像中的中心点center_x = (x1 + x2) // 2center_y = (y1 + y2) // 2# 在右图像中寻找对应的匹配点(简化实现:假设同一行)disparity = find_disparity(center_x, center_y, left_img, right_img)if disparity > 0:  # 确保视差有效# 计算目标与相机的距离distance = calculate_distance(disparity, FOCAL_LENGTH, BASELINE)# 在调整后的左图像上绘制检测框color = (0, 255, 0)  # 固定颜色为绿色cv2.rectangle(left_img, (x1, y1), (x2, y2), color, 2)# 构造标注文本label = f"Dist: {distance:.2f}m"# 计算文字放置位置(置于框内中心位置偏上一点)text_size, _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.9, 2)text_x = x1 + (x2 - x1 - text_size[0]) // 2  # 文字X坐标:框内居中text_y = y1 + (y2 - y1) // 2  # 文字Y坐标:框内垂直居中# 在检测框中央添加标注信息cv2.putText(left_img, label, (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)else:print("无法计算距离:视差无效")# 保存带有标注的图片
cv2.imwrite("left_with_annotations.jpg", left_img)

在这里插入图片描述

深度估计测距

工作原理:深度估计通常是基于深度学习的方法,利用神经网络从单一图像或立体图像中预测出每个像素对应的深度值。这种方法可以被视为一种高级形式的单目测距,但它不依赖于具体的物理测量,而是通过学习大量的标记数据来“理解”图像中的深度线索。

优点: 可以从单张图像中推断出深度信息,灵活性高。 随着模型训练数据量的增加和技术进步,准确性不断提高。
缺点:计算资源需求大,尤其是在实时应用中。 模型训练复杂,需要大量的标注数据。

应用场景:广泛应用于增强现实(AR)、虚拟现实(VR)、3D重建等需要高精度深度信息的领域。
下面这个是借助 torch 中自带的 MiDaS深度估计模型进行距离测算。

import cv2
import torch
from ultralytics import YOLO# 加载 YOLO11 模型
yolo_model_path = "yolo11n.pt"  # 替换为您的 YOLO11 模型路径
yolo_model = YOLO(yolo_model_path)# 加载深度估计模型(例如 MiDaS)
midas_model_type = "MiDaS_small"  # 可选模型类型
midas = torch.hub.load("intel-isl/MiDaS", midas_model_type)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
midas.to(device)
midas.eval()# 预处理变换
transform = torch.hub.load("intel-isl/MiDaS", "transforms")
if midas_model_type == "DPT_Large":transform = transform.dpt_transform
else:transform = transform.small_transform# 标定参数(根据实验调整)
scale_factor = 100  # 根据标定得到的比例因子
offset = 2.0         # 根据标定得到的偏移量# 打开视频流
cap = cv2.VideoCapture(0)  # 使用摄像头,或者替换为视频文件路径
cv2.namedWindow("YOLO11 Depth Estimation")while cap.isOpened():ret, frame = cap.read()if not ret:print("无法读取视频帧!")break# 使用 YOLO11 进行目标检测results = yolo_model(frame)annotated_frame = results[0].plot()  # 绘制检测结果# 使用 MiDaS 进行深度估计input_batch = transform(frame).to(device)with torch.no_grad():prediction = midas(input_batch)prediction = torch.nn.functional.interpolate(prediction.unsqueeze(1),size=frame.shape[:2],mode="bicubic",align_corners=False,).squeeze()depth_map = prediction.cpu().numpy()depth_map = cv2.normalize(depth_map, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)# 对每个检测到的目标计算距离for box in results[0].boxes:x1, y1, x2, y2 = map(int, box.xyxy[0])  # 获取边界框坐标center_x, center_y = (x1 + x2) // 2, (y1 + y2) // 2  # 计算中心点depth_value = depth_map[center_y, center_x]  # 获取中心点的深度值distance = (scale_factor / (depth_value + offset)) # 计算实际距离# 在图像上绘制距离信息cv2.circle(annotated_frame, (center_x, center_y), 5, (0, 0, 255), -1)  # 标记中心点cv2.putText(annotated_frame, f"{distance:.2f}m", (x1, y1 - 20),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1)# 显示结果cv2.imshow("YOLO11 Depth Estimation", annotated_frame)# 按下 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

总结

相较而言,单目测距依赖与经验值,而深度估计测距则依赖模型性能,综上双目测距的方式无论是在速度方面还是精度方面都能有较好的表现。

相关文章:

YOLO检测目标后实现距离测量

当我们使用YOLO检测器得到检测结果后&#xff0c;我们如何计算检测的物体距离相机的位置呢&#xff1f; 目前&#xff0c;有三种较为主流的距离计算方法&#xff0c;分别是单目测距、双目测距以及基于深度估计的测距方法。 单目测距 工作原理&#xff1a;单目测距使用一个摄像…...

js 效果展示 拿去练手

自学完整功能&#xff0c;拿去练手。 鼠标移动放大 通过网盘分享的文件&#xff1a;图片放大 链接: https://pan.baidu.com/s/1w8SjtKi4kUNDnZtRDfYMeQ?pwd95p6 提取码: 95p6 通过网盘分享的文件&#xff1a;图片动画效果 链接: https://pan.baidu.com/s/1Pjphx-Cc4HQQNNujr…...

【算法】 欧拉函数与欧拉降幂 python

欧拉函数 欧拉函数 ϕ ( n ) \phi(n) ϕ(n) 表示小于等于 n 的正整数中与 n 互质的数的个数。即&#xff1a; ϕ ( n ) ∣ { k ∈ Z ∣ 1 ≤ k ≤ n , gcd ⁡ ( k , n ) 1 } ∣ \phi(n) \left| \{ k \in \mathbb{Z}^ \mid 1 \leq k \leq n, \gcd(k, n) 1 \} \right| ϕ(n)…...

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标&#xff0c;qt设置&#xff0c;可以在只启动HMI的时候隐藏光标&#xff0c;退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…...

QT聊天项目DAY01

1.新建初始项目 2.修改UI格式 运行效果 3.创建登录界面 设计登录界面UI 设计布局 调整布局间距 往水平布局中拖入标签和文本输入框 更换控件名称并固定高度 添加窗口部件 往现有的资源文件中导入图片 添加水平布局 4.设置登陆界面为主窗口的核心组件 #pragma once#include &l…...

Stable Diffusion +双Contronet:从 ControlNet 边缘图到双条件融合:实现服装图像生成的技术演进——项目学习记录

前言 学习记录contronet优化&#xff1a;最近&#xff0c;我基于 diffusers 库的 ControlNet&#xff0c;探索了如何通过 Canny 边缘图控制服装图像生成&#xff0c;并逐步升级到融合颜色图的双条件模型。有不断的问题、解决和进步&#xff0c;从最初的边缘图生成到最终实现 2…...

【Hadoop入门】Hadoop生态之Spark简介

1 什么是Spark&#xff1f; Apache Spark 是一个开源的分布式计算框架&#xff0c;专为处理大规模数据而设计。它提供了高效、通用的集群计算能力&#xff0c;支持内存计算&#xff0c;能够显著提高数据处理和分析的速度。Spark 已经成为大数据处理领域的重要工具&#xff0c;广…...

深度学习学习笔记

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…...

小米运维面试题及参考答案(80道面试题)

请讲解一下 linux top 后进程的状态 在 Linux 系统中,使用top命令可以查看系统中正在运行的进程的相关信息,进程通常有以下几种状态: 运行(R):表示进程正在 CPU 上运行或者正在运行队列中等待运行。处于运行状态的进程正在积极地使用 CPU 资源来执行其任务。睡眠(S):进…...

动态多目标优化:基于可学习预测的动态多目标进化算法(DIP-DMOEA)求解CEC2018(DF1-DF14),提供MATLAB代码

一、DIP-DMOEA介绍 基于可学习预测的动态多目标进化算法&#xff08;Learning-Based Directional Improvement Prediction for Dynamic Multiobjective Optimization&#xff0c;DIP-DMOEA&#xff09;是2024年提出的一种动态多目标进化算法&#xff0c;核心在于利用神经网络学…...

第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组

由于官方没有公布题目的数据, 所以代码仅供参考 1. 移动距离 题目链接&#xff1a;P12130 [蓝桥杯 2025 省 B] 移动距离 - 洛谷 【问题描述】 小明初始在二维平面的原点&#xff0c;他想前往坐标 (233, 666)。在移动过程中&#xff0c;他 只能采用以下两种移动方式&#xf…...

《Nature Methods》新算法|MARBLE利用几何深度学习解释神经群体动力学

一、写在前面 本次分享的是2025年2月发布于《Nature Methods》的题为"MARBLE:interpretable representations of neural population dynamics using geometric deep learning"的文章。在神经科学和机器学习领域交汇的今天&#xff0c;我们不断探索如何从复杂的神经活…...

【力扣hot100题】(093)最长公共子序列

还算是挺简单的一题。 维护二维数组代表截至至两个字符串的某个位置&#xff0c;前面的最长公共子序列长度。 状态转移方程就是当两字符相等是&#xff0c;取俩位置前一个的值加一&#xff0c;否则就直接等于俩位置前一个值。 class Solution { public:int longestCommonSub…...

(打卡)794. 高精度除法

C&#xff1a; Python&#xff1a; aint(input()) bint(input()) print(a//b) print(a%b)...

网络5 TCP/IP 虚拟机桥接模式、NAT、仅主机模式

TCP/IP模型 用于局域网和广域网&#xff1b;多个协议&#xff1b;每一层呼叫下一层&#xff1b;四层&#xff1b;通用标准 TCP/IP模型 OSI七层模型 应用层 应用层 表示层 会话层 传输层 传输层 网络层 网络层 链路层 数据链路层 物理层 链路层&#xff1a;传数据帧&#xff0…...

GPU虚拟化技术在深度学习集群中的应用实践

一、深度学习集群的算力困境 某些985高校AI实验室曾面临典型算力管理难题&#xff1a;其配备的4台8卡A100服务器&#xff08;总价值超300万元&#xff09;实际利用率仅38%。学生提交的PyTorch任务常因GPU抢占导致训练中断&#xff0c;而部分研究组独占显卡却仅运行Jupyter Not…...

从零实现基于扩散模型的文本到视频生成系统:技术详解与Pytorch代码实现

本文详细介绍了基于扩散模型构建的文本到视频生成系统&#xff0c;展示了在MSRV-TT和Shutterstock视频标注数据集上训练的模型输出结果。以下是模型在不同提示词下的生成示例。 首先展示一些模型生成效果展示 提示词&#xff1a;“A person holding a camera”&#xff08;训练…...

每天学一个 Linux 命令(14):cat

Linux 文件查看与合并命令:cat cat(全称 concatenate)是 Linux 中用于查看文件内容、合并文件或创建简单文件的基础命令。它操作简单但功能灵活,是日常文件处理的常用工具。 1. 命令作用 查看文件内容:直接输出文件内容到终端。合并文件:将多个文件内容合并输出或保存到…...

05--MQTT物联网协议

一、MQTT的概念 MQTT 协议快速入门 2025&#xff1a;基础知识和实用教程 | EMQ 1.MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它…...

免费下载 | 2025天津大学:智能制造与数字孪生技术:面向可持续制造方向发展

一、新一代智能制造模式下的思考 当代智能制造的发展阶段 智能制造定义&#xff1a;智能制造是基于新一代信息通信技术与先进制造技术深度融合&#xff0c;贯穿于设计、生产、管理、服务等制造活动的各个环节&#xff0c;具有自感知、自学习、自决策、自执行、自适应等功能的新…...

考研单词笔记 2025.04.12

aware a知道的&#xff0c;意识到的&#xff0c;警觉的 awareness n意识&#xff0c;了解&#xff0c;觉察 conscious a有意识的&#xff0c;意识到的&#xff0c;有意的&#xff0c;刻意的&#xff0c;神志清醒的&#xff0c;慎重的&#xff0c;关注的 unconscious a无意识…...

八股总结(Java)持续更新!

八股总结&#xff08;java&#xff09; ArrayList和LinkedList有什么区别 ArrayList底层是动态数组&#xff0c;LinkedList底层是双向链表&#xff1b;前者利于随机访问&#xff0c;后者利于头尾插入&#xff1b;前者内存连续分配&#xff0c;后者通过指针连接多块不连续的内存…...

SpringBoot3快速入门笔记

springboot3简介 SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用&#xff08;说明&#xff1a;SpringBoot底层是Spring&#xff09; 大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术 特性&#xff1a; ● 快速创建…...

vue3中,element-plus中el-input的v-model和value的用法示例

el-input的v-model&#xff0c;邦定响应式变量 <el-col :span"6"><el-form-item label"检验类别" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…...

python求π近似值

【问题描述】用公式π/4≈1-1/31/5-1/7..1/(2*N-1).求圆周率PI的近似值。 从键盘输入一个整数N值&#xff0c;利用上述公式计算出π的近似值&#xff0c;然后输出π值&#xff0c;保留小数后8位。 【样例输入】1000 【样例输出】3.14059265 def countpi(N):p0040nowid0for i i…...

Gerapy二次开发:搜索器组件设计开发与应用(Vue父子组件通信)

搜索器组件设计开发与应用 写在前面搜索器字段定义与样式设计具体实现components/Search.vuedeploy/Index.vue后端views.py运行效果总结欢迎加入Gerapy二次开发教程专栏! 本专栏专为新手开发者精心策划了一系列内容,旨在引领你深入探索Gerapy框架的二次迭代之旅。 本专栏将全…...

深入解析Python爬虫技术:从基础到实战的功能工具开发指南

一、引言:Python 爬虫技术的核心价值 在数据驱动的时代,网络爬虫作为获取公开数据的重要工具,正发挥着越来越关键的作用。Python 凭借其简洁的语法、丰富的生态工具以及强大的扩展性,成为爬虫开发的首选语言。根据 Stack Overflow 2024 年开发者调查,68% 的专业爬虫开发者…...

Python爬虫-爬取全球股市涨跌幅和涨跌额数据

前言 本文是该专栏的第52篇,后面会持续分享python爬虫干货知识,记得关注。 本文中,笔者将基于Python爬虫,实现批量采集全球股市行情(亚洲,美洲,欧非,其他等)的各股市“涨跌幅”以及“涨跌额”数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。…...

【NLP 59、大模型应用 —— BPE 算法】

你和生生不息的河流&#xff0c;生动了我人生中的美好瞬间 —— 25.4.11 一、词表的构造问题 为了nlp模型训练&#xff0c;词表&#xff08;字表&#xff09;是必要的 统计训练语料中的所有字符&#xff08;或词&#xff09;是一种做法&#xff0c;但是容易出现一些问题&…...

SQL基础入门:从CRUD到JOIN再到索引(通俗易懂版)

一、为什么需要SQL&#xff1f; 想象你在管理一个图书馆&#xff1a; 传统方法&#xff1a;手动记录每本书的位置、借阅者、归还日期SQL方法&#xff1a;用数据库系统自动管理&#xff0c;快速查询《Java编程思想》在哪个书架 SQL&#xff08;Structured Query Language&…...

系统编程1(进程的概念与原理)

进程的概念与原理 计算机组成部分一般遵循冯诺依曼结构&#xff0c;也就是由控制器、运算器、存储器、输入设备、输出设备五个部分组成。 ⦁ 程序的编译 一般在编写出程序之后&#xff0c;并不能直接运行&#xff0c;而是需要把程序通过编译器进行编译&#xff0c;生成可执行…...

Git基础知识

Git基础知识 目录 一、Git简介 1.1 什么是Git&#xff1f;1.2 基本概念1.3 Git与其他版本控制系统的区别 二、Git安装与配置 2.1 安装Git2.2 基础配置2.3 高级配置2.4 多账户配置 三、基本操作 3.1 创建仓库3.2 基本工作流3.3 分支操作3.4 查看历史 四、高级操作 4.1 撤销修改…...

【Flink运行时架构】核心组件

在Flink的运行架构中&#xff0c;有两大比较重要的组件&#xff1a;作业管理器&#xff08;JobManager&#xff09;和任务管理器&#xff08;TaskManager&#xff09;。 Flink的作业提交与任务处理时的系统如下图所示。 其中&#xff0c;客户端并不是处理系统的一部分&#xff…...

【区块链安全 | 第四十篇】合约审计之delegatecall(二)

文章目录 漏洞代码代码分析攻击流程攻击代码前文重现修复建议审计思路 在阅读本文之前&#xff0c;请确保已先行阅读&#xff1a;【区块链安全 | 第三十九篇】合约审计之delegatecall&#xff08;一&#xff09; 漏洞代码 存在一漏洞代码如下&#xff1a; // 库合约&#xf…...

Redis实现分布式定时任务

设计思路 任务表示&#xff1a;每个任务通过一个特定格式的键来表示。键名可以包含任务ID等信息&#xff0c;值可以是任务的具体内容或指向任务详情的引用。过期机制&#xff1a;利用Redis的EXPIRE命令为任务设置过期时间&#xff0c;当到达设定的时间点时&#xff0c;Redis会…...

ERC20合约的基本调用

文章目录 ERC20合约的基本调用合约功能compile.js 代码读取文件 进行合约编译获取二进制对象导出对象 index.js 代码编译合约读取私钥设置收款账户构造 web3 对象获取账户地址获取 abi 和 bin创建合约交易部署合约构造转账交易验证转账后余额 测试项目目录执行查询 ERC20合约的…...

『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解

『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解 Pod 结构 每个 Pod 中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类 用户程序所在的容器&#xff0c;数量可多可少Pause 容器&#xff0c;这是每个 Pod 都会有的一个根容器&#xff0c;它的作用有两个 可…...

【React框架】什么是 Vite?如何使用vite自动生成react的目录?

什么是 Vite&#xff1f; Vite 是一个基于原生 ES Modules 开发的前端构建工具&#xff0c;由 Evan You&#xff08;Vue 的作者&#xff09;开发。它最大的特点包括&#xff1a; 极速冷启动&#xff1a;因为利用了浏览器原生的 ES Modules&#xff0c;所以在开发时无需等待整…...

JS实现文件点击或者拖拽上传

B站看到了渡一大师课的切片&#xff0c;自己实现了一下&#xff0c;做下记录 效果展示 分为上传前、上传中和上传后 实现 分为两步 界面交互网络请求 源码如下 upload.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset&q…...

【Vue #3】指令补充样式绑定

一、指令修饰符 Vue 的指令修饰符&#xff08;Directive Modifiers&#xff09;是 Vue 模板语法中的重要特性&#xff0c;它们以半角句号 . 开头&#xff0c;用于对指令的绑定行为进行特殊处理 修饰符作用如下&#xff1a; 简化事件处理&#xff08;如阻止默认行为、停止冒泡…...

Vue.js组件安全工程化演进:从防御体系构建到安全性能融合

——百万级流量场景下的安全组件架构与源码级解决方案 文章目录 总起&#xff1a;安全工程化的组件革命 分论&#xff1a; 一、现存组件架构的七宗罪与安全改造路径   1.1 组件生态安全赤字现状   1.2 架构级安全缺陷深度剖析   1.3 性能与安全的死亡螺旋 二、百万级…...

LINUX基础 [二] - Linux常见指令

目录 &#x1f4bb;前言 &#x1f4bb;指令 &#x1f3ae;ls指令 &#x1f3ae;pwd指令 &#x1f3ae;whoami指令 &#x1f3ae;cd指令 &#x1f3ae;clear指令 &#x1f3ae;touch指令 &#x1f3ae;mkdir指令 &#x1f3ae;rmdir指令 &#x1f3ae;rm指令 &#…...

Linux进阶命令

目录 一、touch 1. 基本语法 2. 常用选项 二、which 1. 基本语法 2. 主要功能 3. 常用选项 三、find 1. 基本语法 2. 常用选项和表达式 四、more 1. 基本语法 2. 常用操作 3. 对比 more 和 less 五、grep 1. 基本语法 2. 常用选项 六、wc 1. 基本语法 2. 常…...

【Spring Boot 过滤器】

文章目录 前言一、什么是过滤器 Filter&#xff1f;二、Spring Boot 中使用 Filter 的方式1. 使用 Component 注解2. 使用 FilterRegistrationBean 显式注册 三、自定义过滤器示例1. 引入必要依赖2. 创建一个自定义 Filter3. 使用 FilterRegistrationBean 显式注册 四、多个 Fi…...

SPI通讯的软硬件NSS SSM SSI

学习自记&#xff1a; 1. NSS&#xff08;Slave Select&#xff0c;从设备选择&#xff09;​​ ​​功能​​&#xff1a; NSS是SPI通信中用于选择从设备的信号线。主设备通过拉低NSS信号选中某个从设备&#xff0c;使其参与通信。通信结束后&#xff0c;主设备释放NSS&#…...

Java基础:集合List、Map、Set(超详细版)

集合体系概述 Collection常用方法 补充&#xff1a;addAll() Collection的遍历方式 迭代器 增强for&#xff08;空集合可以&#xff0c;null不可以&#xff09; lambda 集合对象存储对象原理 遍历方式的区别 List集合 特点、特有方法 遍历方式 &#xff08;同上&#xff09…...

vue+leaflet 区域划分_反向遮罩层

leaflet 区域划分_遮罩层 geojson在线生成器网址:(https://datav.aliyun.com/portal/school/atlas/area_selector) 点击前往阿里云geojson生成器 效果图: 实现下面效果,只需要把addSateLayer函数的调用取消掉就好了. //添加遮罩层代码function addMask() {var latlngs;var fe…...

聊一聊原子操作和弱内存序

1、原子操作概念 在并发编程中&#xff0c;原子操作&#xff08;Atomic Operation&#xff09;是实现线程安全的基础机制之一。从宏观上看&#xff0c;原子操作是“不可中断”的单元&#xff0c;但若深入微观层面&#xff0c;其本质是由底层处理器提供的一组特殊指令来保证其原…...

免费送源码:Java+ssm+MySQL 校园二手书销售平台设计与实现 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对校园二手书销售平台等问题&#xff0c;对校…...

DAPP实战篇:使用ethersjs连接智能合约并输入地址查询该地址余额

本系列目录 专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读400次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你…...