我正在 Qt 中开发 GUI。目标平台是基于 Linux / ARMv6 的 Raspberry Pi Zero W,发行版是自定义的 Poky / Yocto 发行版。我将一个显示模块(基于 ILI9341 的 2.4" SPI TFT 显示器)连接到 Raspberry Pi,我希望我的 Qt 应用程序在/dev/fb1显示驱动程序提供的帧缓冲区上运行。
当前的framebuffer驱动允许我在显示模块中显示桌面,即:
FRAMEBUFFER=/dev/fb1 startx
Run Code Online (Sandbox Code Playgroud)
前面的命令间接实现了我想做的事情。但是,我不想显示我的桌面。我只想指定一个帧缓冲区作为 Qt 应用程序的显示平台(而不是使用DISPLAY环境变量)
任何关于如何通过使用可执行文件的命令行参数或通过应用程序代码或通过使用这两种方法来实现这一点的任何指导都非常感谢。
我开始尝试使用 ESP32-CAM。演示 Arduino camserver 脚本与人脸识别等配合得很好,但现在我正在尝试实现一些有用的东西。
我知道这里的示例设法在面部识别期间以某种方式将文本覆盖到视频源上,但我不知道如何将此功能实现到像这样的更简单的流代码上。
我将如何在此示例中进行文本叠加?
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com
IMPORTANT!!!
- Select Board "ESP32 Wrover Module"
- Select the Partion Scheme "Huge APP (3MB No OTA)
- GPIO 0 must be connected to GND to upload a sketch
- After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing mode
Permission is hereby granted, free of charge, to any person obtaining a copy …Run Code Online (Sandbox Code Playgroud) 当将我的帧缓冲区附加纹理渲染到显示四边形时,它变成黑色,这对我来说绝对没有意义,因为我有第二个带有深度纹理的帧缓冲区,它工作得很好。此外,当将渲染的输出显示到屏幕上而不是将其存储在 FBO 中时,它会按应有的方式渲染,并且 GL_FRAMEBUFFER_COMPLETE 和 glGetError 不会返回任何错误。
使用generateBuffer方法生成缓冲区(normalBuffer,normalMap,GL_RGBA,GL_COLOR_ATTACHMENT0):
glGenFramebuffers(1, &buffer);
glGenTextures(1, &map);
glBindTexture(GL_TEXTURE_2D, map);
glTexImage2D(GL_TEXTURE_2D, 0, macro, depthWidth, depthHeight, 0, macro, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glBindFramebuffer(GL_FRAMEBUFFER, buffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, map, 0);
std::vector<GLenum> drawBuffers = { GL_NONE };
glDrawBuffers(1, drawBuffers.data());
GLenum status2 = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status2 != GL_FRAMEBUFFER_COMPLETE)
{
std::cout << "incomplete framebuffer object " << status2 << std::endl;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
然后使用以下方法填充纹理:
Shader::setActiveProgram(normalShaderProgram);
normalShaderProgram->setMat4("lightSpace", ligthProjection * lightView);
glViewport(0, 0, depthWidth, depthHeight);
glBindFramebuffer(GL_FRAMEBUFFER, …Run Code Online (Sandbox Code Playgroud) 我尝试mplayer在帧缓冲区下播放视频,我uvesafb用作帧缓冲驱动程序.该板是威盛EPIA-N800
grub引导设置是:
/boot/vmlinuz-2.6.32 root=UUID=7ece6c10-7255-4f21-8cd8-edb096233969 ro quiet console=tty2 nomodeset video=uvesafb:mode_option=1920x1080-16,mtrr=3,scroll=ywrap
Run Code Online (Sandbox Code Playgroud)
但是当我播放视频时mplayer,屏幕会变黑一段时间,在播放视频之前,似乎重置或重新初始化屏幕.命令是这样的:
mplayer -vo fbdev /opt/1.avi
Run Code Online (Sandbox Code Playgroud)
输出是
root@ytmp:/opt/ytmp# mplayer -vo fbdev /opt/1.avi
MPlayer 1.0rc3-4.4.4 (C) 2000-2009 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
Playing /opt/1.avi.
AVI file format detected.
[aviheader] Video stream found, -vid 0
[aviheader] Audio stream found, -aid 1
VIDEO: [] …Run Code Online (Sandbox Code Playgroud) 视窗
使用 glew
我正在尝试渲染离屏并将渲染的 img opengl 保存到 png 文件。
我在 stackoverflow 上关注了一个评价很高的答案: How to render offscreen on OpenGL?
但我得到的png文件只是黑屏。
这是我的相关代码:
glutCreateWindow(argv[0]);
if(GLEW_OK!=glewInit())
{
return -1;
}
initScene();
GLuint fbo, render_buf;
glGenFramebuffers(1,&fbo);
glGenRenderbuffers(1,&render_buf);
glBindRenderbuffer(GL_RENDERBUFFER,render_buf);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, viewport.w, viewport.h);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
//Before drawing
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
glClear(GL_COLOR_BUFFER_BIT); // clear the color buffer
glMatrixMode(GL_MODELVIEW); // indicate we are specifying camera transformations
glLoadIdentity(); // make sure transformation is "zero'd"
//draw...
//glBegin(GL_POINTS) glColor3f, glVertex2f
//glFlush();
glFinish();
/*glutDisplayFunc(myDisplay);
glutPostRedisplay();*/
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
savePNG(outputPNGName,0,0,viewport.w,viewport.h);
//At deinit:
glDeleteFramebuffers(1,&fbo); …Run Code Online (Sandbox Code Playgroud)