私はIDS ueye camを持っており、PBO経由でOpenGL(OpenTK)へのキャプチャを進めています。私の開発者のPCでは素晴らしい作品ですが、遅いマシンではしばらくしてからビデオがフリーズします。opengl video freeze
コードの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からテクスチャ(テクスチャが作成され、OKです)に画像をコピーするには:
// 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のものがありますか? ありがとうございます - トーマス
これは実際に私が行うことです。カムにはリングバッファがあり、新しいフレームを受け取るたびにバッファIDをopenglに渡します。現在、私はバッファに2つの要素を持っていますが、エラーはさらに多く発生します。しかし、それよりも時間がかかりました... –
あなたのキューメカニズムが完全に安全であるかどうかは、私があなたに伝えることはできません(nextBufferIdがどこに割り当てられているかなど)、すべてのコードを見ることができません。私の推測では、あなたの複数のバッファの実装に何か問題があります。それほど難しくない場合は、上記のようにstd :: queueとstd :: vectorを試してみてください。 –
私はこれはうまく動作するかなりshureです。 NextBufferIdはGenBufferから入手したものです... –