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") #录制的视频存放文件
  • 相关阅读:
    Windows Server 2012 R2 密钥
    C# 将List转成树的两种方式(递归、循环)
    C# 实现PPT、Word、Excel文件转为图片
    Net JavaScript:跨域问题(No 'Access-Control-Allow-Origin')
    IIS WebApi: 文件上传,大小限制,提示413 (Request Entity Too Large)
    layui动态表格数据选择添加穿梭框代码
    MySQL + Keepalived 双主热备高可用解决方案
    PHP高并发问题处理思路
    xhprof性能分析工具安装与使用
    uni-app在小程序中v-show指令失效
  • 原文地址:https://www.cnblogs.com/wycBlog/p/7356867.html
Copyright © 2011-2022 走看看