rs99

pyqt_opencv.py

Feb 15th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.49 KB | None | 0 0
  1. import sys
  2. import scipy.io as sio
  3. from PyQt4 import QtGui, QtCore
  4. import cv2
  5.  
  6.  
  7. class VideoCapture(QtGui.QWidget):
  8.     def __init__(self, filename, parent):
  9.         super(QtGui.QWidget, self).__init__()
  10.         self.cap = cv2.VideoCapture(str(filename))
  11.         self.video_frame = QtGui.QLabel()
  12.         parent.layout.addWidget(self.video_frame)
  13.  
  14.     def nextFrameSlot(self):
  15.         ret, frame = self.cap.read()
  16.         frame = cv2.cvtColor(frame, cv2.cv.CV_BGR2RGB)
  17.         img = QtGui.QImage(frame, frame.shape[1], frame.shape[0], QtGui.QImage.Format_RGB888)
  18.         pix = QtGui.QPixmap.fromImage(img)
  19.         self.video_frame.setPixmap(pix)
  20.  
  21.     def start(self):
  22.         self.timer = QtCore.QTimer()
  23.         self.timer.timeout.connect(self.nextFrameSlot)
  24.         self.timer.start(1000.0/30)
  25.  
  26.     def pause(self):
  27.         self.timer.stop()
  28.  
  29.     def deleteLater(self):
  30.         self.cap.release()
  31.         super(QtGui.QWidget, self).deleteLater()
  32.  
  33.  
  34.  
  35.  
  36.  
  37. class VideoDisplayWidget(QtGui.QWidget):
  38.     def __init__(self,parent):
  39.         super(VideoDisplayWidget, self).__init__(parent)
  40.        
  41.     self.layout = QtGui.QFormLayout(self)
  42.  
  43.         self.startButton = QtGui.QPushButton('Start', parent)
  44.         self.startButton.clicked.connect(parent.startCapture)
  45.         self.startButton.setFixedWidth(50)
  46.         self.pauseButton = QtGui.QPushButton('Pause', parent)
  47.         self.pauseButton.setFixedWidth(50)
  48.         self.layout.addRow(self.startButton, self.pauseButton)
  49.        
  50.         self.setLayout(self.layout)
  51.  
  52.  
  53.  
  54.  
  55. class ControlWindow(QtGui.QMainWindow):
  56.     def __init__(self):
  57.         super(ControlWindow, self).__init__()
  58.         self.setGeometry(50, 50, 800, 600)
  59.         self.setWindowTitle("PyTrack")
  60.  
  61.         self.capture = None
  62.  
  63.         self.matPosFileName = None
  64.         self.videoFileName = None
  65.         self.positionData = None
  66.         self.updatedPositionData  = {'red_x':[], 'red_y':[], 'green_x':[], 'green_y': [], 'distance': []}
  67.         self.updatedMatPosFileName = None
  68.  
  69.             self.isVideoFileLoaded = False
  70.         self.isPositionFileLoaded = False
  71.  
  72.         self.quitAction = QtGui.QAction("&Exit", self)
  73.         self.quitAction.setShortcut("Ctrl+Q")
  74.         self.quitAction.setStatusTip('Close The App')
  75.         self.quitAction.triggered.connect(self.closeApplication)
  76.  
  77.         self.openMatFile = QtGui.QAction("&Open Position File", self)
  78.         self.openMatFile.setShortcut("Ctrl+Shift+T")
  79.         self.openMatFile.setStatusTip('Open .mat File')
  80.         self.openMatFile.triggered.connect(self.loadPosMatFile)
  81.  
  82.         self.openVideoFile = QtGui.QAction("&Open Video File", self)
  83.         self.openVideoFile.setShortcut("Ctrl+Shift+V")
  84.         self.openVideoFile.setStatusTip('Open .h264 File')
  85.         self.openVideoFile.triggered.connect(self.loadVideoFile)
  86.  
  87.         self.mainMenu = self.menuBar()
  88.         self.fileMenu = self.mainMenu.addMenu('&File')
  89.         self.fileMenu.addAction(self.openMatFile)
  90.         self.fileMenu.addAction(self.openVideoFile)
  91.         self.fileMenu.addAction(self.quitAction)
  92.        
  93.         self.videoDisplayWidget = VideoDisplayWidget(self)
  94.         self.setCentralWidget(self.videoDisplayWidget)
  95.  
  96.     def startCapture(self):
  97.         if not self.capture and self.isPositionFileLoaded and self.isVideoFileLoaded:
  98.             self.capture = VideoCapture(self.videoFileName, self.videoDisplayWidget)
  99.             self.videoDisplayWidget.pauseButton.clicked.connect(self.capture.pause)
  100.         self.capture.start()
  101.  
  102.     def endCapture(self):
  103.         self.capture.deleteLater()
  104.         self.capture = None
  105.  
  106.     def loadPosMatFile(self):
  107.         try:
  108.             self.matPosFileName = str(QtGui.QFileDialog.getOpenFileName(self, 'Select .mat position File'))
  109.             self.positionData = sio.loadmat(self.matPosFileName)
  110.             self.isPositionFileLoaded = True
  111.         except:
  112.             print "Please select a .mat file"
  113.  
  114.     def loadVideoFile(self):
  115.         try:
  116.             self.videoFileName = QtGui.QFileDialog.getOpenFileName(self, 'Select .h264 Video File')
  117.             self.isVideoFileLoaded = True
  118.         except:
  119.             print "Please select a .h264 file"
  120.  
  121.     def closeApplication(self):
  122.         choice = QtGui.QMessageBox.question(self, 'Message','Do you really want to exit?',QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
  123.         if choice == QtGui.QMessageBox.Yes:
  124.             print("Closing....")
  125.             sys.exit()
  126.         else:
  127.             pass
  128.  
  129.  
  130. if __name__ == '__main__':
  131.     import sys
  132.     app = QtGui.QApplication(sys.argv)
  133.     window = ControlWindow()
  134.     window.show()
  135.     sys.exit(app.exec_())
Add Comment
Please, Sign In to add comment