😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍读取视频并渲染。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞
文章目录
- :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; // 纹理 ID
void 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");
// 初始化OpenGL
glMatrixMode(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``
效果如下:
以上。