OpenCV 网络摄像头帧到 OpenGL 纹理
OpenCV webcam frames to OpenGL texture
我正在使用 C# 并使用 OpenTK
(OpenGL 包装器)和 EmguCV
(OpenCV 包装器)。
我想做的很容易理解:抓取网络摄像头视频流并将其放在 GLControl
。
我有一个名为 Capturer
的静态 class
,它有一个捕获帧的方法,returns 它作为 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
中我初始化捕捉器和 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
的帧并且它有效但性能太差了。)
画一个包围 GLControl
的矩形解决了它:
GL.Begin(PrimitiveType.Quads);
GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0, 1); GL.Vertex2(0, 1);
GL.TexCoord2(1, 1); GL.Vertex2(1, 1);
GL.TexCoord2(1, 0); GL.Vertex2(1, 0);
GL.End();
m.Dispose();
请务必在绘制框架后释放对象,以免运行内存不足。
我正在使用 C# 并使用 OpenTK
(OpenGL 包装器)和 EmguCV
(OpenCV 包装器)。
我想做的很容易理解:抓取网络摄像头视频流并将其放在 GLControl
。
我有一个名为
Capturer
的静态class
,它有一个捕获帧的方法,returns 它作为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
中我初始化捕捉器和 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
的帧并且它有效但性能太差了。)
画一个包围 GLControl
的矩形解决了它:
GL.Begin(PrimitiveType.Quads);
GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0, 1); GL.Vertex2(0, 1);
GL.TexCoord2(1, 1); GL.Vertex2(1, 1);
GL.TexCoord2(1, 0); GL.Vertex2(1, 0);
GL.End();
m.Dispose();
请务必在绘制框架后释放对象,以免运行内存不足。