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

用OpenCV写个视频播放器可还行?(C++版)

引言

提到OpenCV,大家首先想到的可能是图像处理、目标检测,但你是否想过——用OpenCV实现一个带进度条、倍速播放、暂停功能的视频播放器?本文将通过一个实战项目,带你深入掌握OpenCV的视频处理能力,并解锁以下功能:

  • 基础播放/暂停
  • 动态倍速调节(0.5x~4x)
  • 交互式进度条
  • 实时时间戳显示

文末提供完整代码,可直接运行!

一、环境准备

安装OpenCV

请参考其他博客,C++版本的OpenCV安装,每个操作系统都有自己的玩法。比如我在Ubuntu中下载了OpenCV 4.11版本的源码自行编译。可以参考我的上一篇文章

准备测试视频

准备一个MP4或AVI格式的视频文件(示例代码路径为/home/user/video.mp4,读者自行替换)。

二、核心功能实现

1. 基础播放器

#include <opencv2/opencv.hpp>int main() {// 1. 创建视频捕获对象(核心对象)cv::VideoCapture cap("video.mp4");// 2. 主循环(核心逻辑)while(true) {cv::Mat frame;// 3. 读取帧(核心方法)if (!cap.read(frame)) break;// 4. 显示帧(核心输出)cv::imshow("Video", frame);// 5. 控制逻辑(核心交互)int key = cv::waitKey(25); // 控制播放速度if(key == 27) break;       // ESC退出}// 6. 资源释放(核心清理)cap.release();cv::destroyAllWindows();return 0;
}

代码解析

  • VideoCapture:支持文件、摄像头、网络流多种输入源。
  • waitKey(25):控制播放速度(25ms对应约40 FPS)。

三、功能扩展:让播放器更强大

1. 倍速播放

通过调整waitKey的延迟时间实现变速:

#include <opencv2/opencv.hpp>int main() {cv::VideoCapture cap("video.mp4");double fps = cap.get(cv::CAP_PROP_FPS);int base_delay = 1000 / fps;  // 基准延迟double speed = 1.0;  // 初始速度while(true) {cv::Mat frame;if(!cap.read(frame)) break;cv::imshow("Video", frame);// 核心控制逻辑int delay = static_cast<int>(base_delay / speed);int key = cv::waitKey(std::max(1, delay)); if(key == 27) break;        // ESC退出else if(key == '+') speed = std::min(4.0, speed + 0.5); // 加速else if(key == '-') speed = std::max(0.5, speed - 0.5); // 减速}cap.release();cv::destroyAllWindows();return 0;
}

按+加速,按-减速,速度范围限制在0.5x~4x。

2. 进度条与跳转

利用OpenCV的滑动条控件实现交互:

#include <opencv2/opencv.hpp>using namespace cv;// 全局变量
VideoCapture cap;
int currentFrame = 0;
int totalFrames = 0;// 进度条回调函数
void onTrackbar(int pos, void* userdata) {cap.set(CAP_PROP_POS_FRAMES, pos);currentFrame = pos;
}int main() {cap.open("video.mp4");totalFrames = cap.get(CAP_PROP_FRAME_COUNT);namedWindow("Video Player");createTrackbar("Progress", "Video Player", &currentFrame, totalFrames, onTrackbar);Mat frame;while(true) {cap.read(frame);if(frame.empty()) break;// 更新当前帧位置currentFrame = cap.get(CAP_PROP_POS_FRAMES);setTrackbarPos("Progress", "Video Player", currentFrame);imshow("Video Player", frame);if(waitKey(30) == 27) break; // ESC退出}cap.release();destroyAllWindows();return 0;
}

3. 实时信息叠加

在视频帧上绘制进度条和时间戳:

    void drawOverlay(Mat& frame) {int videoWidth = frame.cols;float progressRatio = static_cast<float>(currentFrame) / totalFrames;int progressWidth = static_cast<int>(videoWidth * progressRatio);rectangle(frame, Point(0, 10), Point(progressWidth, 30), Scalar(0, 255, 0), FILLED);double currentTime = currentFrame / fps;ostringstream timeText;timeText << "Time: " << fixed << setprecision(2) << currentTime << "s";putText(frame, timeText.str(), Point(10, 60), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 255, 0), 2);ostringstream speedText;speedText << "Speed: " << fixed << setprecision(1) << speed << "x";putText(frame, speedText.str(), Point(10, 100), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 255, 0), 2);}

四、完整代码

注意,完整代码中头文件是分开引入的。只引入了opencv两个模块:highgui和imgproc。并优化了快进时CPU占用100%的问题,当然,也将程序引入了复杂的困境。

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <string>
#include <sstream>using namespace cv;
using namespace std;
using namespace chrono;class VideoPlayer {
private:VideoCapture cap;int totalFrames;double fps;int baseDelay;bool pause;int currentFrame;double speed;string windowName;high_resolution_clock::time_point lastFrameTime;static void onTrackbar(int pos, void* userdata) {VideoPlayer* self = static_cast<VideoPlayer*>(userdata);if (self->currentFrame != pos) {self->cap.set(CAP_PROP_POS_FRAMES, pos);self->currentFrame = pos;}}void drawOverlay(Mat& frame) {int videoWidth = frame.cols;float progressRatio = static_cast<float>(currentFrame) / totalFrames;int progressWidth = static_cast<int>(videoWidth * progressRatio);rectangle(frame, Point(0, 10), Point(progressWidth, 30), Scalar(0, 255, 0), FILLED);double currentTime = currentFrame / fps;ostringstream timeText;timeText << "Time: " << fixed << setprecision(2) << currentTime << "s";putText(frame, timeText.str(), Point(10, 60), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 255, 0), 2);ostringstream speedText;speedText << "Speed: " << fixed << setprecision(1) << speed << "x";putText(frame, speedText.str(), Point(10, 100), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(0, 255, 0), 2);}public:VideoPlayer(const string& videoPath) :windowName("OpenCV Video Player"),pause(false),currentFrame(0),speed(1.0) {cap.open(videoPath);if (!cap.isOpened()) {throw runtime_error("无法打开视频文件");}totalFrames = static_cast<int>(cap.get(CAP_PROP_FRAME_COUNT));if (totalFrames <= 0) {throw runtime_error("无效的视频文件");}fps = cap.get(CAP_PROP_FPS);baseDelay = static_cast<int>(1000.0 / fps);namedWindow(windowName, WINDOW_AUTOSIZE);createTrackbar("Progress", windowName, nullptr, totalFrames, onTrackbar, this);setTrackbarPos("Progress", windowName, 0);lastFrameTime = high_resolution_clock::now();}void run() {Mat frame;int64 frameCounter = 0;double accumulatedDelay = 0;while (true) {auto startTime = high_resolution_clock::now();if (!pause) {// 动态帧处理控制double speedFactor = max(0.5, min(4.0, speed));int framesToProcess = static_cast<int>(speedFactor);int actuallyProcessed = 0;for (int i = 0; i < framesToProcess; ++i) {bool ret = cap.read(frame);if (!ret) {cap.set(CAP_PROP_POS_FRAMES, 0);currentFrame = 0;setTrackbarPos("Progress", windowName, currentFrame);break;}currentFrame = static_cast<int>(cap.get(CAP_PROP_POS_FRAMES));actuallyProcessed++;}if (actuallyProcessed > 0) {// 更新进度条(每5帧更新一次以降低开销)if (frameCounter++ % 5 == 0) {setTrackbarPos("Progress", windowName, currentFrame);}drawOverlay(frame);imshow(windowName, frame);}}// 智能延迟控制auto processTime = duration_cast<milliseconds>(high_resolution_clock::now() - startTime).count();int targetDelay = static_cast<int>((baseDelay / speed) - processTime);int actualDelay = max(1, targetDelay);int key = waitKeyEx(actualDelay);handleKeyInput(key);// 自动跳帧机制(当处理落后时)if (targetDelay < 0 && speed > 1.0) {int skipFrames = static_cast<int>(-targetDelay / baseDelay * speed);currentFrame = min(currentFrame + skipFrames, totalFrames - 1);cap.set(CAP_PROP_POS_FRAMES, currentFrame);}}}private:void handleKeyInput(int key) {switch (key) {case 27: // ESCcap.release();destroyAllWindows();exit(0);case 32: // Spacepause = !pause;break;case '+':speed = min(4.0, speed + 0.5);cout << "Speed: " << speed << "x" << endl;break;case '-':speed = max(0.5, speed - 0.5);cout << "Speed: " << speed << "x" << endl;break;}}
};int main() {try {VideoPlayer player("C:\\Users\\lebro\\Videos\\video_test.mp4");player.run();}catch (const exception& e) {cerr << "Error: " << e.what() << endl;return -1;}return 0;
}

五、后记

请参考《学习OpenCV3》,第二章 OpenCV初探中的第二个程序:视频。

相关文章:

用OpenCV写个视频播放器可还行?(C++版)

引言 提到OpenCV&#xff0c;大家首先想到的可能是图像处理、目标检测&#xff0c;但你是否想过——用OpenCV实现一个带进度条、倍速播放、暂停功能的视频播放器&#xff1f;本文将通过一个实战项目&#xff0c;带你深入掌握OpenCV的视频处理能力&#xff0c;并解锁以下功能&a…...

clion+arm-cm3+MSYS-mingw +jlink配置用于嵌入式开发

0.前言 正文可以跳过这段 初识clion&#xff0c;应该是2015年首次发布的时候&#xff0c; 那会还是大三&#xff0c;被一则推介广告吸引到&#xff0c;当时还在用vs studio&#xff0c;但是就喜欢鼓捣新工具&#xff0c;然后下载安装试用了clion&#xff0c;但是当时对cmake规…...

物联网-IoTivity:开源的物联网框架

IoTivity 是一个开源的物联网(IoT)框架,旨在为物联网设备提供互操作性、安全性和可扩展性。它由 Open Connectivity Foundation (OCF) 主导开发,遵循 OCF 的标准,致力于实现设备之间的无缝连接和通信。IoTivity 提供了一个统一的框架,支持设备发现、数据交换、设备管理和…...

Acrobat DC v25.001 最新专业版已破,像word一样编辑PDF!

在数字化时代&#xff0c;PDF文件以其稳定性和通用性成为了文档交流和存储的热门选择。无论是阅读、编辑、转换还是转曲&#xff0c;大家对PDF文件的操作需求日益增加。因此&#xff0c;一款出色的PDF处理软件不仅要满足多样化的需求&#xff0c;还要通过简洁的界面和强大的功能…...

【c++】模板进阶

在前面我们学习了模板的基础用法【c】 模板初阶-CSDN博客初步认识了函数模板和类模板&#xff0c;接下来让我们看看模板还有哪些进阶的应用。 非类型模板参数 之前我们用到的模板全都使用了类型参数 类型参数&#xff1a;表示某种数据类型&#xff08;如 int、double、自定义…...

IntelliJ IDEA 2021版创建springboot项目的五种方式

第一种方式&#xff0c;通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式&#xff0c;通过https://start.spring.io官网来直接创建springboot项目压缩包&#xff0c;然后导入至我们的idea中。 点击generate后&#xff0c;即可生成压缩包&#xf…...

数字信号处理之信号功率谱计算welch方法(分段加窗平均周期图)、Bartlett方法(周期图)(Python)

welch方法原理说明 welch方法[1]通过将数据划分为重叠的段&#xff0c;计算每个段的进行修改(加窗)后的周期图&#xff0c;然后对所有段的周期图求和进行平均&#xff0c;得到最终的功率谱密度。 Python和Matlab中均存在welch函数。welch函数通过配置noverlap为0&#xff0c;可…...

【面试】Java 基础

基础 1、Java 中几种基本数据类型什么&#xff0c;各自占用多少字节2、基本数据同包装类的区别3、Java 基本类型的参数传递和引用类型的参数传递有啥区别4、隐式类型转换和显式类型转换5、switch 语句表达式结果的类型6、数组的扩容方式7、面向对象三大特征8、静态变量和成员变…...

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)

IDEA 社区版如何创建 Spring Boot 项目&#xff08;详细教程&#xff09; Spring Boot 以其简洁、高效的特性&#xff0c;成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导&#xff0c;但 社区版&#xff08;Community Edition&#xff09…...

CTFHub-FastCGI协议/Redis协议

将木马进行base64编码 <?php eval($_GET[cmd]);?> 打开kali虚拟机&#xff0c;使用虚拟机中Gopherus-master工具 Gopherus-master工具安装 git clone https://github.com/tarunkant/Gopherus.git 进入工具目录 cd Gopherus 使用工具 python2 "位置" --expl…...

【Python字符串】\n是什么?它与raw字符串、多行字符串的运用有什么关系?

李升伟 整理 在Python中&#xff0c;\n 是换行符&#xff0c;用于在字符串中表示新的一行。当你在字符串中使用 \n 时&#xff0c;Python 会在该位置插入一个换行符&#xff0c;使得输出在 \n 处换行。 1. 普通字符串中的 \n 在普通字符串中&#xff0c;\n 会被解释为换行符…...

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址&#xff0c;每次启动虚拟机服务都是不一样的 IP&#xff0c;因此要配置静态 IP 地址避免每次都发生变化&#xff0c;下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念&#xff1a; 动态 IP…...

git lfs使用方法指南【在github保存100M以上大文件】

为了在 GitHub 仓库中存储超过 100MB 的大文件并避免推送失败&#xff0c;使用 Git LFS&#xff08;Large File Storage&#xff09; 是最佳解决方案。以下是详细步骤&#xff1a; 一、安装 Git LFS 下载并安装 Git LFS&#xff1a; 访问 Git LFS 官网 下载对应系统的安装包。或…...

【Linux】初识线程

目录 一、什么是线程&#xff1a; 重定义线程和进程&#xff1a; 执行流&#xff1a; Linux中线程的实现方案&#xff1a; 二、再谈进程地址空间 三、小结&#xff1a; 1、概念&#xff1a; 2、进程与线程的关系&#xff1a; 3、线程优点&#xff1a; 4、线程…...

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…...

uniapp登录用户名在其他页面都能响应

使用全局变量 1、在APP.vue中定义一个全局变量&#xff0c;然后在需要的地方引用它&#xff1b; <script>export default {onLaunch: function() {console.log(App Launch)this.globalData { userInfo: {} };},onShow: function() {console.log(App Show)},onHide: fu…...

ESP8266 入门(第 2 部分):使用 AT 命令

使用 AT 命令对 WiFi 收发器ESP8266编程 本教程是上一个教程 ESP8266 入门(第 1 部分)的延续。因此,简单回顾一下,在之前的教程中,我们介绍了 ESP 模块,并学习了一些基础知识。我们还使用 FTDI 串行适配器模块制作了一个开发板,该模块可以很容易地用于使用 AT 命令和 A…...

介绍一下Qt 中的QSizePolicy 布局策略

在 Qt 中&#xff0c;QSizePolicy 类用于描述一个控件在布局中如何分配空间&#xff0c;它定义了控件在水平和垂直方向上对空间的需求和响应策略。以下是对 QSizePolicy 策略的详细介绍&#xff1a; 基本概念 QSizePolicy 包含两个主要的属性&#xff1a;Policy&#xff08;策…...

从ETL到数仓分层:大数据处理的“金字塔”构建之道

在当今数据驱动的时代&#xff0c;大数据处理已成为企业决策和业务优化的核心。而ETL&#xff08;Extract, Transform, Load&#xff09;作为数据处理的基石&#xff0c;其背后的数仓分层理念更是决定了数据处理的效率与质量。本文将深入探讨ETL工作中的数仓分层理念&#xff0…...

springBoot集成声明式和编程式事务的方式

一、声明式事务 前提集成了mybatisplus插件 1、pom依赖 <dependencies><!-- MyBatis-Plus 启动器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.4&l…...

前端实现版本更新自动检测✅

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&a…...

Python零基础学习第三天:函数与数据结构

一、函数基础 函数是什么&#xff1f; 想象你每天都要重复做同一件事&#xff0c;比如泡咖啡。函数就像你写好的泡咖啡步骤说明书&#xff0c;每次需要时直接按步骤执行&#xff0c;不用重新想流程。 # 定义泡咖啡的函数 def make_coffee(sugar1): # 默认加1勺糖 print("…...

深入了解Linux —— 调试程序

前言 我们已经学习了linux下许多的工具&#xff0c;vim、gcc、make/makefile等&#xff1b; 已经能够在linux写代码&#xff0c;并且进行编译运行&#xff0c;让程序在linux下跑起来。 但是&#xff0c;如果我们在写代码的时候遇见了错误&#xff1b;但是我们并不知道错误在哪&…...

解决VScode 连接不上问题

问题 &#xff1a;VScode 连接不上 解决方案&#xff1a; 1、手动杀死VS Code服务器进程&#xff0c;然后重新尝试登录 打开xshell &#xff0c;远程连接服务器 &#xff0c;查看vscode的进程 &#xff0c;然后全部杀掉 [cxqiZwz9fjj2ssnshikw14avaZ ~]$ ps ajx | grep vsc…...

行式数据库与列式数据库区别

列式数据库&#xff08;Columnar Database&#xff09;和行式数据库&#xff08;Row-based Database&#xff09;是两种不同的数据存储和检索方式&#xff0c;它们在数据组织、存储结构和适用场景上有显著区别。以下是对两者的详细对比&#xff1a; 1. 数据存储方式 行式数据库…...

如何将本地已有的仓库上传到gitee (使用UGit)

1、登录Gitee。 2、点击个人头像旁边的加号&#xff0c;选择新建仓库&#xff1a; 3、填写仓库相关信息 4、复制Gitee仓库的地址 5、绑定我们的本地仓库与远程仓库 6、将本地仓库发布&#xff08;推送&#xff09;到远程仓库&#xff1a; 注意到此处报错&#xff…...

FIWARE:开源的物联网平台,支持设备虚拟化和数据管理

FIWARE 是一个开源的物联网(IoT)平台,旨在为物联网应用提供强大的数据管理和设备虚拟化功能。FIWARE 提供了一系列通用的 API 和组件,支持设备管理、数据采集、数据处理、数据共享和安全通信等功能,使得开发者能够快速构建和扩展物联网解决方案。以下是 FIWARE 的核心功能…...

RISC-V汇编学习(三)—— RV指令集

有了前两节对于RISC-V汇编、寄存器、汇编语法等的认识&#xff0c;本节开始介绍RISC-V指令集和伪指令。 前面说了RISC-V的模块化特点&#xff0c;是以RV32I为作为ISA的核心模块&#xff0c;其他都是要基于此为基础&#xff0c;可以这样认为&#xff1a;RISC-V ISA 基本整数指…...

【Linux】冯诺依曼体系与操作系统理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充&#xff1a;理解系统调用…...

Android15使用FFmpeg解码并播放MP4视频完整示例

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下...

音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构

一、引言 《RFC 3640》和《RFC 6416》分别定义了两种对MPEG-4流的RTP封包方式&#xff0c;这两个文档都可以从RFC官网下载&#xff1a; RFC Editor 本文主要对《RFC 3640》中的音频打包方式进行简介。《RFC 3640》总共有43页&#xff0c;本文下面所说的“页数”是指在pdf阅读…...

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…...

MySQL创建数据库和表,插入四大名著中的人物

一、登录数据库并创建数据库db_ck 二、创建表t_hero 表属性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…...

matlab和FPGA联合仿真时读写.txt文件数据的方法

在FPGA开发过程中&#xff0c;往往需要将MATLAB生成的数据作为原始激励灌入FPGA进行仿真。为了验证FPGA计算是否正确&#xff0c;又需要将FPGA计算结果导入MATLAB绘图与MATLAB计算结果对比。 下面是MATLAB“写.txt”、“读.txt”&#xff0c;Verilog“读.txt”、“写.txt”的代…...

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …...

ACE协议学习1

在多核系统或复杂SoC&#xff08;System on Chip&#xff09;中&#xff0c;不同处理器核心或IP&#xff08;Intellectual Property&#xff09;模块之间需要保持数据的一致性。常用的是ACE协议or CHI。 先对ACE协议进行学习 ACE协议&#xff08;Advanced Microcontroller Bu…...

通俗易懂的介绍LLM大模型技术常用专业名词(通用版)

1. 神经网络 (Neural Network) 解释: 一种模拟人脑神经元结构的计算模型&#xff0c;用于处理复杂的数据模式。 示例: 图像识别中的卷积神经网络&#xff08;CNN&#xff09;。 2. 深度学习 (Deep Learning) 解释: 基于多层神经网络的机器学习方法&#xff0c;能够自动提取数…...

深度学习环境安装

Anaconda 3.0 下载地址 Download Success | Anaconda CUDA 下载地址 cuda_12.4.0 https://developer.nvidia.com/cuda-12-4-0-download-archive?target_osWindows&target_archx86_64&target_version11&target_typeexe_local pytorch 下载地址 &#xff08;2…...

【哇! C++】类和对象(五) - 赋值运算符重载

目录 ​编辑 一、运算符重载 1.1 运算符重载概念 1.2 全局运算符重载 1.3 运算符重载为成员函数 二、赋值运算符重载的特性 2.1 赋值运算符重载需要注意的点 2.2 赋值运算符重载格式 2.2.1 传值返回 2.2.2 传引用返回 2.2.3 检查自己给自己赋值 三、赋值运算符重载的…...

【时序图】1.StarUML绿化

1)下载地址 官网: StarUML 如下: 2)绿化 step1:用管理员打开cmd&#xff0c;执行如下 npm install -g asar cd C:\Program Files\StarUML\resources //进入到StarUML的默认安装目录下面 asar extract app.asar app //反编译软件step2:把resources下的app文件夹拷贝出来到…...

mysql练习

创建数据库db_ck&#xff0c;再创建表t_hero&#xff0c;将四大名著中的主要人物都插入这个表中&#xff0c;将实现过程中sql提交上上来 1、创建数据库db_ck mysql> create database db_ck; 2、创建表t_hero mysql> use db_ck Database changed mysql> create table …...

数据结构(队列)

数据结构&#xff08;队列&#xff09; 什么是队列&#xff1f; 队列和栈类似&#xff0c;也是一类特殊的线性表。特殊之处也是在于操作上。队列&#xff1a;只允许在一端进行插入数据操作&#xff08;入队&#xff09;&#xff0c;在另一端进行删除数据操作&#xff08;出队&…...

fps项目二次总结

文章目录 角色角色蓝图动画蓝图角色蓝图与动画蓝图间的通信动画蓝图绑定在网格体上 其他蓝图角色蓝图与其他蓝图的通信通信详解单向通信&#xff1a;A向B与B向A互不相通A向B发送消息A&#xff1a;发起方&#xff1a;即调用方B&#xff1a;接收方&#xff1a;即提供方&#xff1…...

VTK笔记- 3D Widget类 vtkSplineWidget 样条部件

vtk3DWidget vtk3DWidget是用于3D交互观察器的基类&#xff0c;也就是各种3D小部件类的基类&#xff0c;主要是在三维渲染场景中生成一个可以用于控制数据的可视化实体&#xff0c;比如点&#xff0c;线段&#xff08;曲线&#xff09;、平面、球体、包围盒&#xff08;线框&am…...

文心一言:中国大模型时代的破局者与探路者

2023年&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的浪潮席卷全球&#xff0c;而百度推出的“文心一言”&#xff08;ERNIE Bot&#xff09;作为中国AI领域的代表性产品&#xff0c;迅速成为行业焦点。这款基于百度自主研发的“文心大模型”打造的对话式AI工具&am…...

【芯片验证】verificationguide上的36道UVM面试题

跟上一篇一样,verificationguide上的36到UVM面试题,通义回答ds判卷。 1. What is uvm_transaction, uvm_seq_item, uvm_object, uvm_component? uvm_transaction、uvm_seq_item、uvm_object、uvm_component是什么? uvm_transaction是UVM中所有事务的基础类,用于表示仿真…...

操作系统控制台-健康守护我们的系统

引言基本准备体验功能健康守护系统诊断 收获提升结语 引言 阿里云操作系统控制平台作为新一代云端服务器中枢平台&#xff0c;通过创新交互模式重构主机管理体验。操作系统控制台提供了一系列管理功能&#xff0c;包括运维监控、智能助手、扩展插件管理以及订阅服务等。用户可以…...

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例 一、引言&#xff1a;智能化时代的提示工程工具 在人工智能技术广泛应用的时代背景下&#xff0c;如何与AI模型进行有效交互已成为关键技能。本文介绍的"AI任务需求与提示语策略生成器"正是基于…...

【打卡d1】算法模拟类

题目1 题目描述: 某百货公司为了促销&#xff0c;采用购物打折的优惠方法&#xff0c;每位顾客一次购物:在1000元以上者&#xff0c;按 9.5 折优惠;在2000以上者&#xff0c;按9折优惠;在3000以上者&#xff0c;按8.5 折优惠;在5000 以上者&#xff0c;按8折优惠;编写程序&…...

7.2 奇异值分解的基与矩阵

一、奇异值分解 奇异值分解&#xff08;SVD&#xff09;是线性代数的高光时刻。 A A A 是一个 m n m\times n mn 的矩阵&#xff0c;可以是方阵或者长方形矩阵&#xff0c;秩为 r r r。我们要对角化 A A A&#xff0c;但并不是把它化成 X − 1 A X X^{-1}A X X−1AX 的形…...