zoukankan      html  css  js  c++  java
  • (17)Python读取摄像头并实现视频播放、暂停、指定目录保存、回放功能

    读取摄像头并播放、暂停功能

    1. import sys
    2. #import scipy.io as sio
    3. from PyQt5 import QtGui, QtCore, QtWidgets
    4. #from wyc import Ui_Form
    5. import cv2
    6. import numpy as np
    7. class VideoCapture(QtWidgets.QWidget):
    8. def __init__(self, filename, parent):
    9. super(QtWidgets.QWidget, self).__init__()
    10. self.cap = cv2.VideoCapture(0)
    11. self.video_frame = QtWidgets.QLabel()
    12. parent.layout.addWidget(self.video_frame)
    13. def nextFrameSlot(self):
    14. ret, frame = self.cap.read()
    15. # frame = cv2.cvtColor(frame, cv2.cv.CV_BGR2RGB)
    16. frame2 = np.zeros((frame.shape), dtype=np.int8)
    17. # BGR
    18. frame2[:, :, 0] = frame[:, :, 2]
    19. frame2[:, :, 1] = frame[:, :, 1]
    20. frame2[:, :, 2] = frame[:, :, 0]
    21. img = QtGui.QImage(frame2, frame2.shape[1], frame2.shape[0], QtGui.QImage.Format_RGB888)
    22. pix = QtGui.QPixmap.fromImage(img)
    23. self.video_frame.setPixmap(pix)
    24. def start(self):
    25. self.timer = QtCore.QTimer()
    26. self.timer.timeout.connect(self.nextFrameSlot)
    27. self.timer.start(1000.0/30)
    28. def pause(self):
    29. self.timer.stop()
    30. def deleteLater(self):
    31. self.cap.release()
    32. super(QtGui.QWidget, self).deleteLater()
    33. class VideoDisplayWidget(QtWidgets.QWidget):
    34. def __init__(self,parent):
    35. super(VideoDisplayWidget, self).__init__(parent)
    36. self.layout = QtWidgets.QFormLayout(self)
    37. self.startButton = QtWidgets.QPushButton('播放', parent)
    38. self.startButton.clicked.connect(parent.startCapture)
    39. self.startButton.setFixedWidth(50)
    40. self.pauseButton = QtWidgets.QPushButton('暂停', parent)
    41. self.pauseButton.setFixedWidth(50)
    42. self.layout.addRow(self.startButton, self.pauseButton)
    43. self.setLayout(self.layout)
    44. class ControlWindow(QtWidgets.QMainWindow):
    45. def __init__(self):
    46. super(ControlWindow, self).__init__()
    47. self.setGeometry(100, 100, 800, 600)
    48. self.setWindowTitle("视频显示demo")
    49. self.capture = None
    50. self.matPosFileName = None
    51. self.videoFileName = None
    52. self.positionData = None
    53. self.updatedPositionData = {'red_x':[], 'red_y':[], 'green_x':[], 'green_y': [], 'distance': []}
    54. self.updatedMatPosFileName = None
    55. self.isVideoFileLoaded = True
    56. self.isPositionFileLoaded = True
    57. self.quitAction = QtWidgets.QAction("&Exit", self)
    58. self.quitAction.setShortcut("Ctrl+Q")
    59. self.quitAction.setStatusTip('Close The App')
    60. self.quitAction.triggered.connect(self.closeApplication)
    61. # self.openMatFile = QtWidgets.QAction("&Open Position File", self)
    62. # self.openMatFile.setShortcut("Ctrl+Shift+T")
    63. # self.openMatFile.setStatusTip('Open .mat File')
    64. # self.openMatFile.triggered.connect(self.loadPosMatFile)
    65. # self.openVideoFile = QtWidgets.QAction("&Open Video File", self)
    66. # self.openVideoFile.setShortcut("Ctrl+Shift+V")
    67. # self.openVideoFile.setStatusTip('Open .h264 File')
    68. # self.openVideoFile.triggered.connect(self.loadVideoFile)
    69. # self.mainMenu = self.menuBar()
    70. # self.fileMenu = self.mainMenu.addMenu('&File')
    71. # self.fileMenu.addAction(self.openMatFile)
    72. # self.fileMenu.addAction(self.openVideoFile)
    73. # self.fileMenu.addAction(self.quitAction)
    74. self.videoDisplayWidget = VideoDisplayWidget(self)
    75. self.setCentralWidget(self.videoDisplayWidget)
    76. def startCapture(self):
    77. if not self.capture and self.isPositionFileLoaded and self.isVideoFileLoaded:
    78. self.capture = VideoCapture(self.videoFileName, self.videoDisplayWidget)
    79. self.videoDisplayWidget.pauseButton.clicked.connect(self.capture.pause)
    80. self.capture.start()
    81. def endCapture(self):
    82. self.capture.deleteLater()
    83. self.capture = None
    84. # def loadPosMatFile(self):
    85. # try:
    86. # self.matPosFileName = str(QtGui.QFileDialog.getOpenFileName(self, 'Select .mat position File'))
    87. # self.positionData = sio.loadmat(self.matPosFileName)
    88. # self.isPositionFileLoaded = True
    89. # except:
    90. # print("Please select a .mat file")
    91. # def loadVideoFile(self):
    92. # try:
    93. # self.videoFileName = QtGui.QFileDialog.getOpenFileName(self, 'Select .h264 Video File')
    94. # self.isVideoFileLoaded = True
    95. # except:
    96. # print("Please select a .h264 file")
    97. def closeApplication(self):
    98. choice = QtGui.QMessageBox.question(self, 'Message','Do you really want to exit?',QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
    99. if choice == QtGui.QMessageBox.Yes:
    100. print("Closing....")
    101. sys.exit()
    102. else:
    103. pass
    104. if __name__ == '__main__':
    105. import sys
    106. app = QtWidgets.QApplication(sys.argv)
    107. window = ControlWindow()
    108. window.show()
    109. sys.exit(app.exec_())

    回放、指定目录保存功能

    1. 以时间戳的形式保存视频:
    2. import cv2
    3. import datetime
    4. cap = cv2.VideoCapture(0)
    5. import os.path
    6. save_path = 'G:/Temp/' #以特定前缀保存视频文件到指定目录
    7. timeNow = "%s.avi" % (datetime.datetime.now().strftime('%Y_%m_%d_%H-%M-0%S'))
    8. completeName = os.path.join(save_path, timeNow)
    9. out = (cv2.VideoWriter(timeNow, cv2.VideoWriter_fourcc(*'PIM1'), 30.0, (640, 480))) #第三个参数是帧率
    10. while cap.isOpened():
    11. ret, frame = cap.read()
    12. if ret==True:
    13. out.write(frame)
    14. cv2.imshow('frame', frame)
    15. if cv2.waitKey(1) & 0xFF == ord('q'):
    16. break
    17. else:
    18. break
    19. # Release everything if job is finished
    20. cap.release()
    21. out.release()
    22. cv2.destroyAllWindows()
    23. 回放视频:
    24. import os
    25. def videoBack(self):
    26. os.startfile("G:/Tx2Project/VideoShow") #录制的视频存放文件
  • 相关阅读:
    HDU 4024 Dwarven Sniper’s hunting(数学公式 或者是二分)
    二分图最大匹配总结
    HDU 4022 Bombing (STL应用)
    HDU 1847 Good Luck in CET4 Everybody!(组合博弈)
    HDU 1556 Color the ball(树状数组)
    HDU 4023 Game(博弈)
    HDU 1406 完数(水题)
    HDU 4021 24 Puzzle
    Oracle 多表查询优化
    【编程之美】字符串移位包含的问题(续)
  • 原文地址:https://www.cnblogs.com/wycBlog/p/7356867.html
Copyright © 2011-2022 走看看