2014-01-16 83 views
5

我一直在尝试使用PyQt4 GUI和OpenCV捕获视频。我创建了一些按钮,如“开始”,“结束”等来控制捕捉。开始很好,但我无法停止捕获。要停止捕获,我需要打破startCapture()函数下面的while循环,我无法实现它。使用PyQt4进行OpenCV视频捕获

目前,endCapture()破坏了窗口,但startCapturewhile循环简单地创建它,继续捕捉。唯一的选择是打破这个循环。

下面是我使用的代码:

import cv2 
import numpy as np 
from PyQt4 import QtGui, QtCore 

def startCapture(cap): 
    print "pressed start" 
    while(True): 
     ret, frame = cap.read() 
     cv2.imshow("Capture", frame) 
     cv2.waitKey(5) 
    cv2.destroyAllWindows() 

def endCapture(cap): 
    print "pressed End" 
    cv2.destroyAllWindows() 

def quitCapture(cap): 
    print "pressed Quit" 
    cv2.destroyAllWindows() 
    cap.release() 
    QtCore.QCoreApplication.quit() 

class Window(QtGui.QWidget): 
    def __init__(self): 

     c = cv2.VideoCapture(0) 

     QtGui.QWidget.__init__(self) 
     self.setWindowTitle('Control Panel') 

     self.start_button = QtGui.QPushButton('Start',self) 
     self.start_button.clicked.connect(lambda : startCapture(c, True)) 

     self.end_button = QtGui.QPushButton('End',self) 
     self.end_button.clicked.connect(lambda : endCapture(c)) 

     self.quit_button = QtGui.QPushButton('Quit',self) 
     self.quit_button.clicked.connect(lambda : quit(c)) 

     vbox = QtGui.QVBoxLayout(self) 
     vbox.addWidget(self.start_button) 
     vbox.addWidget(self.end_button) 
     vbox.addWidget(self.quit_button) 

     self.setLayout(vbox) 
     self.setGeometry(100,100,200,200) 
     self.show() 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    sys.exit(app.exec_()) 

任何一个可以建议如何打破这一循环,并退出捕捉?

+0

创建一些在startCapture循环中检查的类或全局变量。并在endCapture被调用时更改 – M4rtini

+0

@Abid,是否有效?我有同样的问题。你是如何解决这个问题的? – haccks

回答

4
class Capture(): 
    def __init__(self): 
     self.capturing = False 
     self.c = cv2.VideoCapture(0) 

    def startCapture(self): 
     print "pressed start" 
     self.capturing = True 
     cap = self.c 
     while(self.capturing): 
      ret, frame = cap.read() 
      cv2.imshow("Capture", frame) 
      cv2.waitKey(5) 
     cv2.destroyAllWindows() 

    def endCapture(self): 
     print "pressed End" 
     self.capturing = False 
     # cv2.destroyAllWindows() 

    def quitCapture(self): 
     print "pressed Quit" 
     cap = self.c 
     cv2.destroyAllWindows() 
     cap.release() 
     QtCore.QCoreApplication.quit() 

在窗口:

self.capture = Capture() 
self.start_button = QtGui.QPushButton('Start',self) 
self.start_button.clicked.connect(self.capture.startCapture) 

self.end_button = QtGui.QPushButton('End',self) 
self.end_button.clicked.connect(self.capture.endCapture) 

self.quit_button = QtGui.QPushButton('Quit',self) 
self.quit_button.clicked.connect(self.capture.quitCapture) 
+0

+1 - 太棒了,它做到了。我没有这样想。 –

+0

类'quitCapture(self)'中存在一个错误:在_quit_期间不会停止捕获新的帧,从而导致错误,在'cap = self.c'后面加上'self.capturing = False'。 – bastelflp

+0

我运行这个代码,并按下“开始”按钮“结束”和“退出”不起作用。 – haccks

4

上面的答案是伟大的,但对于像我这样的初学者很难看到“在窗口”的部分应该如何的原代码多少应该保持。以下是基于以上信息的完整工作代码:

import cv2 
from PyQt4 import QtGui, QtCore 


class Capture(): 
    def __init__(self): 
     self.capturing = False 
     self.c = cv2.VideoCapture(0) 

    def startCapture(self): 
     print "pressed start" 
     self.capturing = True 
     cap = self.c 
     while(self.capturing): 
      ret, frame = cap.read() 
      cv2.imshow("Capture", frame) 
      cv2.waitKey(5) 
     cv2.destroyAllWindows() 

    def endCapture(self): 
     print "pressed End" 
     self.capturing = False 

    def quitCapture(self): 
     print "pressed Quit" 
     cap = self.c 
     cv2.destroyAllWindows() 
     cap.release() 
     QtCore.QCoreApplication.quit() 


class Window(QtGui.QWidget): 
    def __init__(self): 

     QtGui.QWidget.__init__(self) 
     self.setWindowTitle('Control Panel') 

     self.capture = Capture() 
     self.start_button = QtGui.QPushButton('Start',self) 
     self.start_button.clicked.connect(self.capture.startCapture) 

     self.end_button = QtGui.QPushButton('End',self) 
     self.end_button.clicked.connect(self.capture.endCapture) 

     self.quit_button = QtGui.QPushButton('Quit',self) 
     self.quit_button.clicked.connect(self.capture.quitCapture) 

     vbox = QtGui.QVBoxLayout(self) 
     vbox.addWidget(self.start_button) 
     vbox.addWidget(self.end_button) 
     vbox.addWidget(self.quit_button) 

     self.setLayout(vbox) 
     self.setGeometry(100,100,200,200) 
     self.show() 


if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    sys.exit(app.exec_()) 
+0

类'quitCapture(self)'中存在一个错误:在_quit_期间不会停止捕获新的帧,这会导致错误,在'cap = self.c'之后添加'self.capturing = False'。 – bastelflp

+0

伟大的计划,谢谢。不幸的是,当按下“退出”按钮时,不会关闭窗口,即使不添加bastelflp的评论内容也不会。 – tfv