python opengl 截图_OpenCV Python OpenGL纹理

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

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

解决方案

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, //

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值