【OpenGL】读取视频并渲染

这篇具有很好参考价值的文章主要介绍了【OpenGL】读取视频并渲染。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍opencv读取视频并在opengl渲染增加3D图形。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

😏OpenCV读取视频并在OpenGL渲染

// main.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <GL/glut.h>

using namespace std;

// OpenGL窗口宽度和高度
int windowWidth = 1080;
int windowHeight = 960;

// OpenCV视频捕捉对象
cv::VideoCapture videoCapture;
cv::Mat currentFrame;
cv::Mat pausedFrame; // 用于存储暂停时的图像

// 3D立方体旋转角度
float cubeRotation = 45.0f;

// OpenGL纹理ID
GLuint textureID;

// 文字绘制函数
void drawText(const string& text, float x, float y, float r, float g, float b) {
    glColor3f(r, g, b);
    glRasterPos2f(x, y);

    for (const char& c : text) {
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, c);
    }
}

// 视频播放控制变量
bool isPlaying = true;

// OpenGL显示回调函数
void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (isPlaying) {
        if (!currentFrame.empty()) {
            cv::flip(currentFrame, currentFrame, 0);  // 可选:翻转图像以匹配OpenGL坐标系
            glDrawPixels(currentFrame.cols, currentFrame.rows, GL_BGR_EXT, GL_UNSIGNED_BYTE, currentFrame.data);
        }
    } else {
        if (!pausedFrame.empty()) {
            cv::flip(pausedFrame, pausedFrame, 0);  // 可选:翻转图像以匹配OpenGL坐标系
            glDrawPixels(pausedFrame.cols, pausedFrame.rows, GL_BGR_EXT, GL_UNSIGNED_BYTE, pausedFrame.data);
        }
    }

    // 绘制3D立方体
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -5.0f);
    glRotatef(cubeRotation, 1.0f, 1.0f, 1.0f);
    glutWireCube(1.0f);

    glutSwapBuffers();
}

// 定时器回调函数
void timer(int value) {
    if (isPlaying) {
        bool success = videoCapture.read(currentFrame);

        if (!success || currentFrame.empty()) {
            cout << "Video end or cannot read frame" << endl;
            exit(0);
        }
    }

    glutPostRedisplay();
    glutTimerFunc(33, timer, 0);  // 设置33毫秒(约30帧每秒)的定时器
}

// 键盘按键回调函数
void keyboard(unsigned char key, int x, int y) {
    switch (key) {
        case 'p':  // 播放/暂停切换
            isPlaying = !isPlaying;
            if (!isPlaying) {
                pausedFrame = currentFrame.clone(); // 复制当前帧到暂停帧
            }
            break;
        case 'q':  // 退出程序
            exit(0);
            break;
    }
}

int main(int argc, char** argv) {
    // 打开视频文件
    videoCapture.open("test.mp4");

    if (!videoCapture.isOpened()) {
        cout << "Could not open video file" << endl;
        return -1;
    }

    // 初始化OpenGL窗口
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(windowWidth, windowHeight);
    glutCreateWindow("Video Playback");

    // 设置OpenGL投影矩阵和视口
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, (float)windowWidth / windowHeight, 0.1, 100.0);
    glMatrixMode(GL_MODELVIEW);

    // 注册OpenGL显示回调函数和键盘按键回调函数
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);

    // 启动定时器
    glutTimerFunc(0, timer, 0);

    // 启动主循环
    glutMainLoop();

    return 0;
}

编译:g++ -o video_rendering main.cpp -lglut -lGL -lGLU pkg-config --cflags --libs opencv``

效果如下:

【OpenGL】读取视频并渲染,c++GL图形学与游戏,c++,opengl

【OpenGL】读取视频并渲染,c++GL图形学与游戏,c++,opengl

以上。文章来源地址https://www.toymoban.com/news/detail-524654.html

到了这里,关于【OpenGL】读取视频并渲染的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • libVLC 提取视频帧使用OpenGL渲染

    在上一节中,我们讲解了如何使用QWidget渲染每一帧视频数据。 由于我们不停的生成的是QImage对象,因此对 CPU 负荷较高。其实在绘制这块我们可以使用 OpenGL去绘制,利用 GPU 减轻 CPU 计算负荷,本节讲解使用OpenGL来绘制每一帧视频数据。 libVLC 提取视频帧使用QWidget渲染-CSDN博

    2024年04月10日
    浏览(49)
  • Linux平台下基于OpenGL实现YUV视频渲染

    源码详见https://github.com/samxfb/linux-opengl-render

    2024年01月21日
    浏览(45)
  • c++中用opengl的gl函数在三维空间中绘制圆形和画球体

    绘制圆形原理: 画圆形的原理如下图,画一个圆形就相当于切蛋糕一样,将一个圆形切成很多个扇形,而扇形可以用三角形类似表示,所以我们可以将绘制圆形转化为绘制许多个三角形。 绘制圆形的代码如下: 绘制球体原理: 数学中的简单原理,一个球体相当于一个圆形绕

    2024年02月11日
    浏览(39)
  • Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序 Android OpenG

    2024年02月05日
    浏览(48)
  • 使用OpenGL 和 opengl ES 渲染YUV图片文件的QT示例

    头文件:CPlayWidget.h cpp文件:CPlayWidget.cpp 默认打开 ./test.yuv文件 头文件:CPlayWidget.h  与上面没有差别 cpp文件:只替换了着色器代码:

    2024年01月20日
    浏览(39)
  • 实验一OpenGL图形编程入门

    一、 实验目的 1.了解和掌握OpenGL的安装。 2.掌握一个简单的基于OpenGL的C++程序结构。 3.掌握Win32程序框架。 4.掌握OpenGL中若干基本图形的绘制。 二、 实验环境 硬件要求: PC,主流配置,最好为独立显卡,显存512MB以上。 软件环境: 操作系统:Windows 7/Windows 8O 语言开发工具:

    2024年02月06日
    浏览(46)
  • OpenGL基础图形编程(八)变换

    OpenGL变换是本篇的重点内容,它包括计算机图形学中最基本的三维变换,即几何变换、投影变换、裁剪变换、视口变换,以及针对OpenGL的特殊变换概念理解和用法,如相机模拟、矩阵堆栈等。学好了这章,才开始真正走进三维世界。 8.1、从三维空间到二维平面 8.1.1 相机模拟

    2023年04月25日
    浏览(34)
  • 【OpenGL ES】三维图形绘制

    不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵! 颜色的简单搭配: 不红+不绿+不蓝 = 黑 红+绿+蓝 = 白 红+绿 = 黄 红+蓝 = 紫 绿+蓝 = 青蓝 投影主要分为 正交投影 和 透视投影 两种。 正交投影 没有近大远小的效果,是平行投影,投影

    2023年04月08日
    浏览(53)
  • 4.OpenGL学习笔记——渲染到纹理

    写作之处的初衷是作为learnopengl的解释文档,或者代码库来用,不过我慢慢发现这样做挺没意思的,因为learnopengl已经足够详细了,并且随着逐代的更新,我们这个代码库可能还会过时,因此我想还是把一些重要的概念加以巩固,突出,来形成我们自己的特色。 (实际上你看

    2023年04月08日
    浏览(34)
  • IJKPLAYER源码分析-OpenGL ES渲染

    IJKPLAYER在视频render之时,并非简单使用SDL渲染API,而是用了OpenGL ES,再分别在Android和iOS平台做视频的显示; 一言以蔽之,OpenGL ES并不能做到直接在窗口上render并显示,而是需要一个中间媒介。这个中间媒介,将OpenGL ES的render结果,最终输出到窗口上显示; 在Android端,这个中

    2024年04月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包