【问题标题】:Can't Draw SharpGL(openGL wrapper) object in EMGU CV无法在 EMGU CV 中绘制 SharpGL(openGL 包装器)对象
【发布时间】:2013-05-13 07:27:16
【问题描述】:

我一直在使用 emgu cv(opencv wrapper 从网络摄像头捕获图像并使用它的函数来处理这些图像。 我还检测手并跟踪手的运动......

现在,我需要根据手的位置来绘制一种地球或者只是一个物体,sharpGL非常适合透视变换等。我的问题是我做不到。

我不知道如何对 sharpGL 说“你们,在这个手部跟踪窗口内画出那个对象” 我想做的事不可能吗?我很绝望......任何帮助都会很棒。在此先感谢

如果您仍然对我的意思感到困惑,请观看此视频 (http://www.youtube.com/watch?v=ccL4t36sVvg)

到目前为止,我刚刚将这段代码 http://blog.damiles.com/2008/10/opencv-opengl/ 翻译成 C#

这里是代码 sn-p

private void openGLControl_OpenGLInitialized(object sender, EventArgs e)
        {
            //  TODO: Initialise OpenGL here.

            //  The texture identifier.
            uint[] textures = new uint[1];

            //  Get the OpenGL object.
            OpenGL gl = openGLControl1.OpenGL;

            //texture.Create(gl);

            //  Get one texture id, and stick it into the textures array.
            gl.GenTextures(1, textures);

            //  Bind the texture.
            gl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[0]);

            //  A bit of extra initialisation here, we have to enable textures.
            gl.Enable(OpenGL.GL_TEXTURE_2D);

            //  Specify linear filtering.
            gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_NEAREST);
            gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_NEAREST);

            gl.PixelStore(OpenGL.GL_UNPACK_ALIGNMENT, 1);

            //  Set the clear color.
            gl.ClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        }


private void openGLControl_Resized(object sender, EventArgs e)
        {
            //  TODO: Set the projection matrix here.

            //  Get the OpenGL object.
            OpenGL gl = openGLControl1.OpenGL;
            //  Set the projection matrix.
            gl.MatrixMode(OpenGL.GL_PROJECTION);

            //  Load the identity.
            gl.LoadIdentity();

            //  Create a perspective transformation.
            gl.Perspective(60.0f, (double)Width / (double)Height, 0.01, 100.0);

            //  Use the 'look at' helper function to position and aim the camera.
            gl.LookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0);

            //  Set the modelview matrix.
            gl.MatrixMode(OpenGL.GL_MODELVIEW);
        }

最后绘制一个 3D 对象

private void openGLControl_OpenGLDraw(object sender, PaintEventArgs e)
        {
            //  Get the OpenGL object.
            OpenGL gl = openGLControl1.OpenGL;

            if (capture == null)
            {
                this.start_capture();
            }

            if (capture != null)
            {
                Image<Bgr, Byte> ImageFrame = capture.QueryFrame();

                //I'm trying to use some algorithm using the code from sample (sharpGLTextureExample)
                //first, I make an Bitmap object that I take from queryframe(convert it to bitmap first)
                Bitmap image = new Bitmap(ImageFrame.ToBitmap());


                //  Clear the color and depth buffer.
                gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
                //ImageFrame.Draw(new Rectangle(2, 2, 2, 2), new Bgr(Color.Aqua), 2);


                //  Load the identity matrix.
                gl.LoadIdentity();

                //then, Lock the image bits (so that we can pass them to OGL).
                BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
                ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

                gl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[0]);
                //gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, ImageFrame.Width, ImageFrame.Height, 0, OpenGL.GL_RGBA, OpenGL.GL_UNSIGNED_BYTE, ImageFrame);
                gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, ImageFrame.Width, ImageFrame.Height, 0, OpenGL.GL_RGBA, OpenGL.GL_UNSIGNED_BYTE, bitmapData.Scan0);


                //gl.Begin(OpenGL.GL_QUADS);

                //gl.TexCoord(0, 0); gl.Vertex(-1, -1, 0);
                //gl.TexCoord(1, 0); gl.Vertex(1, -1, 0);
                //gl.TexCoord(1, 5); gl.Vertex(1, 1, 0);
                //gl.TexCoord(0, 1); gl.Vertex(-1, 1, 0);
                //gl.End();

                //gl.Flush();

                //texture.Bind(gl);
                //
                //CamImageBox.Image = ImageFrame;
            }

        }

但是输出总是返回一个白色的,上面没有纹理...

我也考虑使用Texture类,但是没用..因为没有输入参数是框架的方法...

【问题讨论】:

    标签: c# opengl emgucv


    【解决方案1】:

    根据您的代码和http://basic4gl.wikispaces.com/2D+Drawing+in+OpenGL 的帮助,我让 SharpGL 显示来自 EmguCV 的视频

    public partial class FormSharpGLTexturesSample : Form
    {
        Capture capture;
        public FormSharpGLTexturesSample()
        {
            InitializeComponent();
    
            //  Get the OpenGL object, for quick access.
            SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
    
            //  A bit of extra initialisation here, we have to enable textures.
            gl.Enable(OpenGL.GL_TEXTURE_2D);
            gl.Disable(OpenGL.GL_DEPTH_TEST);
    
            //  Create our texture object from a file. This creates the texture for OpenGL.
    
            capture = new Capture(@"Video file here");
        }
    
        private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs e)
        {
            //  Get the OpenGL object, for quick access.
            SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
            int Width = openGLControl1.Width;
            int Height = openGLControl1.Height;
    
            gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT);
            gl.LoadIdentity();
    
            var frame = capture.QueryFrame();
            texture.Destroy(gl);
            texture.Create(gl, frame.Bitmap);
    
            //  Bind the texture.
            texture.Bind(gl);
    
            gl.Begin(OpenGL.GL_QUADS);
    
            gl.TexCoord(0.0f, 0.0f); gl.Vertex(0, 0, 0);
            gl.TexCoord(1.0f, 0.0f); gl.Vertex(Width, 0, 0);
            gl.TexCoord(1.0f, 1.0f); gl.Vertex(Width, Height, 0);
            gl.TexCoord(0.0f, 1.0f); gl.Vertex(0, Height, 0);
    
            gl.End();
    
            gl.Flush();
        }
    
    
    
        //  The texture identifier.
        Texture texture = new Texture();
    
        private void openGLControl1_Resized(object sender, EventArgs e)
        {
            SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
            //  Create an orthographic projection.
            gl.MatrixMode(MatrixMode.Projection);
            gl.LoadIdentity();
    
            // NOTE: Basically no matter what I do, the only points I see are those at
            // the "near" surface (with z = -zNear)--in this case, I only see green points
            gl.Ortho(0, openGLControl1.Width, openGLControl1.Height, 0, 0, 1);
    
            //  Back to the modelview.
            gl.MatrixMode(MatrixMode.Modelview);
        }
    }
    

    希望对你有帮助。

    经过一些实验,我可以使用 TexImage2D,但只能使用宽度和高度为 2 次方的图像

    代替:

    var frame = capture.QueryFrame();
    texture.Destroy(gl);
    texture.Create(gl, frame.Bitmap);
    

    可以替换成下面的block来更新图片的数据。我想知道如何消除调用 Resize 的需要。

    var frame = capture.QueryFrame();
    frame = frame.Resize(256, 256, Emgu.CV.CvEnum.INTER.CV_INTER_NN);
    Bitmap Bitmap = frame.Bitmap;
    BitmapData bitmapData = Bitmap.LockBits(new Rectangle(0, 0, Bitmap.Width, Bitmap.Height),
        ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    
    gl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[0]);
    gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_RGBA, Bitmap.Width, Bitmap.Height, 0, OpenGL.GL_BGR, OpenGL.GL_UNSIGNED_BYTE, bitmapData.Scan0);
    
    gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_LINEAR); // Required for TexImage2D
    gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_LINEAR); // Required for TexImage2D
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多