139 lines
3 KiB
Python
139 lines
3 KiB
Python
|
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,
|
||
|
1280, 720,
|
||
|
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()
|