用pyqt4在树莓皮上绘制OpenGL/OpenCV摄像机

2024-05-20 13:43:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用OpenGL将usb网络摄像头的camera feed(取自OpenCV)渲染到pyqt窗口,这一切都是在一个raspberry pi上完成的。在

在此之前,我只是简单地将每个帧转换为一个QImage,然后在每次更新时将QLabel的pixmap更改为新的帧,从而将提要绘制到屏幕上。然而,这被证明是太慢了,特别是考虑到树莓派的有限力量。我需要尽可能快的传送。所谓“快”,我的意思是说,在现实生活中,摄像机进纸和实际动作之间的延迟需要最小化(<;500ms),使用Qlabel方法,显示延迟大约1000-1500ms,但太慢了。在

我正在努力使所有这些工作在一起,我有几个问题。在

  1. 如果我试图在X-ming上运行任何使用opengloverssh的python程序,它会立即崩溃。在
  2. 当我直接从pi运行thistest OpenGL程序时,它运行正常,但会给我一个空白窗口,与代码底部的螺旋形图片相对应。在
  3. 当我运行获取相机输出的程序并尝试用paintGL()的重新实现绘制它时,QGLWidget的区域无法更新。然而,摄像机灯亮起。在

我的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上工作。有什么建议可以让它发挥作用吗?在


Tags: selfdefvideowidthopengltimerheightgl