2014-01-16 4 views
5

저는 PyQt4 GUI와 OpenCV를 사용하여 비디오를 캡쳐하려고했습니다. 캡처를 제어하기 위해 "시작", "종료"등과 같은 버튼을 만들었습니다. 시작은 괜찮지 만 캡처를 멈출 수는 없습니다. 캡처를 중지하려면 while 루프를 깨뜨릴 필요가 있습니다. startCapture() 기능을 수행 할 수 없습니다.OpenCV Video Capture with PyQt4

현재, endCapture는() 창을 파괴하지만, startCapture루프이 간단하게 작성하고 촬영을 계속하면서. 해당 옵션을 끊는 것만 선택할 수 있습니다.

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의 발언 내용을 추가하지 않을 때에도 "quit"을 누르면 세 개의 butteons가있는 창을 닫지 않습니다. – tfv