0
我正在C#和使用OpenTK
(OpenGL包装)和EmguCV
(OpenCV包装)。OpenCV摄像头帧OpenGL纹理
我想要做的事很容易理解:抓住网络摄像机的视频流,并把它放在GLControl
。
我有一个静态
class
称为Capturer
具有捕获帧并将它作为一个cv::Mat
包装的对象的方法:internal static void Initialize() { cap = new VideoCapture(1); cap.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps, 25); cap.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameWidth, 1920); cap.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameHeight, 1080); } internal static Mat GetCurrentFrame() { mat = cap.QueryFrame(); if (!mat.IsEmpty) { return mat; } return null; }
现在在我的
GLControl
Load event
我初始化capturer和OpenGL:Capturer.Initialize(); GL.ClearColor(Color.Blue); GL.Enable(EnableCap.Texture2D); GL.Viewport(-glControl1.Width, -glControl1.Height, glControl1.Width * 2, glControl1.Height * 2);
最后,在
GLControl
Paint event
:GL.Clear(ClearBufferMask.ColorBufferBit); GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); Mat m = Capturer.GetCurrentFrame(); if (m != null) { GL.GenTextures(1, out textureId); GL.BindTexture(TextureTarget.Texture2D, this.textureId); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (float)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (float)TextureWrapMode.Clamp); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (float)TextureWrapMode.Clamp); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, 1920, 1080, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, m.DataPointer); } m.Dispose(); glControl1.SwapBuffers(); glControl1.Invalidate();
这是展示一个完整的蓝屏。我认为错误在m.DataPointer
。
(我曾尝试使用属性m.Bitmap
与Bitmap
渲染的帧和它的作品,但表现实在是太糟糕)
你没有画任何东西,那么你为什么期望会出现什么? – derhass
你的意思是我需要绘制一个矩形或者'GLControl'的边界吗? –
是的。只要将数据复制到texuttre就不会画任何东西。您需要绘制纹理四边形,或者您可以将纹理覆盖到帧缓冲区。 – derhass