2014-01-16 87 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