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

3:OpenCV—视频播放

播放来自文件或相机的视频

在本教程中,我将向您展示如何使用OpenCV从文件或相机/网络摄像头捕获和播放视频。尽管OpenCV没有针对视频处理进行优化,但它提供了一个简单的API来播放视频。在我们的OpenCV程序中,我们所要做的就是从视频文件或相机中提取帧(图像)并在连续循环中显示。

OpenCV与视频的一个限制是它无法捕获视频中的任何声音。因此,您必须使用另一个库(如 FFmpeg)从视频文件或麦克风捕获声音。

播放视频文件

在本节中,我将向您展示如何播放视频文件。首先,应通过将有效位置传递给视频文件来构造 VideoCapture 对象。然后,应逐帧读取视频捕获对象。最后,这些帧应按顺序显示在窗口中。以下是执行上述任务的示例 OpenCV 代码。


#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{// 从一个媒体文件读取并创建VideoCapture对象VideoCapture cap("D:\\project\\vs-opencv\\OpenCVDemo2\\x64\\Debug\\点云应用.mp4");// 判断是成功打开if (!cap.isOpened()){cout << "读取视频失败";cin.get();return -1;}// 获取总fpsdouble fps = cap.get(CAP_PROP_FPS);cout << "每秒帧率为:" << fps << endl;// 创建窗体用于播放视频String videoWinName = "播放视频";namedWindow(videoWinName, WINDOW_NORMAL);// 开始循环读取每一帧进行窗体while (true){Mat frame;bool isSuccess = cap.read(frame);// 判断是否读取成功if (!isSuccess){cout << "读取视频贞失败";break;}// 显示视频贞imshow(videoWinName, frame);// 按ESC键结束播放if (waitKey(10) == 27){cout << "按下了ESC键,停止播放视频";break;}}return 0;
}

将上述简单代码片段复制并粘贴到 IDE 中并运行它。请注意,您必须将代码中的“D:/My OpenCV website/一群鹿奔跑.mp4”替换为计算机中视频的有效位置。然后,您应该会看到如下图所示的窗口。

解释

让我们逐行浏览上面的代码。


//#include "stdafx.h"#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;

这些是我们程序中使用的包含文件和命名空间。

VideoCapture cap("C:/Users/Desktop/点云应用.mp4"); 

这是 VideoCapture 类中为数不多的构造函数之一。此构造函数将打开视频文件并初始化 VideoCapture 对象,以便从指定文件中读取视频流。

此类的析构函数将取消分配与打开的视频文件关联的任何内存。因此,无需在程序中显式取消分配内存。
如果上一次对 VideoCapture 构造函数的调用成功,cap.isOpened() 函数将返回 true。否则它将返回 false。如果函数返回 false,程序将向控制台打印一条消息,等待任何按键并以退出代码 -1 退出程序。

在播放视频之前,必须检查 VideoCapture 对象是否已成功初始化,以避免可能的崩溃。


if (cap.isOpened() == false)  
{cout << "Cannot open the video file" << endl;cin.get(); //wait for any key pressreturn -1;
}
//cap.set(CAP_PROP_POS_MSEC, 300); 

如果您想在中间开始视频,您可以取消注释此行。您也可以在 while 循环中调用此函数。

bool VideoCapture::set**(int propId, double value)**

可以使用 VideoCapture::set 函数更改 VideoCapture 对象的某些属性。对于支持的属性,此函数将返回 true。否则它将返回 false。

  1. propID - 要更改的 VideoCapture 对象的属性。可以更改的最常见属性是

    • CAP_PROP_POS_MSEC - 视频文件的当前位置(以毫秒为单位)
  • CAP_PROP_POS_FRAMES - 接下来要捕获的帧的相对位置(从 0 开始,例如 - 0、1、2、3 等)
  1. value - 指定属性的新值

ouble fps = cap.get(CAP_PROP_FPS); 
cout << "Frames per seconds : " << fps << endl;

这2行将获取视频的帧率并在控制台中打印。您也可以在 while 循环中调用此函数。

double VideoCapture::**get(int propId) const**

此函数返回 VideoCapture 对象的指定属性的值。对于不受支持的属性,此函数将返回 0。

  1. propId - 此参数指定要获取的 VideoCapture 对象的属性。最常见的属性是

    • CAP_PROP_POS_MSEC - 视频文件的当前位置(以毫秒为单位)
  • CAP_PROP_POS_FRAMES - 接下来要捕获的帧的相对位置(从 0 开始,例如 - 0、1、2、3 等)
  • CAP_PROP_FRAME_WIDTH - 视频中帧的宽度
  • CAP_PROP_FRAME_HEIGHT - 视频中帧的高度
  • CAP_PROP_FPS - 视频的帧速率
  • CAP_PROP_FOURCC - 编解码器的4个字符的代码
  • CAP_PROP_FRAME_COUNT - 视频文件中的总帧数

tring window_name = "My First Video";
namedWindow(window_name, WINDOW_NORMAL); //create a window

第一行指定窗口的名称。此名称稍后将用于标识代码中的窗口。

第二行将创建一个传递窗口名称和标志WINDOW_NORMAL的窗口。使用此标志,创建的窗口将变得可重新调整大小。

第二行将在while循环中逐个读取视频文件中的帧并将其存储在*帧*中。


Mat frame;
bool bSuccess = cap.read(frame); // read a new frame from video

if (bSuccess == false) 
{cout << "Video is completed" << endl;break;
}

当没有更多的帧要从视频文件中捕获时,*cap.read(frame)* 函数将返回 false。放置此 if 块以在 bSuccess 变为 false 时中断视频文件末尾的 while 循环。
此行将在上一步中创建的窗口中显示视频文件的每一帧。

此函数后应跟 waitKey(int) 函数,以便提供足够的时间在指定的持续时间(以毫秒为单位)内在窗口中绘制和显示帧。如果不调用waitKey(int)函数,则框架将不会显示在窗口中。

waitKey 函数等待 10 毫秒。如果在指定时间之前按下了某个键,它将返回按下的键的 ASCII 值。如果该值为 27(Esc 键的 ASCII 值为 27),程序将在 if 块内执行并中断 while 循环。如果在 10 毫秒内没有按下任何键,该函数将返回 -1,程序将继续 while 循环。


imshow(window_name, frame);
if (waitKey(10) == 27)
{cout << "Esc key is pressed by user. Stoppig the video" << endl;break;
}
总结

在上面的部分中,您已经了解到,
- 如何从文件加载视频
- 如何逐个读取视频的每一帧,并在一段时间循环中将其显示在窗口中
- 如何打破视频末尾的while循环
- 如果在视频结束前按下特定键,如何中断 while 循环

从相机/网络摄像头捕获和播放视频

在本节中,将学习如何从连接到个人计算机的相机/网络摄像头捕获和播放视频。

该程序与上述程序的主要区别在于使用VideoCapture构造函数。在此程序中,只需要将相机/网络摄像头的索引提供给 VideoCapture 对象的构造函数,而不是视频文件名。这是示例 OpenCV 代码。


#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{// 从一个媒体文件读取并创建VideoCapture对象VideoCapture cap(0);// 判断是成功打开if (!cap.isOpened()){cout << "读取视频失败";cin.get();return -1;}// 获取总fpsdouble fps = cap.get(CAP_PROP_FPS);cout << "每秒帧率为:" << fps << endl;double dWidth = cap.get(CAP_PROP_FRAME_WIDTH); //获取贞的宽度double dHeight = cap.get(CAP_PROP_FRAME_HEIGHT); //获取贞高度cout << "贞的分辨率 : " << dWidth << " x " << dHeight << endl;// 创建窗体用于播放视频String videoWinName = "实时采集图像";namedWindow(videoWinName, WINDOW_NORMAL);// 开始循环读取每一帧进行窗体while (true){Mat frame;bool isSuccess = cap.read(frame);// 判断是否读取成功if (!isSuccess){cout << "读取视频贞失败";break;}// 显示视频贞imshow(videoWinName, frame);// 按ESC键结束播放if (waitKey(10) == 27){cout << "按下了ESC键,停止图像采集";break;}}return 0;
}
解释
VideoCapture cap(0);

此行将使用默认相机和默认后端初始化 VideoCapture 对象。

VideoCapture**::VideoCapture(int index)**

这是 VideoCapture 类中为数不多的构造函数之一。此构造函数初始化并打开参数索引指定的相机。

可以为参数索引传递 0 以使用连接到计算机的默认相机。如果您的计算机连接到 1 台以上的相机,则可以使用正整数作为索引。

此类的析构函数将取消分配与此对象关联的任何内存。因此,无需在程序中显式取消分配内存。


ouble dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video
cout << "Resolution of the video : " << dWidth << " x " << dHeight << endl;

第一行将获得相机输出帧的宽度(以像素为单位)。下一行将获得相机输出帧的高度。然后它打印相机输出的分辨率,即(宽 x 高)。
所有其他代码行与播放视频文件的第一个程序相同。

相关文章:

3:OpenCV—视频播放

播放来自文件或相机的视频 在本教程中&#xff0c;我将向您展示如何使用OpenCV从文件或相机/网络摄像头捕获和播放视频。尽管OpenCV没有针对视频处理进行优化&#xff0c;但它提供了一个简单的API来播放视频。在我们的OpenCV程序中&#xff0c;我们所要做的就是从视频文件或相…...

AI工程 新技术追踪 探讨

文章目录 一、核心差异维度对比二、GitHub对AI工程师的独特价值三、需要警惕的陷阱四、推荐追踪策略五、与传统开发的平衡建议 以下内容整理来自 deepseek 作为AI工程师&#xff0c;追踪GitHub开源项目 对技术成长和职业发展的影响 比传统应用开发工程师 更为显著&#xff0c;…...

C++:函数模板

所谓函数模板就是定义一个通用的函数&#xff0c;不指定具体的参数&#xff0c;用一个虚拟参数代替&#xff1b; 当函数调用时&#xff0c;会根据实参判断具体的类型。 注意&#xff1a;不要使用默认参数&#xff1b;可以重载但尽量不要重载。 #include<iostream> usi…...

一款适配国内的视频软件,畅享大屏与局域网播放

软件介绍 今天要给大家安利一款超强视频播放软件——MXPlayer。它的解码实力堪称一绝&#xff0c;市面上不管是常见的 MP4、MKV 格式&#xff0c;还是对播放设备要求极高的超高清 4K、HDR 视频&#xff0c;甚至那些鲜为人知的冷门格式&#xff0c;它统统都能流畅播放&#xff…...

SONiC系统之高速数据遥测High Frequency Telemetry

SONiC系统之高速数据遥测High Frequency Telemetry 数据遥测 这篇文章介绍了SONiC系统支持Telemetry的软件架构以及gNMI接口中Telemetry Streaming功能Dial-in和Dial-out两者模式的区别。正如该文指出的那样&#xff0c;该结构面临扩展性问题&#xff0c;当AI训练、推理等大型…...

【Java ee初阶】jvm(3)

一、双亲委派机制&#xff08;类加载机制中&#xff0c;最经常考到的问题&#xff09; 类加载的第一个环节中&#xff0c;根据类的全限定类名&#xff08;包名类名&#xff09;找到对应的.class文件的过程。 JVM中进行类加载的操作&#xff0c;需要以来内部的模块“类加载器”…...

C++ for QWidget:connect(连接)

语法&#xff1a; QObject::connect(发射信号的对象,发射的信号,接收信号的对象,接收后执行的命令) #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui-&g…...

uni-app学习笔记七-vue3事件处理

本文主要用于记录vue3中的点击事件和change事件 点击事件&#xff1a;v-on:click,可简写为click change事件&#xff0c;用于监听值发生改变的的事件处理&#xff1a;change 示例代码&#xff1a; <template><view class"box" click"onClick"…...

【C++进阶篇】C++容器完全指南:掌握set和map的使用,提升编码效率

C容器的实践与应用&#xff1a;轻松掌握set、map与multimap的区别与用法 一. 序列式容器与关联式容器1.1 序列式容器 (Sequential Containers)1.2 关联式容器 (Associative Containers) 二. set系列使用2.1 set的构造和迭代器2.2 set的增删查2.2.1 插入2.2.2 查找2.2.3 删除 2.…...

吴恩达机器学习(1)——机器学习算法分类

1、机器学习算法 1、监督学习 在实际应用中最为常见的快速进度结果 2、非监督学习 2、监督学习&#xff08;Supervised Learning&#xff09; 2.1、回归算法 [!note] 监督学习 是指学习从 x -> y 或者从输入到输出映射的算法 监督学习的关键特征是你给学习算法提供学习…...

我的创作纪念日——512天

2023 年 12 月 19 日&#xff0c;我撰写了第 1 篇记录型博客《数据结构课程设计——报数问题》&#xff0c;这是我记录一段实践经验的开始。 回望那时的自己&#xff0c;还很稚嫩&#xff0c;刚刚迈入计算机的大门不久&#xff0c;一切都显得新鲜而充满挑战。今天是我成为创作者…...

SpringBoot快速上手

1.Maven Maven是项目管理工具&#xff0c;通过pom.xml文件来获取jar包&#xff0c;而不用手动去添加jar包 引入依赖之后需要刷新maven&#xff0c;以下这两个地方都可以 中央仓库 &#xff1a; Central Repository: Maven Repository: Central 2.Spring Boot 2.1创建项目…...

自动化:批量文件重命名

自动化&#xff1a;批量文件重命名 1、前言 2、效果图 3、源码 一、前言 今天来分享一款好玩的自动化脚&#xff1a;批量文件重命名 有时候呢&#xff0c;你的文件被下载下来文件名都是乱七八糟毫无规律&#xff0c;但是当时你下载的时候没办法重名或者你又不想另存为重新重…...

低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player

在实时视频流的应用中&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;播放器扮演着至关重要的角色&#xff0c;尤其是在视频监控、远程医疗、直播等高实时性需求的场景中。随着行业需求的不断升级&#xff0c;对播放器的低延迟、稳定性、兼容性等方面的…...

java中的Servlet2.x详解

一、Servlet 2.x 版本演进与核心特性 Servlet 2.x 是 Java Web 开发中承上启下的重要版本系列&#xff0c;主要包括 Servlet 2.4 和 Servlet 2.5 两个子版本。以下是其核心特性与改进&#xff1a; Servlet 2.4&#xff08;2003年发布&#xff09; XML Schema 支持&#xff1a;…...

大模型deepseek如何助力数据安全管理

敏感数据识别与处理 精准定位敏感信息 &#xff1a;运用多模态识别引擎技术&#xff0c;快速扫描上传文件与输入内容&#xff0c;精准识别身份证号、银行卡号、商业合同关键信息等各类敏感数据&#xff0c;并支持金融、医疗等行业定制化规则库&#xff0c;满足不同行业的特殊需…...

【linux驱动】【设备树】按键设备树讲解

设备树你添加电源键示例。 / {gpio-keys {compatible = "gpio-keys";#address-cells = <1>;#size-cells = <0>;button@1 {label = "Power Button";linux,code = <KEY_POWER>; // 按键编码,定义在include/uapi/linux/input-event-code…...

Vibe Coding:编程中的氛围与效率的艺术

引言 在软件开发的世界里&#xff0c;我们常常关注语言特性、框架选择和算法效率&#xff0c;却较少讨论一个同样重要的因素——编程时的"氛围"&#xff08;vibe&#xff09;。Vibe Coding是一种关注开发者心理状态、工作环境和整体"感觉"的编程方法论。它…...

算法岗实习八股整理——深度学习篇(不断更新中)

目录 激活函数特征典型例子sigmod函数tanh函数补充&#xff1a;零中心化输出优势非线性特性如何提升神经网络表现 激活函数 特征 非线性&#xff1a;激活函数满足非线性时&#xff0c;才不会被单层网络替代&#xff0c;神经网络才有意义可微性&#xff1a;优化器大多数是用梯…...

Java IO及Netty框架学习小结

Netty netty官网: Netty 什么是Netty&#xff1f; Netty 是 一个异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。Netty 是一个 NIO 客户端服务器框架&#xff0c;可以快速轻松地开发网络应用程序&#xff08;例如协议服务器和客…...

理想AI Talk第二季-重点信息总结

一、TL&#xff1b;DR 理想为什么要做自己的基模&#xff1a;座舱家庭等特殊VLM场景&#xff0c;deepseek/openai没有解决理想的基模参数量&#xff1a;服务端-300B&#xff0c;VLencoder-32B/3.6B&#xff0c;日常工作使用-300B&#xff0c;VLA-4B为什么自动驾驶可以达成&…...

软件架构之-论软件系统架构评估以及应用

论软件系统架构评估以及应用 摘要正文 摘要 2023年2月&#xff0c;本人所在集团公司承接了长三角地区某省渔船图纸电子化审查系统项目开发&#xff0c;该项目旨在为长三角地区渔船建造设计院&#xff0c;以及渔船图纸审查机构提供一个便捷化的服务平台。在此项目中&#xff0c;…...

Java面试实战:从Spring Boot到分布式缓存的深度探索

Java面试实战&#xff1a;从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂&#xff0c;面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信&#xff0c;迎接这场技术“拷问”。 第一轮&#xff1a;基础问题 老王&#…...

2025年全国青少年信息素养大赛C++小学全年级初赛试题

一、单选题 1、在C中&#xff0c;表示逻辑运算符 "或" 的是&#xff1f;&#xff08; &#xff09;&#xff08;5 分&#xff09; A&#xff0e;|| B&#xff0e;& C&#xff0e; D&#xff0e; 解析&#xff1a;||是或者&#xff0c; &&是并且 2、…...

React中巧妙使用异步组件Suspense优化页面性能。

文章目录 前言一、为什么需要异步组件&#xff1f;1. 性能瓶颈分析2. 异步组件的价值 二、核心实现方式1. React.lazy Suspense&#xff08;官方推荐&#xff09;2. 路由级代码分割&#xff08;React Router v6&#xff09; 总结 前言 在 React 应用中&#xff0c;随着功能复…...

nginx相关面试题30道

一、基础概念与核心特性 1. 什么是 Nginx&#xff1f;它的主要用途有哪些&#xff1f; 答案&#xff1a; Nginx 是一款高性能的开源 Web 服务器、反向代理服务器及负载均衡器&#xff0c;基于事件驱动的异步非阻塞架构&#xff0c;擅长处理高并发场景。 主要用途&#xff1a;…...

java中的Servlet1.x详解

Servlet 1.x 是 Java Web 开发的早期规范&#xff0c;为后续版本奠定了基础。以下是其核心特性、使用方式及与现代版本的对比分析&#xff1a; 一、Servlet 1.x 的核心特性 基础接口与实现 Servlet 1.x 的核心是 javax.servlet.Servlet 接口&#xff0c;开发者必须直接实现其五…...

给大模型“贴膏药”:LoRA微调原理说明书

一、前言&#xff1a;当AI模型开始“叛逆” 某天&#xff0c;我决定教deepseek说方言。 第一次尝试&#xff08;传统微调&#xff09;&#xff1a; 我&#xff1a;给deepseek灌了100G东北小品数据集&#xff0c;训练三天三夜。结果&#xff1a;AI确实会喊“老铁666”了…但英…...

【数字电路】第七章 脉冲波形的产生与整形电路

一、脉冲波形的产生与整形电路概述 1.矩形脉冲的获得方法 2.矩形脉冲的主要参数 3.本章所涉及的电路 4.稳态与暂稳态 电路的暂稳态实际上是通过RC电路的充放电来实现的。 5.TTL电路输入等效电路 6.TTL电路的输出等效电路 7.CMOS电路的输入等效电路 8.CMOS电路的输出等效电路 …...

React Flow 边的基础知识与示例:从基本属性到代码实例详解

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…...

DB-MongoDB-00002--Workload Generator for MongoDB

## DB-MongoDB-00002–Workload Generator for MongoDB 1、介绍 Workload Generator for MongoDB was designed to help MongoDB users effortlessly generate data and simulate workloads for both sharded and non-sharded clusters. The generated workloads include s…...

buck变换器的simulink/matlab仿真和python参数设计

什么是Buck电路? BUCK电路是一种降压斩波器&#xff0c;降压变换器输出电压平均值Uo总是小于输出电压UD。通常电感中的电流是否连续&#xff0c;取决于开关频率、滤波电感L和电容C的数值。BUCK也是DC-DC基本拓扑&#xff0c;或者称为电路结构&#xff0c;是最基本的DC-DC电路…...

谷歌地球引擎GEE将多个遥感影像作为多个波段合并成一张图像并下载的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;下载多年的逐日的ERA5土壤湿度数据&#xff0c;并在下载时&#xff0c;将每年同月份内的每一天的图像作为一个波段加以合并的方法。 在之前的文章GEE谷歌地球引擎批量下载逐日…...

Debezium快照事件监听器系统设计

Debezium快照事件监听器系统设计 1. 系统概述 1.1 设计目标 为 Debezium 的快照过程提供可扩展的事件监听机制允许外部系统在快照过程中执行自定义逻辑提供线程安全的事件分发机制确保监听器的异常不会影响主快照流程1.2 核心功能 表快照开始事件监听表快照完成事件监听行数据…...

选择之困:如何挑选合适的 Python 环境与工具——以 Google Colaboratory 为例

引言:选择之困与 Python 的多样性 在过去的十年中,Python 编程语言以其简洁的语法、强大的功能和广泛的适用性迅速崛起,成为全球最受欢迎的编程语言之一。从数据科学到 Web 开发,从自动化脚本到人工智能,Python 无处不在。然而,这种多样性和快速发展也带来了一个显著的问…...

基于Java+MySQL+Servlet的留言系统开发全解析

本系统基于Java Web技术栈开发&#xff0c;采用前后端分离架构&#xff0c;后端通过Servlet实现业务逻辑&#xff0c;前端使用HTML/CSS/JavaScript构建交互界面。本文将详细解析系统设计思路、技术实现与核心代码&#xff0c;助您快速掌握留言系统开发精髓。 一、项目简介 本留…...

实操分享java应用容器化,使用docker作为容器工具

### 一. 目的 将现有的java应用容器化,使用docker作为容器工具。 ### 二. 配置 #### 1. Java应用中的配置 ##### a. Java子项目中的pom文件配置 ```xml <build> <plugins> <plugin> <groupId>org.spring…...

李臻20242817_安全文件传输系统项目报告_第12周

安全文件传输系统项目报告&#xff08;第 9 周&#xff09; 1. 代码链接 Gitee 仓库地址&#xff1a;https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明&#xff1a; project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…...

19-I2C库函数

一、IIC配置流程 IIC配置流程需要添加的库函数&#xff1a;stm32f4xx_i2c.c 1、理解电路原理图 SCL --- PB8 SDA -- PB9 使用I2C1 2、配置I2C库函数的步骤 &#xff08;1&#xff09;使能GPIOB组时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);&#xff08;2…...

minicom串口调试助手

sudo apt-get install minicom 配置 sudo minicom -s 然后用方向键向下移动到“Serial port setup”&#xff0c;回车 按键盘“A”把串口的映射文件名输入。 按键盘“E”可以修改波特率 按键盘“F”把硬件流关闭&#xff0c;否则minicom可能无法接收键盘输入。 配置好后&…...

扫描件交叉合并PDF免费软件 拖拽即合并 + 自动对齐页码 档案整合更轻松

各位办公小能手们&#xff01;我跟你们说啊&#xff0c;今天要给你们介绍个超厉害的工具&#xff0c;叫PDFCrossMerge。这玩意儿就像一个神奇的文档小魔法师&#xff0c;专门搞PDF扫描件交叉合并的事儿&#xff0c;能解决单面扫描文件正反面页码顺序的大难题。 先说说它的核心…...

atcoder C - ~

https://atcoder.jp/contests/abc406/tasks/abc406_c 题目简述&#xff1a; 给定一个序列p&#xff0c;让你求出p的所有子序列中波浪形序列的个数 波浪形序列的定义&#xff1a;1&#xff1a;长度>4&#xff1b;2&#xff1a;仅存在一个波峰和波谷&#xff1b;3&#xff1…...

PCB设计实践(十八)PCB设计铜厚选择及分层设计深度解析

PCB铜箔厚度作为电路板设计的核心参数之一&#xff0c;直接影响电路性能、可靠性及成本。本文将从铜厚选择的六大核心要素、多层板分层设计的策略、制造工艺的耦合关系三大维度&#xff0c;系统性解析PCB铜厚设计的工程方法论&#xff0c;并结合典型应用场景提供决策框架。 一、…...

React 19中如何向Vue那样自定义状态和方法暴露给父组件。

文章目录 前言一、什么是 useImperativeHandle&#xff1f;1.1 为什么需要 useImperativeHandle&#xff1f;1.2 基本语法 二、useImperativeHandle 的常见用法3.1 暴露自定义方法3.2子组件封装的弹窗关闭方法暴露给外部 注意点&#xff1a;总结 前言 在 React 的函数组件中&a…...

【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现

【Linux高级全栈开发】2.1.2 事件驱动reactor的原理与实现 高性能网络学习目录 基础内容&#xff08;两周完成&#xff09;&#xff1a; 2.1网络编程 2.1.1多路复用select/poll/epoll2.1.2事件驱动reactor2.1.3http服务器的实现 2.2网络原理 百万并发PosixAPIQUIC 2.3协程库…...

1.5 MouseDown,MouseUp,LostMouseCapture的先后顺序

本文目标是实现如下功能: 按下一个按钮后置位某变量;鼠标松开后复位某个变量? 看似简单,但是一般来说会存在如下两种现象: 鼠标移出按钮:默认会丢失鼠标事件跟踪,即MouseLeftButtonUp事件并不会被触发。 焦点切换:Tab 键切换焦点会干扰按钮的事件捕获 本文通过几个…...

备战!全国青少年信息素养大赛图形化编程-省赛——求最小公倍数

备战&#xff01;全国青少年信息素养大赛图形化编程-省赛——求最小公倍数 题目可点下方去处&#xff0c;支持在线编程~ 求最小公倍数_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点击下方去处&#xff0c;支持源码和素材获取~ 求最小公倍数-scratch作品-少儿编程题库学习…...

Vue3进行工程化项目,保姆级教学(编译软件:vscode)大部分编译平台适用

目录 1. 创建vue工程 1.1 第一步 1.2 选择名称和工件 1.3 选择语言 1.4 自动下载js 1.5 运行vue工程 1.6 成功页面 2. 更改vue工程安装的位置 3. 更改运行工程方式 第一步 第二步 ​编辑 第三步 调试 ​编辑 运行项目 前面所学都是vue3的基础&#xff0c;为了简…...

通过觅思文档项目实现Obsidian文章浏览器在线访问

觅思文档项目开源地址 觅思文档项目开源地址&#xff1a;https://gitee.com/zmister/MrDoc 觅思文档部署步骤概览 服务器拉取代码&#xff1a; git clone https://gitee.com/zmister/mrdoc-install.git && cd mrdoc-install && chmod x docker-install.sh &a…...

⭐️白嫖的阿里云认证⭐️ 第二弹【课时1:提示词(Prompt)技巧】for 「大模型Clouder认证:利用大模型提升内容生产能力」

「大模型Clouder认证:利用大模型提升内容生产能力」这个认证目前在阿里云认证中心还是免费的,简单几步就可以申请考试,有两次的免费考试机会。而且,这个课程中的内容对于所有普通用户来说都非常实用,课程整体长度也就3节课,非常快速就能学完。心动不如行动,赶紧开始吧!…...