标签: glreadpixels

将数据从glReadPixels()转换为OpenCV :: Mat

我想通过glReadPixels()从动画中获取每个OpenGL帧,并将数据转换为OpenCV :: Mat.我知道glReadPixels()从左到右按行从下一行到上一行获取数据.另一方面,OpenCV以不同方式存储数据.

有没有人知道任何库或任何帮助我将数据从glReadPixels转换为OpenCV的教程/示例: C++中的Mat

摘要

 OpenGL frame      ----------------------->        CV::Mat

Data from left to right,                    Data from left to right,
bottom to top.                              top to bottom.
Run Code Online (Sandbox Code Playgroud)

c++ opengl opencv glreadpixels

21
推荐指数
1
解决办法
1万
查看次数

如何在OpenGL中截取屏幕截图

如何在C++中截取OpenGL窗口的截图并将其保存到文件中.

我发现了这个glReadPixels()功能,但我不知道下一步该做什么.例如,我可以在哪里设置文件的路径?

如果不困难,请写代码.

c++ opengl screenshot save glreadpixels

16
推荐指数
4
解决办法
3万
查看次数

用glReadPixels读取纹理字节?

我想将原始纹理数据转储到磁盘上(稍后再回读),我不确定glReadPixel会从当前绑定的纹理中读取.

如何从纹理中读取缓冲区?

textures opengl-es glreadpixels ios

13
推荐指数
1
解决办法
1万
查看次数

使用像素缓冲对象(PBO)从帧缓冲对象(FBO)读取像素值

我可以使用像素缓冲区对象(PBO)直接从FBO读取像素值(即使用glReadPixels)(即FBO仍然连接时)?

如是,

  1. 使用PBO和FBO有什么优缺点?
  2. 以下代码有什么问题

{

//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY)
// FBO and PBO status is good
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//Draw the objects
Run Code Online (Sandbox Code Playgroud)

以下glReadPixels工作正常

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE,  (uchar*)cvimg->imageData);
Run Code Online (Sandbox Code Playgroud)

以下glReadPixels不工作:(

glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
//yes glWriteBuffer has also same target and I also checked with every possible values
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer
Run Code Online (Sandbox Code Playgroud)

opengl fbo framebuffer glreadpixels pbo

12
推荐指数
2
解决办法
2万
查看次数

与PBO异步glReadPixels

我想用两个PBO以另一种方式读取像素.我认为PBO方式会更快,因为glReadPixels在使用PBO时会立即返回,并且很多时间可以重叠.

奇怪的是似乎没有太大的好处.考虑一些代码,如:

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
    Timer t; t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, buf);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << " ";

    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
    t.start();
    glReadPixels(0,0,1024,1024,GL_RGBA, GL_UNSIGNED_BYTE, 0);
    t.stop(); std::cout << t.getElapsedTimeInMilliSec() << std::endl;
Run Code Online (Sandbox Code Playgroud)

结果是

1.301 1.185
1.294 1.19
1.28 1.191
1.341 1.254
1.327 1.201
1.304 1.19
1.352 1.235
Run Code Online (Sandbox Code Playgroud)

PBO的方式有点快,但不是令人满意的立即回报.

我的问题是:

  • 影响glReadPixels表现的因素是什么?有些时候,它的成本达到10毫秒,但这里只有1.3毫秒.
  • 为什么立即返回成本高达1.2ms?是太大还是正常?

================================================== =========================

根据与演示的比较,我发现了两个因素:

  • GL_BGRA优于GL_RGBA,1.3ms => 1.0ms(无PBO),1.2ms => 0.9ms(使用pbo)
  • glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA)而不是GLUT_RGBA,0.9ms => 0.01ms.这就是我想要的性能.在我的系统中,GLUT_RGBA = GLUT_RGB = 0.GLUT_ALPHA = 8

然后另外两个问题:

  • 为什么GL_BGRA比GL_RGBA好?是针对特定平台还是针对所有平台?
  • 为什么GLUT_ALPHA如此重要以至于它会极大地影响PBO的表现?

opengl glreadpixels pbo

8
推荐指数
1
解决办法
4914
查看次数

glReadPixels清除openGL ES 2中的缓冲区?

我有一个OpenGL ES 2绘图应用程序(iOS 4),所以我在我的CAEAGLLayer中保留支持,而不是在每个帧上清除:

eaglLayer.opaque = TRUE;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:TRUE], kEAGLDrawablePropertyRetainedBacking,
                                        kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
                                        nil];
Run Code Online (Sandbox Code Playgroud)

我有一个按钮,用于将工作保存到相册,下面的代码.这是问题所在.当它完成保存并再次开始绘图时,整个缓冲区清除,我的绘图从空白屏幕上开始.有办法防止这种情况吗?我希望能够继续从我刚刚保存的状态中抽出来.

我正在运行相同的代码以保存在OpenGL ES 1中,并且此问题不会发生在那里.此外,此问题仅在iPhone设备(3GS)上可见,而不是在模拟器上.如果您有想法,请告诉我.谢谢.

-(void)saveCurrentScreenToPhotoAlbum 
{
    CGRect rect = [[UIScreen mainScreen] bounds];
    int width = rect.size.width;
    int height = rect.size.height;

    NSInteger myDataLength = width * height * 4;
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    for(int y = 0; y <height; y++) 
    {
        for(int x = 0; x <width * 4; …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es glreadpixels

6
推荐指数
1
解决办法
1789
查看次数

像素格式,CVPixelBufferRefs和glReadPixels

我正在使用glReadPixels将数据读入CVPixelBufferRef.我用它CVPixelBufferRef作为输入AVAssetWriter.不幸的是,像素格式似乎不匹配.

我认为glReadPixels返回RGBA格式的AVAssetWriter像素数据,同时想要ARGB格式的像素数据.将RGBA转换为ARGB的最佳方法是什么?

这是我到目前为止所尝试的:

  • 沿argb =(rgba >> 8)|行的位操作 (rgba << 24)
  • 使用a CGImageRef作为中间步骤

位操作不起作用,因为CVPixelBufferRef似乎不支持下标.该CGImageRef中间步骤做的工作......但我不希望有代码50条额外的线路,有可能正影响性能.

glreadpixels ios avassetwriter

6
推荐指数
2
解决办法
7011
查看次数

glReadPixels()真的很慢,更好的解决方案从鼠标位置获取OpenGL坐标?

这是我用来在3d场景中获取鼠标位置的代码:

void GetOGLPos(int x, int y, GLdouble &pX, GLdouble &pY, GLdouble &pZ){
 GLint viewport[4];
 GLdouble modelview[16];
 GLdouble projection[16];
 GLfloat winX, winY, winZ;

 glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
 glGetDoublev(GL_PROJECTION_MATRIX, projection);
 glGetIntegerv(GL_VIEWPORT, viewport);

 winX = (float)x;
 winY = (float)viewport[3]-(float)y;
 glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

 gluUnProject(winX, winY, winZ, modelview, projection, viewport, &pX, &pY, &pZ);
}
Run Code Online (Sandbox Code Playgroud)

但我注意到一件坏事...每帧1-2次调用该函数会使CPU占用率达到100%,3次或更多次调用200%CPU占用率(我有4个核心,1-2个呼叫= 25%,3个或更多呼叫) = 50%,我认为它不能高于50%...)

有没有其他方法可以有效地做到这一点?我每帧使用4次调用该函数,所以我知道应该为场景渲染哪些区域(我从每个屏幕角落拍摄).

另外我用它来知道我用鼠标指向哪个地方,所以我需要实时,但我想使用更少的CPU,因为即使只有1次调用也会使单核系统的使用率达到100%.

编辑

我已经尝试过glPushName()方法,但它的速度更慢,在我的GPU中比在CPU中更慢.当我在程序中不使用单个glReadPixels()调用时,我的CPU使用率仅为0-1%.奇怪的是,我的CPU使用率很高,但它不会使程序滞后,就像你预期的那样100%使用...当我的程序打开时,只有当我使用其他程序时才出现问题,那么使用它们会有些滞后.

c++ opengl glreadpixels

5
推荐指数
1
解决办法
6584
查看次数

为什么glReadPixels会在一些较旧的Android设备上给出错位对齐的结果?

我有一个适用于许多设备的应用程序,我有几个用户报告app没有正确保存图像.关于有问题的设备的comman事情是,它们都是非常古老的设备.他们很可能都使用armeabi作为他们的CPU_ABI.

这是来自用户的示例图像. 以下是用户的示例.

android glreadpixels opengl-es-2.0

5
推荐指数
0
解决办法
131
查看次数

readPixels到base64(WebGL服务器端缓冲区转换)

我正在使用headless-gl在Node.js上运行webGL,在服务器上动态创建一个图像.一旦创建,在用户通过API再次访问图像之前,图像将存储在数据库(MongoDB)中.

下面是生成图像的部分:

var pixels = new Uint8Array(width * height * 4)
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
Run Code Online (Sandbox Code Playgroud)

然后将像素转换为base64(因为这似乎是客户端HTML中Image加载的推荐方式).

var base64Image = new Buffer(pixels, 'binary').toString('base64');
Run Code Online (Sandbox Code Playgroud)

但是,此缓冲区生成的字符串无法解码以生成图像.可能是像素不是'二进制'类型?或者我应该将像素字符串保存在数据库中并尝试在客户端中逐个像素地重绘画布中的像素(我不认为这是最好的方法)?

html glreadpixels webgl server-rendering

5
推荐指数
1
解决办法
484
查看次数