0

我有一个 IDS ueye cam 并通过 PBO 继续捕获到 OpenGL (OpenTK)。在我的开发人员 PC 上效果很好,但在速度较慢的机器上,视频会在一段时间后冻结。

通过 opengl 分配内存并映射到 ueye 的代码,因此相机将处理后的图像保存在此处:

// Generate PBO and save id
GL.GenBuffers(1, out this.frameBuffer[i].BufferID);

// Define the type of the buffer.
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, this.frameBuffer[i].BufferID);

// Define buffer size.
GL.BufferData(BufferTarget.PixelUnpackBuffer, new IntPtr(width * height * depth), IntPtr.Zero, BufferUsageHint.StreamDraw);

// Get pointer to by openGL allocated buffer and
// lock global with uEye.
this.frameBuffer[i].PointerToNormalMemory = GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly);
this.frameBuffer[i].PointerToLockedMemory = uEye.GlobalLock(this.frameBuffer[i].PointerToNormalMemory);

// Unmap PBO after use.
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer);

// Set selected PBO to none.
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);

// Register buffer to uEye
this.Succeeded("SetAllocatedImageMem", this.cam.SetAllocatedImageMem(width, height, depth, this.frameBuffer[i].PointerToLockedMemory, ref this.frameBuffer[i].MemId));

// Add buffer to uEye-Ringbuffer
this.Succeeded("AddToSequence", this.cam.AddToSequence(this.frameBuffer[i].PointerToLockedMemory, this.frameBuffer[i].MemId));

要将图像从 pbo 复制到纹理(已创建纹理并且可以):

// Select PBO with new video image
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, nextBufferId);

// Select videotexture as current
GL.BindTexture(TextureTarget.Texture2D, this.videoTextureId);

// Copy PBO to texture            
GL.TexSubImage2D(
    TextureTarget.Texture2D,
    0,
    0,
    0,
    nextBufferSize.Width,
    nextBufferSize.Height,
    OpenTK.Graphics.OpenGL.PixelFormat.Bgr,
    PixelType.UnsignedByte,
    IntPtr.Zero);

// Release Texture
GL.BindTexture(TextureTarget.Texture2D, 0);

// Release PBO
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);

也许有人可以看到错误......大约 6 秒后,ueye 事件不再提供任何图像。当我删除 TexSubImage2D 它运行良好,但当然没有图像出现。是否有来自opengl的锁或其他东西?在此先感谢 - 托马斯

4

2 回答 2

1

这似乎是一个共享缓冲区问题。你可以尝试实现一个简单的队列机制来解决这个问题。

示例代码(不打算工作):

queue< vector<BYTE> > frames;

...

frames.push(vector<BYTE>(frameBuffer, frameBuffer + frameSize));

...

// use frame here at GL.TexSubImage2D using frames.front()
frames.pop();
于 2011-10-27T11:26:47.197 回答
0

自己发现了失败。只需将上面的 StreamDraw 代码中的代码替换为 StreamRead。

GL.BufferData(BufferTarget.PixelUnpackBuffer, new IntPtr(width * height * depth), IntPtr.Zero, BufferUsageHint.StreamRead);
于 2011-11-07T16:23:08.027 回答