Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV Python OpenGL Texture

I want to overlay 3d objects on OpenCV feed. I found an example here That uses webcam video as texture in OpenGL. I changed some part so that it works with cv2. Now the output is something strange

Output Image

CODE

  import cv2
  from OpenGL.GL import *
  from OpenGL.GLU import *
  from OpenGL.GLUT import *
  import numpy as np
  import sys


  #window dimensions
  width = 1280
  height = 720
  nRange = 1.0

  global capture
  capture = None

  def cv2array(im): 
    h,w,c=im.shape
    a = np.fromstring( 
       im.tostring(), 
       dtype=im.dtype, 
       count=w*h*c) 
    a.shape = (h,w,c) 
    return a

  def init():
    #glclearcolor (r, g, b, alpha)
    glClearColor(0.0, 0.0, 0.0, 1.0)

    glutDisplayFunc(display)
    glutReshapeFunc(reshape)
    glutKeyboardFunc(keyboard)
    glutIdleFunc(idle)  

  def idle():
    #capture next frame

    global capture
    _,image = capture.read()


    cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    #you must convert the image to array for glTexImage2D to work
    #maybe there is a faster way that I don't know about yet...

    #print image_arr


    # Create Texture
    glTexImage2D(GL_TEXTURE_2D, 
      0, 
      GL_RGB, 
      720,1280,
      0,
      GL_RGB, 
      GL_UNSIGNED_BYTE, 
      image)
    cv2.imshow('frame',image)
    glutPostRedisplay()

  def display():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glEnable(GL_TEXTURE_2D)
    #glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    #glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    #glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
    #this one is necessary with texture2d for some reason
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)

    # Set Projection Matrix
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluOrtho2D(0, width, 0, height)

    # Switch to Model View Matrix
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    # Draw textured Quads
    glBegin(GL_QUADS)
    glTexCoord2f(0.0, 0.0)
    glVertex2f(0.0, 0.0)
    glTexCoord2f(1.0, 0.0)
    glVertex2f(width, 0.0)
    glTexCoord2f(1.0, 1.0)
    glVertex2f(width, height)
    glTexCoord2f(0.0, 1.0)
    glVertex2f(0.0, height)
    glEnd()

    glFlush()
    glutSwapBuffers()

  def reshape(w, h):
    if h == 0:
      h = 1

    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)

    glLoadIdentity()
    # allows for reshaping the window without distoring shape

    if w <= h:
      glOrtho(-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange)
    else:
      glOrtho(-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

  def keyboard(key, x, y):
    global anim
    if key == chr(27):
      sys.exit()

  def main():
    global capture
    #start openCV capturefromCAM
    capture = cv2.VideoCapture(0)
    print capture
    capture.set(3,1280)
    capture.set(4,720)
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
    glutInitWindowSize(width, height)
    glutInitWindowPosition(100, 100)
    glutCreateWindow("OpenGL + OpenCV")

    init()
    glutMainLoop()

  main()
like image 547
Arijit Avatar asked Sep 09 '25 10:09

Arijit


1 Answers

I find it very unlikely that your camera is providing a 720 pixel wide and 1280 pixel high image as you tell to OpenGL here:

glTexImage2D(GL_TEXTURE_2D, 
      0, 
      GL_RGB, 
      720,1280,    // <---- HERE
      0,
      GL_RGB, 
      GL_UNSIGNED_BYTE, 
      image)

It seems you just mixed up those two parametes, so the data is reinterpreted as such, resulting in the output you got.

like image 77
derhass Avatar answered Sep 11 '25 11:09

derhass