😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍读取视频并渲染。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞
文章目录
- :smirk:OpenGL读取视频并渲染
😏OpenGL读取视频并渲染
// main.cpp
#include <iostream>
#include <GL/glut.h>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;Mat videoFrame; // 存储当前视频帧
GLuint textureID; // 纹理 IDvoid display()
{glClear(GL_COLOR_BUFFER_BIT);// 将视频帧数据绑定到纹理对象上glBindTexture(GL_TEXTURE_2D, textureID);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, videoFrame.cols, videoFrame.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, videoFrame.data);// 渲染纹理glBegin(GL_QUADS);glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, -1.0);glTexCoord2f(1.0, 1.0); glVertex2f(1.0, -1.0);glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 1.0);glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, 1.0);glEnd();glutSwapBuffers();
}void updateFrame(int value)
{// 读取下一帧视频// 这里使用了OpenCV库来读取视频文件,确保你已经安装了OpenCV并正确链接它VideoCapture cap("test.mkv");cap >> videoFrame;glutPostRedisplay();glutTimerFunc(1000 / 30, updateFrame, 0); // 设置下一帧更新的时间间隔,这里假设视频的帧率是30fps
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);glutInitWindowSize(800, 600);glutCreateWindow("Video Rendering");// 初始化OpenGLglMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-1, 1, -1, 1, -1, 1);glMatrixMode(GL_MODELVIEW);glEnable(GL_TEXTURE_2D);glGenTextures(1, &textureID);glBindTexture(GL_TEXTURE_2D, textureID);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);cout << "start display" << endl;glutDisplayFunc(display);cout << "start updateFrame" << endl;glutTimerFunc(0, updateFrame, 0);glutMainLoop();return 0;
}
编译:g++ -o video_rendering main.cpp -lglut -lGL -lGLU
pkg-config --cflags --libs opencv``
效果如下:
以上。