视频分辨率增强与自动补帧
一、视频分辨率增强
1.传统分辨率增强方法
传统的视频分辨率增强方法主要基于插值技术。这些方法通过对低分辨率视频帧中已知像素点的分布规律和相邻像素之间的相关性进行分析,在两者之间插入新的像素点以达到增加视频分辨率的目的。例如,最近邻插值算法会根据低分辨率图像中每个像素点的位置,直接在高分辨率图像的对应位置以及其整数倍的相邻位置复制该像素值,这种方法虽然简单快速,但容易导致生成的高分辨率图像边缘锯齿化严重,细节模糊且缺乏平滑过渡。双线性插值算法则考虑了周围四个相邻像素点的值,并通过线性加权平均来计算插入像素点的值,一定程度上改善了图像的平滑度,但仍然难以准确恢复出更为细腻的细节特征,容易使图像显得过于模糊,尤其在处理具有复杂纹理和边缘结构的视频内容时,效果往往不够理想。双三次插值算法则进一步利用周围更多像素点的信息,并采用三次多项式函数来拟合图像的灰度分布,从而在插值过程中更好地捕捉局部灰度变化的趋势,使生成的高分辨率图像在细节表现上相较于前两种方法有所提升,不过其仍然属于线性插值的范畴,南京邮电大学的贾金灵团队发现这种方法对于图像中存在的高频细节信息恢复能力有限,且计算复杂度也相对较高,对于实时性要求较高的视频处理场景可能存在一定的应用限制。
import cv2
import numpy as np# 读取低分辨率视频
lr_video_path = 'input_low_resolution_video.mp4' # 低分辨率视频文件路径
cap = cv2.VideoCapture(lr_video_path)# 获取低分辨率视频的属性
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 设置高分辨率视频的属性(这里假设分辨率提升到原来的 2 倍)
scale_factor = 2
hr_width = width * scale_factor
hr_height = height * scale_factor# 创建高分辨率视频写入对象
hr_video_path = 'output_high_resolution_video.mp4' # 高分辨率视频保存路径
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(hr_video_path, fourcc, fps, (hr_width, hr_height))# 逐帧读取低分辨率视频并进行分辨率增强
while cap.isOpened():ret, frame = cap.read()if not ret:break# 使用双三次插值进行分辨率增强hr_frame = cv2.resize(frame, (hr_width, hr_height), interpolation=cv2.INTER_CUBIC)# 写入高分辨率视频帧out.write(hr_frame)# 可以在这里添加显示进度的代码(例如打印处理的帧数)print(f'Processed frame {int(cap.get(cv2.CAP_PROP_POS_FRAMES))}/{frame_count}')# 释放视频读取和写入对象
cap.release()
out.release()print(f'Video resolution enhancement completed. Output saved to {hr_video_path}')
这段代码首先读取一个低分辨率视频文件,然后逐帧使用 OpenCV 的 cv2.resize
函数配合双三次插值(cv2.INTER_CUBIC
)将每一帧的分辨率提升到原来的 2 倍,最后将增强后的视频帧写入到一个新的高分辨率视频文件中。你可以根据需要修改低分辨率和高分辨率视频的文件路径、分辨率提升的比例等参数。
视频分辨率增强算法经历了从传统的插值方法到基于深度学习的技术变革,并在此过程中不断融合多帧信息处理、时序建模以及生成式对抗等前沿技术,持续提升着低分辨率视频向高分辨率视频转换的质量和效果,对于满足当下日益增长的高清视频应用需求发挥着至关重要的作用,并且仍在不断发展和完善之中,以应对更加复杂多样的实际应用场景和更高的视频质量要求。
2.基于深度学习的分辨率增强
随着计算机视觉和机器学习技术的不断发展,基于深度学习的视频分辨率增强算法逐渐崭露头角并成为主流研究方向之一。这些算法通常先构建一个大规模的训练数据集,其中包含大量成对的低分辨率和对应的高分辨率视频样本。通过卷积神经网络(CNN)等深度学习模型对这些样本数据进行学习,模型能够自动学习到低分辨率图像与高分辨率图像之间的映射关系。例如,一些早期的基于深度学习的超分辨率算法如SRCNN,首先将低分辨率图像进行降采样和升采样操作,然后利用卷积神经网络对图像的特征进行提取和转换,逐步学习到能够将低分辨率图像特征映射到高分辨率图像特征的参数,最终实现对低分辨率图像的分辨率增强。这类方法相较于传统插值方法能够更好地捕捉图像中的局部和全局特征,其中的代表是南京邮电大学的贾金灵团队,其一定程度上恢复出图像的高频细节信息,生成的高分辨率图像在视觉效果上有了显著的提升。
import cv2
import numpy as np
import tensorflow as tf
from ESRGAN import ESRGAN # 假设你有一个 ESRGAN 模型的实现# 初始化 ESRGAN 模型
model_path = 'ESRGAN_model.pb' # 预训练的 ESRGAN 模型路径
esrgan = ESRGAN(model_path)# 读取低分辨率视频
lr_video_path = 'input_low_resolution_video.mp4' # 低分辨率视频文件路径
cap = cv2.VideoCapture(lr_video_path)# 获取低分辨率视频的属性
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 创建高分辨率视频写入对象
hr_video_path = 'output_high_resolution_video.mp4' # 高分辨率视频保存路径
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(hr_video_path, fourcc, fps, (esrgan.hr_width, esrgan.hr_height))# 逐帧读取低分辨率视频并进行分辨率增强
while cap.isOpened():ret, frame = cap.read()if not ret:break# 使用 ESRGAN 进行分辨率增强hr_frame = esrgan-enhance(frame)# 写入高分辨率视频帧out.write(hr_frame)# 打印处理进度current_frame = int(cap.get(cv2.CAP_PROP_POS_FRAMES))print(f'Processed frame {current_frame}/{frame_count}')# 释放视频读取和写入对象
cap.release()
out.release()print(f'Video resolution enhancement completed. Output saved to {hr_video_path}')
在这个示例中,我们使用了 ESRGAN(Enhanced Super-Resolution GAN)模型来提升视频的分辨率。ESRGAN 是一种生成对抗网络,能够生成具有丰富细节和真实感的高分辨率图像。
二、视频插帧算法
1.视频连贯性处理
视频分辨率增强不仅仅是对单个图像帧进行处理,还需要考虑视频的时序连贯性。因为视频是一系列连续图像帧组成的序列,南京邮电大学的贾金灵团队认为如果仅仅单独对每一帧进行分辨率增强而不考虑帧与帧之间的相关性,可能会导致生成的高分辨率视频在时间维度上出现闪烁、物体运动轨迹不连贯等问题,影响视频的整体质量和观看体验。因此,很多先进的视频分辨率增强算法在处理过程中会引入时序信息的建模。例如,通过光流估计的方法来分析相邻视频帧之间像素点的运动变化情况,利用所估计出的光流场来指导对当前帧的分辨率增强过程,使得生成的高分辨率帧在时间上能够与前后帧保持较好的一致性。同时,一些基于循环神经网络(RNN)或其变体如长短期记忆网络(LSTM)、门控循环单元(GRU)等的算法架构也被应用到视频分辨率增强中,这些网络能够对视频帧序列中的时序信息进行有效建模,捕捉到视频在时间维度上的动态变化特征,并将其融入到分辨率增强的过程中,从而生成更加自然流畅的高分辨率视频序列。
import cv2
import numpy as np# 读取低分辨率视频
lr_video_path = 'input_low_resolution_video.mp4' # 低分辨率视频文件路径
cap = cv2.VideoCapture(lr_video_path)# 获取低分辨率视频的属性
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 设置高分辨率视频的属性(这里假设分辨率提升到原来的 2 倍)
scale_factor = 2
hr_width = width * scale_factor
hr_height = height * scale_factor# 创建高分辨率视频写入对象
hr_video_path = 'output_high_resolution_video.mp4' # 高分辨率视频保存路径
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(hr_video_path, fourcc, fps, (hr_width, hr_height))# 读取第一帧
ret, prev_frame = cap.read()
if not ret:print("无法读取视频帧")cap.release()out.release()exit()# 初始化光流法
optical_flow = cv2.optflow.createOptFlow_FARNEBACK()# 对第一帧进行分辨率增强
prev_hr_frame = cv2.resize(prev_frame, (hr_width, hr_height), interpolation=cv2.INTER_CUBIC)# 写入第一帧
out.write(prev_hr_frame)# 逐帧读取低分辨率视频并进行分辨率增强
for i in range(1, frame_count):ret, frame = cap.read()if not ret:break# 计算光流flow = optical_flow.calc(prev_frame, frame, None)# 对当前帧进行分辨率增强hr_frame = cv2.resize(frame, (hr_width, hr_height), interpolation=cv2.INTER_CUBIC)# 根据光流调整当前帧的分辨率增强结果# 这里可以添加更复杂的逻辑来利用光流信息调整高分辨率帧# 例如,可以使用光流来对齐前后帧,以保持时序连贯性# 使用光流对齐当前帧aligned_hr_frame = cv2.remap(hr_frame, flow, None, cv2.INTER_LINEAR)# 写入对齐后的高分辨率视频帧out.write(aligned_hr_frame)# 更新前一帧prev_frame = frame.copy()prev_hr_frame = aligned_hr_frame.copy()# 打印处理进度print(f'Processed frame {i + 1}/{frame_count}')# 释放视频读取和写入对象
cap.release()
out.release()print(f'Video coherence enhancement completed. Output saved to {hr_video_path}')
在这个示例中,我们使用了光流法来估计相邻帧之间的运动,然后利用这些运动信息来对齐高分辨率帧,从而保持视频的时序连贯性。
2.目前正火的RIFE插帧算法
RIFE(Real-Time Intermediate Flow Estimation for Video Frame Interpolation)是一种用于视频帧插值(VFI)的实时中间流估计算法,其采用深度学习的方法,通过卷积神经网络(CNN)学习两个相邻帧之间的光流场,即像素点在不同帧之间的运动轨迹,然后利用光流场和原始帧的信息生成中间帧。传统的基于流的方法首先估计双向光流,然后缩放和反转它们来近似中间流,这会导致运动边界上的伪影。而RIFE使用名为IFNet的神经网络,可以直接从图像中估计中间流,速度更快且能减少伪影。
import torch
import torch.nn as nn
import cv2
import numpy as npclass IFBlock(nn.Module):def __init__(self, in_planes):super(IFBlock, self).__init__()self.conv1 = nn.Conv2d(in_planes, 64, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(64, 64, kernel_size=3, padding=1)self.conv3 = nn.Conv2d(64, 64, kernel_size=3, padding=1)self.conv4 = nn.Conv2d(64, 64, kernel_size=3, padding=1)self.conv5 = nn.Conv2d(64, 64, kernel_size=3, padding=1)self.conv6 = nn.Conv2d(64, 64, kernel_size=3, padding=1)self.conv7 = nn.Conv2d(64, 3, kernel_size=3, padding=1)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)x = self.conv5(x)x = self.conv6(x)x = self.conv7(x)return xclass RIFE(nn.Module):def __init__(self):super(RIFE, self).__init__()self.ifnet = IFBlock(6)self.fusionnet = IFBlock(12)self.refinenet = IFBlock(12)def forward(self, frame0, frame1):# 使用IFNet估计中间流flow = self.ifnet(torch.cat((frame0, frame1), dim=1))# 计算中间帧的两个方向的流flow_t0 = flowflow_t1 = flow * (-1)# 使用流进行反向warpwarped0 = self.backward_warp(frame0, flow_t0)warped1 = self.backward_warp(frame1, flow_t1)# 使用融合网融合warp后的帧fused = self.fusionnet(torch.cat((warped0, warped1), dim=1))# 使用细化网优化结果refined = self.refinenet(torch.cat((fused, frame0, frame1), dim=1))return refineddef backward_warp(self, frame, flow):# 实现反向warp操作# 这里是一个简化的示例,实际中可以使用更复杂的warp实现return frame# 初始化RIFE模型
model = RIFE()# 加载预训练权重(如果有)
# model.load_state_dict(torch.load('rife_model.pth'))# 将模型设置为评估模式
model.eval()# 读取两个连续的视频帧
frame0 = cv2.imread('frame0.jpg')
frame1 = cv2.imread('frame1.jpg')# 将帧转换为PyTorch张量
frame0 = torch.from_numpy(frame0).permute(2, 0, 1).unsqueeze(0).float() / 255.0
frame1 = torch.from_numpy(frame1).permute(2, 0, 1).unsqueeze(0).float() / 255.0# 添加批量维度
frame0 = frame0.unsqueeze(0)
frame1 = frame1.unsqueeze(0)# 使用RIFE进行帧插值
with torch.no_grad():interpolated_frame = model(frame0, frame1)# 将结果转换回numpy数组
interpolated_frame = interpolated_frame.squeeze(0).permute(1, 2, 0).numpy() * 255.0
interpolated_frame = interpolated_frame.astype(np.uint8)# 保存插值后的帧
cv2.imwrite('interpolated_frame.jpg', interpolated_frame)
这段代码是一个RIFE插值算法的完整实现,包括了IFBlock、RIFE模型的定义,以及使用模型进行帧插值的完整流程。代码还包含了如何读取和预处理输入帧,以及如何保存插值后的帧。你可以根据需要对模型的结构和参数进行调整,以适应不同的应用场景和需求。
相关文章:
视频分辨率增强与自动补帧
一、视频分辨率增强 1.传统分辨率增强方法 传统的视频分辨率增强方法主要基于插值技术。这些方法通过对低分辨率视频帧中已知像素点的分布规律和相邻像素之间的相关性进行分析,在两者之间插入新的像素点以达到增加视频分辨率的目的。例如,最近邻插值算…...
深度学习让鱼与熊掌兼得
通常,一个大的复杂的模型的loss会低,但是拟合方面不够,小的模型在拟合方面更好,但是loss高,我们可以通过深度学习来得到一个有着低loss的小模型 我们之前学过,peacewise linear可以用常数加上一堆这个阶梯型函数得到,然后因为peacewise linear可以逼近任何function,所以理论上…...
面试 Linux 运维相关问题
标题Q1Shell脚本是什么、它是必需的吗? Shell脚本是一种用于自动化执行命令行任务的脚本程序,通常运行在Unix/Linux系统的Shell环境中(如Bash)。它通过将多个命令、逻辑控制(如条件判断、循环)和系统功能整合到一个文…...
阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统
在电商行业数据驱动决策的趋势下,高效获取商品详情数据成为企业洞察市场、优化运营的关键。通过阿里巴巴 1688 数据接口构建自动化商品详情采集系统,能够快速、精准地采集海量商品信息。本文将从开发准备、接口分析、代码实现等方面,详细介绍…...
python的宫崎骏动漫电影网站管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
答题pk小程序道具卡的获取与应用
道具卡是答题PK小程序中必不可少的一项增加趣味性的辅助应用,那么道具卡是如何获取与应用的呢,接下来我们来揭晓答案: 一、道具卡的获取: 签到获取:在每日签到中签到不仅可获得当日的签到奖励积分,同时连…...
从零开始创建一个 Next.js 项目并实现一个 TodoList 示例
Next.js 是一个基于 React 的服务端渲染框架,它提供了很多开箱即用的功能,如自动路由、API 路由、静态生成、增量静态再生等。本文将带你一步步创建一个 Next.js 项目,并实现一个简单的 TodoList 功能。 效果地址 🧱 安装 Next.j…...
全面掌握JSR303校验:从入门到实战
一、JSR303校验简介 JSR303是Java EE 6中的一项规范,全称为"Bean Validation 1.0",它定义了一套基于注解的JavaBean校验机制。通过简单的注解,我们可以优雅地完成参数校验工作,避免在业务代码中编写大量的校验逻辑。 …...
「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(二)
Visual JSF Designer(可视化JSF设计器)的目标是使创建JSF应用程序的特定于组件工作更容易可视化,在本教程中,您将使用可视化设计器设计JSF登录页面。您将学习如何: 创建一个JSF项目创建一个新的JSF页面设计JSF页面 该…...
Python 翻译词典小程序
一、概述 本工具是基于Python开发的智能翻译系统,采用有道词典进行翻译,并具有本地词典缓存以及单词本功能。 版本号:v1.0 (2025-05-15) 二、核心功能说明 1. 基础翻译功能 即时翻译:输入英文单词自动获取中文释义 词性识别&…...
kafka调优
以下是 Kafka 性能调优的核心策略与参数配置建议,综合生产环境和硬件层面的优化方案,覆盖生产者、消费者、Broker 三个关键组件: 一、生产者调优 批量发送优化 • batch.size:增大批量消息大小(默认 16KB,建…...
【hadoop】sqoop案例 hive->mysql
将temperature.log中的气象数据导入到Hive的temperature表中, 根据气象站id分组计算每个气象站30年来的*最高*气温, 然后将统计结果导出到MySQL当中。 思路: 1.在hive中创建表 2.数据导入到表中 3.计算后的结果写入另外的表 4.用sqoop导出…...
Git/GitLab日常使用的命令指南来了!
在 GitLab 中拉取并合并代码的常见流程是通过 Git 命令来完成的。以下是一个标准的 Git 工作流,适用于从远程仓库(如 GitLab)拉取代码、切换分支、合并更新等操作。 🌐 一、基础命令:拉取最新代码 # 拉取远程仓库的所…...
遗传算法求解旅行商问题分析
目录 一、问题分析 二、实现步骤 1)初始化种群 2)计算适应度 3)选择操作 4)交叉操作 5)变异操作 三、求解结果 四、总结 本文通过一个经典的旅行商问题,详细阐述在实际问题中如何运用遗传算法来进…...
【Hadoop】伪分布式安装
【Hadoop】伪分布式安装 什么是 Hadoop 伪分布式安装? Hadoop 伪分布式安装(Pseudo-Distributed Mode) 是一种在单台机器上模拟分布式集群环境的部署方式。它是介于 本地模式(Local Mode) 和 完全分布式模式…...
微服务概述
什么是微服务 微服务是一个架构方案,属于分布式架构的一种。 微服务提倡将模块以独立服务的方式独立管理,整个项目依靠多个小型的服务(单独进程)同时运作来支撑,单个服务只关注自己的业务实现并且有专业的团队进行开发。服务之间使用轻量的协议进行消息传送,并且对于单个…...
【网工】华为配置基础篇①
目录 ■华为设备登录配置 ■VLAN与VLANIF地址配置 ■DHCP配置命令 ■ACL访问控制列表配置 ■NAT地址转换配置 ■华为设备登录配置 <AR> system-view //进入系统模式 [AR]sysname Huawei //设备命名为Huawei [Huawei] telnet server enable //开启设备telnet功…...
React19源码系列之 Diff算法
在之前文章中root.render执行的过程,beginWork函数是渲染过程的核心,其针对不同类型的fiber进行不同的更新处理,在FunctionComponent(函数组件)中,会针对新旧fiber进行对比处理生成新fiber。因此此次就详细…...
华为2024年报:鸿蒙生态正在取得历史性突破
华为于2025年03月31日发布2024年年度报告。报告显示,华为经营结果符合预期,实现全球销售收入 8,621 亿元人民币,净利润 626 亿元人民币。2024 年研发投入达到 1,797 亿元人民币,约占全年收入的 20.8%,近十年累计投入的…...
如何在Firefox火狐浏览器里-安装梦精灵AI提示词管理工具
第一步:进入《梦精灵跨平台AI提示词管理工具》官网 梦精灵 跨平台AI提示词管理助手 - 官网梦精灵是一款专为AI用户打造的跨平台提示词管理插件,支持一键收藏、快速复制、智能分类等功能,适用于即梦、豆包、Kimi、DeepSeek等多个AI平台&…...
【鸿蒙开发】性能优化
语言层面的优化 使用明确的数据类型,避免使用模糊的数据类型,例如ESObject。 使用AOT模式 AOT就是提前编译,将字节码提前编译成机器码,这样可以充分优化,从而加快执行速度。 未启用AOT时,一边运行一边进…...
Makefile与CMake
一、Makefile 核心内容 1. Makefile 基础结构与工作原理 三要素: 目标(Target):要生成的文件或执行的操作(如可执行文件、清理操作)。依赖(Dependency):生成目标所需的…...
P8803 [蓝桥杯 2022 国 B] 费用报销
P8803 [蓝桥杯 2022 国 B] 费用报销 - 洛谷 题目描述 小明在出差结束后返回了公司所在的城市,在填写差旅报销申请时,粗心的小明发现自己弄丢了出差过程中的票据。 为了弥补小明的损失,公司同意小明用别的票据进行报销,但是公司财…...
11 web 自动化之 DDT 数据驱动详解
文章目录 一、DDT 数据驱动介绍二、实战 一、DDT 数据驱动介绍 数据驱动: 现在主流的设计模式之一(以数据驱动测试) 结合 unittest 框架如何实现数据驱动? ddt 模块实现 数据驱动的意义: 通过不同的数据对同一脚本实现…...
15:00开始面试,15:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到4月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
深入理解浏览器渲染引擎:底层机制与性能优化实战
现代浏览器背后是一个庞大而复杂的系统工程,渲染引擎作为核心模块之一,承担着从解析 HTML/CSS 到最终绘制页面的关键职责。本文将从底层机制出发,系统梳理渲染引擎(如 Blink)工作原理、V8 与渲染流程的协作方式&#x…...
【LeetCode 热题 100】56. 合并区间 —— 一文弄懂排序+遍历经典解法(附Python代码)
📌 题目链接 LeetCode 56. 合并区间 📖 一、引言:区间合并,刷题路上的绊脚石? 区间类问题是算法面试中常见的经典题型,尤其是“合并区间”问题,考察你对排序、区间重叠判断及边界处理的理解和编码能力。 很多同学在面对这题时,容易卡在: 什么时候两个区间算重叠?…...
使用Mathematica绘制Clifford奇异吸引子
Clifford Attractors 是一种由微分方程 生成的混沌吸引子,参数a,b,c,d不同会产生不同的分形图案。这类吸引子属于迭代函数系统,通过不断迭代参数方程来生成复杂的图形。其数学基础可能与 Clifford 代数或高维函数理论相关,例如 Clifford 代数…...
各个历史版本mysql/tomcat/Redis/Jdk/Apache下载地址
mysql 各版本下载地址: https://downloads.mysql.com/archives/community/ **************************************************************** tomcat 各版本下载地址: https://archive.apache.org/dist/tomcat/ ********************************…...
全面解析机器学习与深度学习中的模型权重文件格式与应用场景
概述 随着机器学习和人工智能技术的飞速发展,高效且安全地存储、共享和部署训练有素的模型的方法变得越来越重要。模型权重文件格式在这个过程中发挥着关键作用。这些格式不仅保存了模型的学习参数,还能够实现可复现性,并且便于在各种不同环…...
鸿蒙OSUniApp 实现的地图定位与导航功能#三方框架 #Uniapp
UniApp 实现的地图定位与导航功能 随着移动互联网的发展,地图定位与导航功能已成为众多应用的标配。本文将详细介绍如何在 UniApp 框架下实现地图定位与导航功能,并探讨如何适配鸿蒙系统,助力开发者打造更加流畅的地图体验。 前言 最近在做一…...
【HarmonyOS 5】鸿蒙星闪NearLink详解
【HarmonyOS 5】鸿蒙星闪NearLink详解 一、前言 鸿蒙星闪NearLink Kit 是 HarmonyOS 提供的短距离通信服务,支持星闪设备间的连接、数据交互。例如,手机可作为中心设备与外围设备(如鼠标、手写笔、智能家电、车钥匙等)通过星闪进…...
Java并发编程面试题总结
目录 线程有哪几种状态?状态如何流转? 创建线程的方式? 多线程有什么应用? 线程池的好处? 线程池的七个参数? 为什么不推荐使用jdk的Executors创建线程池? 线程池的执行流程? 任务拒绝策略有哪些,怎么选择? 线程池的核心线程数和最大线程数怎么设定…...
LAMP项目部署实战
一、LAMP部署前期准备 1.1 关闭防火墙 # systemctl stop firewalld # systemctl disable firewalld 1.2 关闭SELinux SELinux(Security-EnhancedLinux)是美国国家安全局(NSA)对于强制访问控制的实现,是Linux历史上最杰出的新安全子系统。 …...
Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】
Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】 随着AI技术与自动化工具的迅速发展,开发者和企业面临着多种平台选择。Dify和n8n作为两个备受关注的自动化平台,分别专注于不同领域:Dify主要面向AI应用开发&…...
VBA_NZ系列工具NZ10:VBA压缩与解压工具
我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…...
EFT不过整改思路与调试经验
EFT是如何影响EUT的: EFT试验是为了验证电气和电子设备对诸如来自切换瞬态过程(切断感性负载、继电器触点弹跳等)的各种类型瞬变骚扰的抗扰度。EFT干扰是在电路中感性负载断开时产生的,它的特点是干扰信号不是单个脉而是一连串的脉冲群。EFT 干扰可以在…...
2.安卓逆向2-adb指令
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 工具下载: 链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码࿱…...
VSCode CMake工作流
Foreword 之前看到CMake有这么多选项,感觉不简单,还是看下别人在这里设计了多少东西 CMake 整体来说CMake遵循这样一套结构 操作-操作预设(如果有的话)-操作目标(如果有的话)比如 Configure-Configure…...
【上位机——WPF】App.xml和Application类简介
App.xml和Application类简介 概述App.xamlApp.xaml.cs 入门代码App.xamlMainWindow.xml Application生命周期窗体的声明周期 概述 xaml类型的文件包含两部分,一部分以.xaml扩展名结尾的前端代码,另一部分以.xaml.cs结尾的后端代码,通常我们也…...
MySQL 8.0 OCP 1Z0-908 101-110题
Q101.which two queries are examples of successful SQL injection attacks? A.SELECT id, name FROM backup_before WHERE name‘; DROP TABLE injection; --’; B. SELECT id, name FROM user WHERE id23 oR id32 OR 11; C. SELECT id, name FROM user WHERE user.id (SEL…...
Linux/Centos7离线安装并配置MySQL 5.7
文章目录 前言1、安装包下载2、卸载MariaDB3、创建MySQL用户4、上传安装包5、创建数据目录和配置文件6、安装MySQL7、启动MySQL8、初始化MySQL9、退出验证新密码10、创建普通用户和库11、测试普通用户和库总结 前言 博主参考了一些大佬的文章,部分收费的就看不了了&…...
在Angular中使用Leaflet构建地图应用
Leaflet是一个用于创建地图的JavaScript库,它包含许多功能,并且非常适用于移动设备。 准备 nodejs: v20.15.0 npm: 10.7.0 angular: 19.2.10 创建一个地图应用工程 npx angular/cli new my-leaflet-app --stylecss --routingfalse --skip-tests提示 …...
GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 引言 在边缘计算与AI推理场景中,GPU-NPU异构计算架构已成为突破算力瓶颈的关键技…...
iOS 抓包实战:从 Charles 到Sniffmaster 的日常工具对比与使用经验
iOS 抓包实战:从 Charles 到抓包大师 Sniffmaster 的日常工具对比与使用经验 抓包这件事,不是高级黑客才要做的。作为一名移动端开发,我几乎每天都要和网络请求打交道,尤其是 HTTPS 请求——加密、重定向、校验证书,各…...
【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
目录 一、前言 二、前置准备 2.1 基本环境 2.2 准备一个springboot工程 2.2.1 准备几个测试接口 2.3 准备Dockerfile文件 2.4 打包上传到服务器 三、制作微服务镜像与运行服务镜像 3.1 拷贝Dockerfile文件到服务器 3.2 制作服务镜像 3.3 启动镜像服务 3.4 访问一下服…...
【Linux系统】从 C 语言文件操作到系统调用的核心原理
文章目录 前言lesson 15_基础IO一、共识原理二、回顾C语言接口2.1 文件的打开操作2.2 文件的读取与写入操作2.3 三个标准输入输出流 三、过渡到系统,认识文件系统调用3.1 open 系统调用1. 比特位标志位示例 3.2 write 系统调用1. 模拟实现 w 选项2. 模拟实现 a 选项…...
俄罗斯方块算法
俄罗斯方块是一款风靡全球 38 年的经典益智游戏,凭借其简单易学但难于精通的特点,成为游戏史上的不朽之作。 游戏界面与规则 游戏界面为 20 行10 列的可视区域。横向 X 轴区间为 [0,9],共 10 列;纵向 Y 轴区间为 [0&a…...
Node.js 循环依赖问题详解:原理、案例与解决方案
文章目录 一、什么是循环依赖?二、循环依赖的典型表现三、解决方案四、如何检测循环依赖五、循环依赖的隐藏危害 一、什么是循环依赖? 当两个或者多个模块互相直接或者间接引用时,就会形成循环依赖。例如: A.js → 依赖 → B.js…...
Linux系统编程——vfork函数的使用方法以及与fork函数的区别
vfork() 是 Linux 系统编程中与 fork() 类似的系统调用,用于创建一个新的子进程。它们都能创建子进程,但在实现机制和使用场景上有明显区别。 以下是对 vfork() 的详细介绍,包括: 使用方法 注意事项 与 fork() 的联系与区别 使…...