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

【代码解析】opencv 安卓 SDK sample - 1 - HDR image

很久没有写安卓了,复习复习。用的是官方案例,详见opencv-Android-sdk

// 定义包名,表示该类的组织路径
package org.opencv.samples.tutorial1;// 导入所需的OpenCV和Android类库
import org.opencv.android.CameraActivity;  // OpenCV相机活动基类
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;  // 相机帧数据
import org.opencv.android.OpenCVLoader;  // OpenCV加载器
import org.opencv.core.Mat;  // OpenCV矩阵类,用于存储图像数据
import org.opencv.android.CameraBridgeViewBase;  // 相机视图基类
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;  // 相机监听接口
import org.opencv.android.Utils;  // OpenCV工具类
import org.opencv.core.Core;  // OpenCV核心功能
import org.opencv.imgproc.Imgproc;  // 图像处理模块
import org.opencv.photo.Photo;  // 照片处理模块
import org.opencv.core.*;  // OpenCV核心模块// 导入Android相关类库
import android.os.Bundle;  // 用于保存Activity状态
import android.util.Log;  // 日志工具
import android.view.SurfaceView;  // 表面视图
import android.view.WindowManager;  // 窗口管理
import android.widget.Toast;  // 提示消息
import android.widget.Button;  // 按钮控件
import android.view.View;  // 视图基类
import android.os.Environment;  // 环境信息
import android.graphics.Bitmap;  // 位图类// 导入Java工具类
import java.util.Collections;  // 集合工具
import java.util.ArrayList;  // 动态数组
import java.util.List;  // 列表接口
import java.io.File;  // 文件类
import java.io.FileOutputStream;  // 文件输出流
import java.text.SimpleDateFormat;  // 日期格式化
import java.util.Date;  // 日期类

Tutorial1Activity 类

定义

public class Tutorial1Activity extends CameraActivity implements CvCameraViewListener2

继承自 CameraActivity ( 是Activity 基类,它封装了对摄像头的基本处理逻辑,比如打开摄像头、获取帧数据等。)

接口声明

OpenCV 摄像头帧回调接口 CvCameraViewListener2。

implements CvCameraViewListener2

表示这个类 实现了 接口 CvCameraViewListener2,必须实现该接口的全部方法

这个接口是 OpenCV 提供的,用于处理来自摄像头的数据帧。它有几个关键方法:

public interface CvCameraViewListener2 {void onCameraViewStarted(int width, int height);void onCameraViewStopped();Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame);
}
方法作用
onCameraViewStarted()摄像头启动时初始化 Mat、变量等
onCameraViewStopped()摄像头停止时释放资源
onCameraFrame()每帧图像自动调用,可以处理图像

📌 各方法说明:

onCameraViewStarted(int width, int height):摄像头视图开始时调用。

onCameraViewStopped():摄像头视图停止时调用。

onCameraFrame(CvCameraViewFrame inputFrame):每帧图像采集时调用,可以在这里进行图像处理(如边缘检测、滤波等),返回 Mat 类型图像结果用于渲染显示。

构造函数

 // 构造函数public Tutorial1Activity() {// 打印日志,记录实例化信息Log.i(TAG, "Instantiated new " + this.getClass());}

定义

    // 定义日志标签常量定义一个日志标签(log tag),用于在 AndroidLogcat 控制台中打印日志。便于调试、排查错误,推荐每个类定义一个 TAGprivate static final String TAG = "OCVSample::Activity";// 声明相机视图对象声明一个 OpenCV 的摄像头视图控件,它负责打开摄像头、采集图像帧、并把图像送入 onCameraFrame() 回调处理。封装了摄像头的打开、预览、帧捕获、图像格式转换等功能。CameraBridgeViewBaseOpenCV for Android 提供的一个抽象类,常用的子类是 JavaCameraViewprivate CameraBridgeViewBase mOpenCvCameraView;// 声明拍照按钮在 onCreate 中设置利用 setOnClickListener 触发private Button mCaptureButton;// 声明存储RGBA图像的矩阵onCameraFrame() 回调函数中,OpenCV 会将摄像头捕获的帧传递进来private Mat mRgba;// HDR相关声明private Button mHdrButton;  // HDR按钮private boolean mIsCapturingHDR = false;  // HDR拍摄标志位private List<Mat> mExposureSequence = new ArrayList<>();  // 存储不同曝光图像的列表private static final float[] EXPOSURE_VALUES = {0.5f, 1.0f, 2.0f};  // 定义三种曝光值

函数解析

在 Android 中,Activity 有一个完整的生命周期管理,典型调用顺序如下:

onCreate() → 创建视图和变量

onStart() → Activity 对用户可见

onResume() → Activity 可交互(获取焦点)

onPause() → 准备进入后台

onStop() → Activity 不再可见

onDestroy() → Activity 被销毁

Activity 的构造函数 onCreate

系统会先调用隐藏的构造函数,然后调用 onCreate()。 当该 Activity 第一次被创建时(即启动时),系统会自动调用它。到 onCreate() 时,系统已经准备好了界面容器、上下文环境(Context)、资源引用、生命周期管理器。
这时才能用 findViewById方法

在 onCreate() 中,通常执行以下操作:

  1. 设置界面布局
setContentView(R.layout.activity_main);

加载 XML 中定义的 UI 界面。

  1. 初始化 UI 控件和变量
mOpenCvCameraView = findViewById(R.id.java_camera_view);
mCaptureButton = findViewById(R.id.capture_button);

完成变量与界面元素的绑定,准备用户交互。

  1. 设置控件监听器
mCaptureButton.setOnClickListener(v -> captureImage());

为按钮或其他 UI 元件设置回调函数。

  1. 初始化 OpenCV 或其他第三方库
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);

加载 OpenCV 库并处理初始化回调。

// Activity创建时的回调方法
@Override 对父类 Activity 中的 onCreate 方法的重写。
Bundle savedInstanceState:
是一个用于存储界面状态的数据结构。
当 Activity 被意外销毁后(如屏幕旋转、被系统回收等),可以通过它恢复先前的状态。public void onCreate(Bundle savedInstanceState) {// 调用父类onCreate方法super.onCreate(savedInstanceState);// 打印日志Log.i(TAG, "called onCreate");// 初始化OpenCV本地库if (OpenCVLoader.initLocal()) {// 初始化成功日志Log.i(TAG, "OpenCV loaded successfully");} else {// 初始化失败日志Log.e(TAG, "OpenCV initialization failed!");// 显示初始化失败提示(Toast.makeText(this, "OpenCV initialization failed!", Toast.LENGTH_LONG)).show();return;}// 设置窗口标志,保持屏幕常亮getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 设置布局文件setContentView(R.layout.tutorial1_surface_view);// 获取相机视图引用XML 布局文件中声明的 OpenCV 摄像头预览控件绑定到 Java 代码中的变量 mOpenCvCameraView 上,以便后续调用方法控制摄像头。
强制类型转换,因为 findViewById() 返回的是通用类型 View,而你希望将它当作 CameraBridgeViewBase 来使用。
CameraBridgeViewBaseOpenCV 提供的抽象基类,定义了摄像头启动、停止、帧获取等功能。
JavaCameraView 是它的子类,真正实现了预览逻辑。mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);// 获取拍照按钮引用mCaptureButton = (Button) findViewById(R.id.capture_button);// 获取HDR按钮引用mHdrButton = (Button) findViewById(R.id.hdr_button);// 设置相机视图可见性mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);// 设置相机视图监听器mOpenCvCameraView.setCvCameraViewListener(this);// 设置拍照按钮点击监听器mCaptureButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 检查当前帧是否有效if (mRgba != null && !mRgba.empty()) {// 调用保存图像方法saveImage(mRgba);}}});// 设置HDR按钮点击监听器mHdrButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 设置HDR拍摄标志mIsCapturingHDR = true;// 清空曝光序列mExposureSequence.clear();// 显示提示信息Toast.makeText(Tutorial1Activity.this, "准备HDR拍摄,请保持手机稳定...",Toast.LENGTH_SHORT).show();}});}

CameraBridgeViewBase 是什么?
虽然 CameraBridgeViewBase 本质上是一个“视图组件”(View),但它不仅仅是用来显示摄像头图像,还内置了摄像头控制逻辑、帧采集机制和 OpenCV 回调接口对接。

它是 OpenCV for Android 提供的一个抽象类,负责:

功能说明
控制摄像头启动/停止封装了打开摄像头、释放摄像头资源的流程
帧采集循环自动开启后台线程采集图像帧
图像格式转换将 NV21/YUV 等图像转换为 OpenCV 可处理的 Mat 类型
接入回调让开发者通过接口拿到每一帧图像进行处理

帧采集 + 回调的完整机制

方法功能
setCvCameraViewListener(this)设置帧数据监听器,接收每一帧图像
enableView()内部会打开摄像头,启动采集线程,开始不断生成帧

OpenCV 内部怎么做的?

OpenCV 封装了以下逻辑:

  • 打开摄像头(通过 Camera / Camera2 API)

    后台线程循环采集图像帧(YUV 或 RGBA)

    转换为 Mat 类型(OpenCV 可处理格式)

    调用你实现的接口方法:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {// 每帧图像都走这里,你可以处理它return inputFrame.rgba(); // 或处理后返回
}

对应

你的代码↓
CameraBridgeViewBase↓
JavaCameraView / NativeCameraView↓
系统 Camera API↓
图像帧采集 → 自动转换为 Mat → 回调 onCameraFrame()
    // Activity暂停时的回调方法@Overridepublic void onPause() {// 调用父类方法super.onPause();// 如果相机视图存在,则禁用视图if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}// Activity恢复时的回调方法@Overridepublic void onResume() {// 调用父类方法super.onResume();// 如果相机视图存在,则启用视图if (mOpenCvCameraView != null)mOpenCvCameraView.enableView();}// 获取相机视图列表的方法@Overrideprotected List<? extends CameraBridgeViewBase> getCameraViewList() {// 返回包含单个相机视图的不可变列表return Collections.singletonList(mOpenCvCameraView);}// Activity销毁时的回调方法@Overridepublic void onDestroy() {// 调用父类方法super.onDestroy();// 如果相机视图存在,则禁用视图if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}// 相机视图启动时的回调方法@Overridepublic void onCameraViewStarted(int width, int height) {// 初始化RGBA矩阵mRgba = new Mat();}// 相机视图停止时的回调方法@Overridepublic void onCameraViewStopped() {// 如果RGBA矩阵存在,则释放资源if (mRgba != null) {mRgba.release();}}// 处理相机帧数据的回调方法@Overridepublic Mat onCameraFrame(CvCameraViewFrame inputFrame) {// 获取当前帧的RGBA数据mRgba = inputFrame.rgba();// 返回处理后的帧return mRgba;}

保存文件

// 保存图像到文件的方法private void saveImage(Mat mat) {// 创建与Mat相同尺寸的Bitmap对象Bitmap bmp = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);// 将Mat转换为BitmapUtils.matToBitmap(mat, bmp);// 创建时间戳格式String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());// 生成文件名String imageFileName = "IMG_" + timeStamp + ".jpg";// 获取公共图片目录File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);// 创建文件对象File imageFile = new File(storageDir, imageFileName);try {// 创建文件输出流FileOutputStream fos = new FileOutputStream(imageFile);// 压缩Bitmap为JPEG格式并写入文件bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);// 关闭输出流fos.close();// 显示保存成功提示Toast.makeText(this, "照片已保存: " + imageFile.getAbsolutePath(),Toast.LENGTH_LONG).show();} catch (Exception e) {// 记录保存失败日志Log.e(TAG, "保存照片失败", e);// 显示保存失败提示Toast.makeText(this, "保存照片失败", Toast.LENGTH_SHORT).show();}}

相关文章:

【代码解析】opencv 安卓 SDK sample - 1 - HDR image

很久没有写安卓了&#xff0c;复习复习。用的是官方案例&#xff0c;详见opencv-Android-sdk 包 // 定义包名&#xff0c;表示该类的组织路径 package org.opencv.samples.tutorial1;// 导入所需的OpenCV和Android类库 import org.opencv.android.CameraActivity; // OpenCV…...

管理综合知识点

比与比例涉及的问题 比与比例基础知识比例的转换正反比例浓度问题利润问题增长率问题比例与面积行程问题 一、比例转换与性质 核心公式&#xff1a; 若 a : b c : d a:b c:d a:bc:d或 a b c d \frac{a}{b} \frac{c}{d} ba​dc​ → a d b c ad bc adbc&#xff08;交…...

机器学习:特征向量与数据维数概念

特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中&#xff0c;每个样本通常由多个特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一张图片的特征可能包括颜色、形状、纹理等&#xff1b;一个客户的特征可能包括年龄…...

《情感反诈模拟器》2025学习版

1.2 专业内容支持 67篇情感诈骗案例研究14万字心理学分析资料783条专业配音对白 二、安装与运行 2.1 系统要求 最低配置&#xff1a; 显卡&#xff1a;GTX 1060CPU&#xff1a;i5-8400存储&#xff1a;25GB空间 2.2 运行步骤 解压游戏文件&#xff08;21.7GB&#xff09;…...

C++ - 标准库之 <string> npos(npos 概述、npos 的作用)

一、std::string::npos 概述 std::string::npos 是一个静态常量&#xff0c;表示 size_t 类型的最大值 std::string::npos 用于表示字符串操作中的未找到的位置或无效位置 std::string::npos 属于 C 标准库中的 <string> 头文件 二、std::string::npos 的作用 std::s…...

策略设计模式

1. 什么是策略模式 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户端,客户端中的具体实现只需要了解上下文类。 2. 由什么组成 策略接口&…...

C++结构体初始化与成员函数实现语法详解

C结构体初始化与成员函数实现语法详解 一、结构体静态成员初始化语法 在C中&#xff0c;静态成员变量需要在类外部进行定义和初始化。提供的代码展示了如何为MAIN_PROPULSION_CAN类的静态成员变量进行初始化&#xff1a; MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPU…...

第八章 网络安全

1 什么是网络安全 安全通信具有的性质&#xff1a; 机密性&#xff1a;只有发送方和希望的接收方能否理解传输的报文内容&#xff08;发送方加密报文&#xff0c;接收方解密报文&#xff09;认证&#xff08;端点鉴别&#xff09;&#xff1a;发送方和接收方需要确认对方的身…...

开源 python 应用 开发(一)python、pip、pyAutogui、python opencv安装

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#x…...

CMCC RAX3000M nand版 OpenWrt 可用空间变小的恢复方法

文章目录 问题背景尝试一、通过 Tftpd64 重新刷写 initramfs-recovery 镜像 &#xff08;不成功&#xff09;尝试二、重新分配 ubi 卷&#xff08;此操作存在一定的危险&#xff0c;请查阅相关资料&#xff0c;避免影响到核心分区&#xff09; 问题背景 CMCC RAX3000M Nand 版…...

云函数调测、部署及日志查看

1、调试云函数 业务函数开发完成后&#xff0c;需要验证函数代码的正确性&#xff0c;DevEco Studio工具支持本地调用和远程调用两种形式的调试函数方法&#xff0c;首先来看看通过本地调用方式调试函数。 1&#xff09;通过本地调用方式调试云函数 为了验证函数的正确性以及…...

逆向某物 App 登录接口:还原 newSign 算法全流程

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ newSign 参数分析 通过 Hook Java 层加密算法得到 newSign 参数相关信息如下&#xff1a; 具体参考&#xff1a;逆向某物 App 登录接口&#xff1a;抓包分析…...

2140、解决智力问题

题目 解答 正向不好做&#xff0c;反向遍历。 定义&#xff1a;dp[i] [i,n)的分数 初始化&#xff1a;dp[n]0 递推&#xff1a;dp[i]max(dp[i1],questions[i][0]dp[iquestions[i][1]1]) 如果越界了&#xff0c;就截断到dp[n] 最后return dp[0]即可 class Solution { publ…...

肖臻《区块链技术与应用》第六讲:比特币网络

一、分层架构&#xff1a;应用层之下的P2P网络 比特币并非凭空运作&#xff0c;它的协议运行在互联网的应用层之上。而在其底层&#xff0c;支撑整个系统的是一个对等网络&#xff08;Peer-to-Peer, P2P&#xff09;。可以这样理解&#xff1a; 应用层 (Application Layer): …...

(C++)素数的判断(C++教学)(C语言)

源代码&#xff1a; #include <iostream> using namespace std;int fun(int num){if(num<1){return 1;}if(num%20){return 0;}else{return 2;} }int main(){while (1){int y0;int num0;cout<<"请输入一个整数&#xff1a;\n";cin>>num;yfun(nu…...

openai-agents实现input_guardrails

目录 版本模块引入自定义LLM模型input_guardrail设置main函数 代码&#xff1a; input_guardrails.ipynb 版本 import agents print(agents.__version__)0.0.19模块引入 from __future__ import annotationsfrom pydantic import BaseModelfrom agents import (Agent,Guardr…...

在高数中 导数 微分 不定积分 定积分 的意义以及联系

在高等数学中&#xff0c;导数、微分、不定积分、定积分是微积分的核心概念&#xff0c;它们既有明确的定义和几何/物理意义&#xff0c;又相互关联。下面分别说明它们的意义&#xff0c;并总结它们之间的联系。 导数的意义 定义&#xff1a; 函数 y f(x) 在点 x 处的导数定义…...

Linux系统基本操作指令

Linux系统基本操作指令 文章目录 Linux系统基本操作指令一、介绍二、基础设置2.1 设置ubuntu与window的共享目录2.2 ubuntu系统简单介绍 三、Linux命令及工具介绍3.1 目录管理命令(功能&#xff0c;格式&#xff0c;参数&#xff0c;系统参数)3.2 文件操作命令 四、网络命令4.1…...

「Linux文件及目录管理」vi、vim编辑器

知识点解析 vi/vim编辑器简介 vi:Linux默认的文本编辑器,基于命令行操作,功能强大。vim:vi的增强版,支持语法高亮、多窗口编辑、插件扩展等功能。vi/vim基本模式 命令模式:默认模式,用于移动光标、复制、粘贴、删除等操作。插入模式:按i进入,用于输入文本。末行模式:…...

等等等等等等

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。 …...

JAVA集合篇--深入理解ConcurrentHashMap图解版

一、前言 在Java并发编程中&#xff0c;线程安全的Map实现一直是一个重要话题。虽然我们可以使用Collections.synchronizedMap()或者HashTable来获得线程安全的Map&#xff0c;但它们的性能在高并发场景下往往不尽人意。ConcurrentHashMap作为Java并发包中的重要组件&#xff0…...

Python嵌套循环

一、前言 在 Python 编程中&#xff0c;嵌套循环&#xff08;Nested Loops&#xff09; 是指在一个循环的内部再嵌套另一个循环。这种结构常用于处理多维数据结构&#xff08;如二维数组、矩阵&#xff09;、遍历组合数据、图形绘制等场景。 虽然嵌套循环在逻辑上更复杂&…...

linux编译安装nginx

1.到官网(nginx)下载nginx压缩包&#xff1a; 2.以&#xff08;nginx-1.24.0.tar.gz&#xff09;为例&#xff1a; 1.上传压缩包至linux服务器&#xff1a; rz 2.解压压缩包nginx-1.24.0.tar.gz&#xff1a; tar -zxvf nginx-1.24.0.tar.gz 3.在安装Nginx之前&#xff0c;需…...

算法-动态规划-钢条切割问题

钢条切割问题是一个经典的动态规划问题&#xff0c;旨在通过切割钢条获得最大收益。以下是详细解释和解决方案&#xff1a; 问题描述 给定长度为 n 的钢条和价格表 p&#xff0c;其中 p[i] 表示长度为 i 的钢条的价格&#xff08;i 1, 2, ..., n&#xff09;。目标&#xff…...

Java八股文——系统场景设计

如何设计一个秒杀场景&#xff1f; 面试官您好&#xff0c;设计一个秒杀系统&#xff0c;是对一个工程师综合技术能力的巨大考验。它的核心挑战在于&#xff0c;如何在极短的时间内&#xff0c;应对超高的并发请求&#xff0c;同时保证数据&#xff08;尤其是库存&#xff09;…...

如何在FastAPI中玩转GitHub认证,让用户一键登录?

title: 如何在FastAPI中玩转GitHub认证,让用户一键登录? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: cmdragon excerpt: GitHub第三方认证集成通过OAuth2.0授权码流程实现,包含用户跳转GitHub认证、获取授权码、交换访问令牌及调用API获取用户信息四…...

[RPA] 影刀RPA实用技巧

1.给数字添加千分位分隔符 将变量variable的数值(2025.437)添加千分位分隔符&#xff0c;使其变为2,025.437 流程搭建&#xff1a; 关键指令&#xff1a; 2.删除网页元素 将bilibili官网的"动态"图标进行删除 流程搭建&#xff1a; 关键指令&#xff1a; 呈现效果…...

RA4M2开发IOT(7)----RA4M2驱动涂鸦CBU模组

RA4M2开发IOT.7--RA4M2驱动涂鸦CBU模组 概述视频教学样品申请硬件准备参考程序初始化 LSM6DSV16X 传感器初始化单双击识别主程序接口RA4M2接口生成UARTUART属性配置R_SCI_UART_Open()函数原型回调函数user_uart_callback0 ()变量定义更新敲击状态DP同步长按进入配网涂鸦协议解析…...

华为公布《鸿蒙编程语言白皮书》V1.0 版:解读适用场景

6 月 22 日消息&#xff0c;华为现已在其开发者网站上架《鸿蒙编程语言白皮书》V1.0 版本&#xff0c;主要围绕鸿蒙 HarmonyOS 整体框架、适用场景、演进策略、未来愿景四大角度进行阐述&#xff0c;文档访问地址&#xff08;https://developer.huawei.com/consumer/cn/doc/gui…...

多源异构数据接入与实时分析:衡石科技的技术突破

在数字化转型的浪潮中&#xff0c;企业每天产生的数据量呈指数级增长。这些数据来自CRM系统、IoT设备、日志文件、社交媒体、交易平台等众多源头&#xff0c;格式各异、结构混乱、流速不一。传统的数据处理方式如同在无数孤立的岛屿间划着小船传递信息&#xff0c;效率低下且无…...

多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程

文章目录 前言1. Windows开启Webdav服务2. 客户端测试3. 安装Cpolar内网穿透实现公网访问Webdav4. 同步PC端笔记至WebDav4.1 首先需要在IIS中添加md的格式4.2 在Obsidian中安装第三方插件 5. 同步手机端笔记至WebDav 前言 各位好&#xff01;在数字化浪潮席卷的当下&#xff0…...

Linux->进程概念(精讲)

引入&#xff1a;本文会讲到的东西有哪些&#xff1f; 注&#xff1a;要讲就讲清楚&#xff0c;所以从0到懂&#xff0c;目录在右侧 一&#xff1a;冯诺依曼体系结构 1&#xff1a;人物介绍 冯诺依曼是一个伟大的人&#xff0c;他提出了一个体系结构&#xff0c;被命名冯诺依…...

【舞蹈】PC-Dance:姿势可控的音乐驱动舞蹈合成

PC-Dance:姿势可控的音乐驱动舞蹈合成 自监督节奏对齐学习音乐到舞蹈的对齐嵌入-PC-Syn 中,依然怒了一种用于 自适应运动图构建(AMGC)的高效方案,可以基于图的优化效率并保持动作的多样性。 舞蹈合成 整体情况 我们的系统主要由音乐到舞蹈对齐嵌 入网络(M2D-Align)和姿势…...

uni-app项目实战笔记22--图片预览和切换

需求描述&#xff1a; 1、图片预览时&#xff0c;通常需要知道&#xff0c;当前预览的是第几张&#xff0c;总共有多少张图片&#xff1b; 2、当用户左右滑动切换预览图片时&#xff0c;当前预览索引需要随着进行切换。 下面简单介绍下实现过程&#xff1a; 1、在图片列表页…...

[特殊字符] AIGC工具深度实战:GPT与通义灵码如何彻底重构企业开发流程

&#x1f50d; 第一模块&#xff1a;理念颠覆——为什么AIGC不是“玩具”而是“效能倍增器”&#xff1f; ▍企业开发的核心痛点图谱&#xff08;2025版&#xff09; ​​研发效能瓶颈​​&#xff1a;需求膨胀与交付时限矛盾持续尖锐&#xff0c;传统敏捷方法论已触天花板​…...

华为OD机考-用户调度问题-DP(JAVA 2025B卷)

import java.util.Scanner;public class UserScheduling {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt(); // 用户个数int[][] costs new int[n][3]; // 存储每个用户使用A/B/C策略的系统消耗for (int i 0; i …...

【论文阅读 | CVPR 2024 |Fusion-Mamba :用于跨模态目标检测】

论文阅读 | CVPR 2024 |Fusion-Mamba &#xff1a;用于跨模态目标检测 1.摘要&&引言2.方法2.1 预备知识2.2 Fusion-Mamba2.2.1 架构特征提取与多模态融合&#xff08;FMB模块&#xff09;FMB的应用与输出2.2.2 关键组件3.2.2.1 SSCS 模块&#xff1a;浅层跨模态特征交互…...

Python 数据分析与可视化 Day 4 - Pandas 数据筛选与排序操作

&#x1f3af; 今日目标 掌握 Pandas 中 groupby() 的使用方式学会使用 agg() 方法进行多个聚合掌握 pivot_table() 构建透视表结合分组与排序进行更深入的分析 &#x1f9ee; 一、基本分组统计&#xff08;groupby&#xff09; ✅ 分组 单列聚合 df.groupby("性别&qu…...

基于Vue.js的图书管理系统前端界面设计

一、系统前端界面设计要求与效果 &#xff08;一&#xff09;系统功能结构图 设计一个基于Vue.js的图书管理系统前端界面。要充分体现Vue的核心特性和应用场景&#xff0c;同时结合信息管理专业的知识。要求系统分为仪表盘、图书管理、借阅管理和用户管理四个主要模块&#x…...

FPGA故障注入测试软件使用指南

有数字芯片之母别称的FPGA,是国内在半导体行业率先取得重大突破的细分赛道,正迎来技术和市场形成共振的黄金发展期。 国内拥有最多的应用设计工程师与新兴从业人员,但到目前为止,还没有一款位流级别的专用EDA软件,服务用户日常应用开发所需的调试验证工作。 第一大厂商赛…...

Oracle 数据库查询:单表查询

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月22日 专栏&#xff1a;Oracle教程 在 Oracle 数据库操作中&#xff0c;查询数据是最频繁、最核心的操作之一。单表查询&#xff0c;即仅从一个表中检索信息&#xff0c;是所有复杂查询的基础。本笔记将系统梳理单表查询的关…...

【DDD】——带你领略领域驱动设计的独特魅力

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…...

阿里云CentOS系统搭建全攻略:开启云端技术之旅

前期准备&#xff1a;开启云端征程前的必备事项 在当今数字化时代&#xff0c;云计算已成为企业和开发者构建应用和服务的重要基础设施。阿里云作为全球领先的云计算服务提供商&#xff0c;提供了丰富的云计算产品和服务&#xff0c;其中 CentOS 系统在阿里云上的应用非常广泛…...

Flink图之间流转解析:从逻辑构建到物理执行的深度剖析

在Flink强大的数据处理体系中&#xff0c;Table Connectors实现了与外部结构化数据的高效交互&#xff0c;而Flink作业从代码到实际执行的背后&#xff0c;是各类图结构之间的流转与转换。这些图结构承载着作业的逻辑定义、任务划分与资源调度等关键信息&#xff0c;其流转过程…...

详解Redis数据库和缓存不一致的情况及解决方案

数据库与缓存不一致是分布式系统中常见问题&#xff0c;本质是数据在缓存层和存储层出现版本差异。 一、并发写操作导致不一致&#xff08;最常见&#xff09; 场景描述 线程A更新数据库 → 线程B更新数据库 → 线程B更新缓存 → 线程A更新缓存 结果&#xff1a;缓存中存储的…...

【CSS】CSS3媒体查询全攻略

媒体查询教程 媒体查询(Media Queries)是CSS3中引入的强大功能&#xff0c;允许内容根据设备特性(如屏幕尺寸、分辨率、方向等)进行自适应调整。以下是媒体查询的详细教程&#xff1a; 基本语法 media mediatype and (media feature) {/* CSS规则 */ }常用媒体类型 all - 所…...

深入理解Spring的ResponseBodyAdvice接口

什么是ResponseBodyAdvice? ResponseBodyAdvice是Spring框架4.2版本引入的一个非常有用的接口&#xff0c;它允许我们在控制器方法执行后、响应体写入前对响应进行统一处理。这个接口为开发者提供了对返回数据进行统一拦截和修改的能力&#xff0c;是Spring MVC响应处理流程中…...

C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。

C法则5&#xff1a; 在函数调用过程中&#xff0c;具有非引用类型的参数要进行拷贝初始化。 在 C 中&#xff0c;法则5指的是&#xff1a;当函数参数是非引用类型&#xff08;即按值传递&#xff09;时&#xff0c;传递给函数的实参会进行拷贝初始化&#xff08;copy initializ…...

Python 使用 Requests 模块进行爬虫

目录 一、请求数据二、获取并解析数据四、保存数据1. 保存为 CSV 文件2. 保存为 Excel 文件打开网页图片并将其插入到 Excel 文件中 五、加密参数逆向分析1. 定位加密位置2. 断点调试分析3. 复制相关 js 加密代码&#xff0c;在本地进行调试&#xff08;难&#xff09;4. 获取 …...

day039-nginx配置补充

文章目录 0. 老男孩思想-如何提升能力&#xff1f;1. nginx登录认证功能1.1 创建密码文件1.2 修改子配置文件1.3 重启服务 2. nginx处理请求流程3. 配置默认站点4. location 命令5. 案例1-搭建大型直播购物网站5.1 配置本地hosts解析5.2 编写子配置文件5.3 创建相关目录/文件并…...