【问题标题】:OpenCV Python OpenGL TextureOpenCV Python OpenGL 纹理
【发布时间】:2015-08-26 01:40:15
【问题描述】:

我想在 OpenCV 提要上叠加 3d 对象。我找到了一个示例here,它使用网络摄像头视频作为 OpenGL 中的纹理。我更改了一些部分,以便它与 cv2 一起使用。现在输出有点奇怪

代码

  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()

【问题讨论】:

    标签: python opencv opengl


    【解决方案1】:

    我发现您的相机不太可能提供 720 像素宽和 1280 像素高的图像,正如您在此处告诉 OpenGL 的那样:

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

    您似乎只是混淆了这两个参数,因此数据被重新解释,从而产生您得到的输出。

    【讨论】:

    • 我尝试了不同的像素 512x512 640x480,我的 cam 支持 1280x720,openCV 提要在所有这些分辨率下都能完美运行
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2011-05-19
    相关资源
    最近更新 更多