我正在尝试使用OpenGL将usb网络摄像头的camera feed(取自OpenCV)渲染到pyqt窗口,这一切都是在一个raspberry pi上完成的。在
在此之前,我只是简单地将每个帧转换为一个QImage,然后在每次更新时将QLabel的pixmap更改为新的帧,从而将提要绘制到屏幕上。然而,这被证明是太慢了,特别是考虑到树莓派的有限力量。我需要尽可能快的传送。所谓“快”,我的意思是说,在现实生活中,摄像机进纸和实际动作之间的延迟需要最小化(<;500ms),使用Qlabel方法,显示延迟大约1000-1500ms,但太慢了。在
我正在努力使所有这些工作在一起,我有几个问题。在
我的QGLWidget代码:
class Ui_CameraCanvas(QtOpenGL.QGLWidget):
def __init__(self, parent):
QtOpenGL.QGLWidget.__init__(self)
self.video = Video(cv2.VideoCapture(-1))
self._timer = QtCore.QTimer(self)
self._timer.timeout.connect(self.play)
self._timer.start(27)
self.update()
self.parWidget = parent
self.qframe = None
def paintGL(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glClearColor (0.0,0.0,0.0,1.0);
if (not(self.qframe.isNull())):
self.qframe = self.qframe.scaled(self.size(), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,self.qframe.width(),self.qframe.height(),0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D( GL_TEXTURE_2D, 0, 4, self.qframe.width(), self.qframe.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, self.qframe.bits() );
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex2f(0,self.qframe.height());
glTexCoord2f(0,1); glVertex2f(0,0);
glTexCoord2f(1,1); glVertex2f(self.qframe.width(),0);
glTexCoord2f(1,0); glVertex2f(self.qframe.width(),self.qframe.height());
glEnd();
glDisable(GL_TEXTURE_2D);
glFlush();
def resizeGL(self, w, h):
glViewport(0, 0, w, h)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(40.0, 1.0, 1.0, 30.0)
glMatrixMode (GL_MODELVIEW)
def initializeGL(self):
# set viewing projection
glClearColor(0.0, 0.0, 0.0, 1.0)
glClearDepth(1.0)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(40.0, 1.0, 1.0, 30.0)
def resetCamera(self):
try:
self._timer.timeout.disconnect()
except:
pass
del self.video
pass
def play(self):
try:
self.video.captureNextFrame()
self.qframe = self.video.convertFrame()
except TypeError:
print "No frame"
获取源的摄像机设备的代码:
^{pr2}$我开始认为OpenGL只是没有在Raspberry pi上工作。有什么建议可以让它发挥作用吗?在
目前没有回答
相关问题 更多 >
编程相关推荐