QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制

在QOpenGLWidget中可以绘制,并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后,解锁资源,再用QPainter绘制矩形框。这种方式灵活性最好。

void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//绘制视频数据// 解绑VAOglBindVertexArray(0);m_program.release();// ----------------- 绘制矩形框 -----------------QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(QPen(QColor(Qt::red), 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));QRectF drawRect = QRectF(0, 0, width() * 0.5, height() * 0.5);painter.drawRect(drawRect);painter.end();
}

二、OpenGL绘制

通过不同的QOpenGLShaderProgram,可以指定不同的着色器程序来实现矩形的绘制。
1)边框颜色参数要通过Uniform传递给OpenGL的顶点着色器。
2)动态矩形顶点缓冲更新,坐标归一化到OpenGL坐标系,顶点数据更新VBO

void VideoGLWidget::updateRectBuffer() {
    if (m_rects.isEmpty()) return;    // 将 QRectF 转换为归一化坐标(-1 到 1)
    QVector<float> vertices;
    for (const QRectF &rect : m_rects) {
        float x1 = (rect.x() / m_videoSize.width()) * 2 - 1;
        float y1 = 1 - (rect.y() / m_videoSize.height()) * 2;
        float x2 = ((rect.x() + rect.width()) / m_videoSize.width()) * 2 - 1;
        float y2 = 1 - ((rect.y() + rect.height()) / m_videoSize.height()) * 2;        // 每个矩形由 4 条线段组成(每条线段 2 个点)
        vertices << x1 << y1 << x2 << y1;  // 上边
        vertices << x2 << y1 << x2 << y2;  // 右边
        vertices << x2 << y2 << x1 << y2;  // 下边
        vertices << x1 << y2 << x1 << y1;  // 左边
    }    // 更新 VBO
    glBindBuffer(GL_ARRAY_BUFFER, m_rectVBO);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), 
                 ver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.3 Taylor公式

1.定义 1.1 taylor公式 1.2 麦克劳林公式 1.3 推论 1.4 拉格朗日余项和皮亚诺型余项 2. 例题 3.几种特殊函数的麦克劳林展开

CEF 给交互函数, 添加控制台是否显示交互参数log开关

CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些 CEF 多进程模式时,注入函数,获得交互信息-CSDN博客 这两篇文章,介绍了注入函数,在控制台中显示 各自提供的交互函数信息。 有些场景下,我们还需要更详细的信息,比如想知道 彼此传递的参数, 如果每次调…

QTcpSocket多线程连接慢问题

20250325记录 环境&#xff1a;Qt5.14.2 64位 msvc编译 在多线程环境下&#xff0c;使用QTcpSocket实现客户端&#xff0c;发现在少部分电脑上&#xff0c;连接时间过长&#xff0c;定时器检查套接字状态时&#xff0c;发现连接处于QAbstractSocket::ConnectingState状态。 …

IntelliJ IDEA创建Maven工程

1、创建空工程 1&#xff09;创建 2&#xff09;配置JDK和Maven 2、创建Maven工程 3、Maven工程结构简介 1&#xff09;目录 pom.xml 2&#xff09;窗口 4、参考 08.IDEA配置本地Maven软件_哔哩哔哩_bilibili

(UI自动化测试web端)第二篇:元素定位的方法_css定位之class选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第二种写法class选择器。你要根据网页中的实际情况来判断自己到底要用哪一种方法来进行元素定位。每种方法都要多练习&#xff0c;全都熟了之后你在工作当中使用起来元素定位时&#…

加新题了,MySQL 8.0 OCP 认证考试 题库更新

MySQL 8.0 OCP 认证考试 题库更新 MySQL 8.0 Database Administrator 考试科目&#xff1a;1Z0-908 近期发现&#xff0c;MySQL OCP认证考试题库发生变化&#xff0c;出现了很多新题&#xff0c;对此&#xff0c;CUUG专门收集整理了最新版本的MySQL考试原题&#xff0c;并会给…

基于JavaWeb的图书管理系统(SSM框架)

有需要请加文章底部Q哦 可远程调试 基于JavaWeb的图书管理系统(SSM框架) 一 介绍 此图书管理系统基于Java(SSM框架)开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;Javaweb(SpringSpringMVCMyBatis)MavenMySQLIDEA 二…

Google Benchmark性能测试

Google Benchmark性能测试 Google Benchmark 是一个用于 C 的微基准测试框架&#xff0c;专为测量小块代码的性能而设计。它提供了一种简单而强大的方式来编写、运行和分析基准测试&#xff0c;帮助开发人员识别性能瓶颈并优化代码。本教程将从安装和基本用法开始&#xff0c;…

深度剖析:域名与DNS安全的全方位解读

导语 在互联网的庞大体系中,域名如同我们访问网络资源的“门牌号”,而DNS则像是将门牌号翻译为具体地址的“翻译官”。然而,这看似平常的域名与DNS系统,却面临着诸多安全风险。一旦遭受攻击,可能导致网站无法访问、用户数据泄露等严重后果。了解域名与DNS安全知识,对保障…

CSS 的可继承性

在面试中回答关于CSS可继承性的问题时&#xff0c;建议采用结构化、清晰且简洁的方式&#xff0c;展示你对这一概念的理解以及实际应用能力。以下是一个参考回答模板&#xff1a; 1. 定义和概念 “CSS的可继承性是指某些CSS属性可以被子元素自动继承的特性。也就是说&#xf…

string 的接口

我们继续来讲解一些常用的string接口。 一.at接口 我们来看一个越界的问题。 我们运行之后发现这是一个断言错误&#xff0c;直接就终止我们的程序了&#xff0c;不能作为异常被捕捉到&#xff0c;但是我们如果不想让程序直接崩溃该怎么办呢&#xff1f; 此时我们就要用到at关键…

DeepSeek调用API访问,使用AnythingLLM建立本地知识库后开放API调用,ApiFox/PostMan调用本地DeepSeek

上篇文章中我们使用AnythingLLM成功在本地部署了DeepSeek的本地知识库&#xff0c;并且上传了几个文件让DeepSeek学习&#xff0c;可点击查看&#xff1a; 本地部署DeepSeek并使用AnythingLLM建立本地知识库全流程&#xff0c;DeepSeek-R1:7b本地安装部署,DeepSeek-R1本地部署…

创新NDT解决方案:XARION激光超声系统助力航空航天材料的高效监测

XARION激光超声检测系统是一种高效的无损检测工具&#xff0c;它利用激光技术产生超声波信号&#xff0c;并通过无膜光学麦克风捕捉这些信号&#xff0c;提供非接触式的超声检测解决方案。该系统适用于多种材料和复杂表面的检测&#xff0c;满足工业、医疗和科研领域的严格标准…

基于 PHP 内置类及函数的免杀 WebShell

前言 PHP 作为广泛使用的服务端语言&#xff0c;其灵活的内置类&#xff08;如 DOMDocument&#xff09;和文件操作机制&#xff08;.ini、.inc 的自动加载&#xff09;&#xff0c;为攻击者提供了天然的隐蔽通道。通过 动态函数拼接、反射调用、加密混淆 和 伪命名空间 等手法…

Arduino、ESP32驱动BME688环境传感器(环境传感器篇)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 4.1、读取数据(无IAQ指数) 4.2、读取数据(带IAQ数值) BME688环境传感器是一款四合一MEMS环境传感器,可测量VOC(挥发性有机物)、温度、湿度、气压这四个参数,非常适用于监测空气质量。由于…

数据结构——顺序栈seq_stack

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序栈 目录 一、概念 1.1 顺序栈的基本概念 1.2 顺序栈的存储结构 二、基本操作 2.1 结构体定义 2.2 初始化 2.3 判空 2.4 判满 2.5 扩容 2.6 插入 入栈 2.7 删除 出栈 2.8 获取栈顶元…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持&#xff0c;其中包括两个重要的函数&#xff1a;std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…

AI音乐生成革命:解读昆仑万维Mureka O1的技术突破与应用实践

AI音乐生成革命&#xff1a;解读昆仑万维Mureka O1的技术突破与应用实践 全球音乐产业正经历AI技术重塑&#xff0c;昆仑万维最新发布的音乐推理大模型Mureka O1引发行业震动。本文深度解析其技术原理与实测表现&#xff0c;揭开AI音乐创作新纪元的技术密码 一、技术演进&…

《Operating System Concepts》阅读笔记:p483-p488

《Operating System Concepts》学习第 40 天&#xff0c;p483-p488 总结&#xff0c;总计 6 页。 一、技术总结 1.object storage (1)object storage 管理软件 Hadoop file system(HDFS)、Ceph。 二、英语总结(生词&#xff1a;1) 1.commodity (1)commodity: com-(“tog…

强化学习与神经网络结合(以 DQN 展开)

目录 基于 PyTorch 实现简单 DQN double DQN dueling DQN Noisy DQN&#xff1a;通过噪声层实现探索&#xff0c;替代 ε- 贪心策略 Rainbow_DQN如何计算连续型的Actions 强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过与环境交互学习最优策略。当状态空间或动…