2012-05-19 2 views
0

Я работал с emgu cv (opencv wrapper для захвата изображений с веб-камеры и использования его функций для обработки этих изображений. Я также обнаруживаю руку и дорожку движение руки ...Невозможно нарисовать объект SharpGL (openGL wrapper) в EMGU CV

Теперь мне нужно нарисовать какую-то землю или просто объект в соответствии с положением руки, для которого sharpGL идеально подходит для преобразования перспективы и т. д. Моя проблема в том, что я не могу достигните этого.

Я не знаю, как сказать sharpGL «вы, парень, нарисуйте этот объект внутри этого окна отслеживания руки» Невозможно, что я хочу делать? Я в отчаянии ... любая помощь будет гр есть. Заранее спасибо

посмотреть это видео, если вы до сих пор путают о том, что я имел в виду (http://www.youtube.com/watch?v=ccL4t36sVvg)

до сих пор, я просто перевел код http://blog.damiles.com/2008/10/opencv-opengl/ в C#

и вот фрагмент кода

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; 
      } 

     } 

, но выход всегда возвращает белый, без текстуры на нем ...

Я также хочу использовать класс текстуры, но это бесполезно ... потому что нет способа, которым входным параметром является кадр. .

ответ

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, но только с изображения, имеющие ширину и высоту быть степенью двух

Вместо того, чтобы:

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

Он может быть заменен следующим блоком для обновления данные картины. Я хотел бы знать, как удалить необходимость вызова 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 

 Смежные вопросы

  • Нет связанных вопросов^_^