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

  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") #录制的视频存放文件

(17)Python读取摄像头并实现视频播放、暂停、指定目录保存、回放功能的更多相关文章

  1. 利用python+graphviz绘制数据结构关系图和指定目录下头文件包含关系图

    作为一名linux系统下的C语言开发,日常工作中经常遇到两个问题: 一是分析代码过程中,各种数据结构互相关联,只通过代码很难理清系统中所有结构体的整体架构,影响代码消化的效率; 二是多层头文件嵌套包含 ...

  2. python读取文件通过正则过滤需要信息然后保存到新文件里

    import osimport reimport fileinput def getDataFromFile():        rt = "/(.*)/(.*).apk"     ...

  3. python实现上传文件到linux指定目录

    今天接到一个小需求,就是想在windows环境下,上传压缩文件到linux指定的目录位置并且解压出来,然后我想了一下,这个可以用python试试写下. 环境:1.linux操作系统一台2.window ...

  4. 【Python】自动生成html文件查看指定目录中的所有图片

    获取本目录下的pic子目录中的所有图片(jpg,png,bmp,gif等,此处以jpg文件为例),然后生成一个image.html文件,打开该html文件即可在浏览器中查看pic子目录中的所有图片. ...

  5. python zip压缩文件 并移动到指定目录

    需要引入的3个包: import os import shutil import zipfile 1. # 创建zip文件对象your_zip_file_obj = zipfile.ZipFile(' ...

  6. Python 解压缩Zip和Rar文件到指定目录

    #__author__ = 'Joker'# -*- coding:utf-8 -*-import urllibimport osimport os.pathimport zipfilefrom zi ...

  7. Python读取JSON数据,并解决字符集不匹配问题

    今天来谈一谈Python解析JSON数据,并写入到本地文件的一个小例子. – 思路如下 从一个返回JSON天气数据的网站获取到目标JSON数据串 使用Python解析出需要的部分 写入到本地文件,供其 ...

  8. 最简单的基于FFmpeg的AVDevice例子(读取摄像头)

    =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...

  9. Python 读取图像文件的性能对比

    Python 读取图像文件的性能对比 使用 Python 读取一个保存在本地硬盘上的视频文件,视频文件的编码方式是使用的原始的 RGBA 格式写入的,即无压缩的原始视频文件.最开始直接使用 Pytho ...

随机推荐

  1. 使用itchat获取微信好友的男女比例

    # 使用itchat获取微信好友的男女比例 import itchat itchat.auto_login(hotReload=True) friends = itchat.get_friends(u ...

  2. Docker开启ssh服务

    一.准备 apt-get update       更新环境 apt-get install vim      安装vim vim  /etc/apt/source.list     更换软件源, 我 ...

  3. Java数据结构之算法时间度

    1.度量一个程序(算法)执行时间的两种方法 1)事后统计的方法 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序:二是所得时间的统计量依赖于计算机的硬件.软件 ...

  4. ES5中的继承

    继承 在面向对象的语言中, 大多语言都支持两种继承方式: 接口继承 和 实现继承, 接口继承 只继承方法签名, 实现继承 才继承实际的方法, ECMAScript 值支持 实现继承, 今天我们来谈谈实 ...

  5. [LeetCode] 132. 分割回文串 II

    题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ...

  6. 思维体操: HDU1008 Elevator

    Elevator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. Python 如何用列表实现栈和队列?

    1.栈结构,其实就是一个后进先出的一个线性表,只能在栈顶压入或弹出元素.用列表表示栈,则向栈中压入元素,可以用列表的append()方法来实现,弹出栈顶元素可以用列表的pop()方法实现. >& ...

  8. There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic.

    There are multiple modules with names that only differ in casing.This can lead to unexpected behavio ...

  9. 如何在github上部署自己的前端项目

    很多时候我们想需要一个地址就可以访问自己的前端作品, 但是注册一个服务器和域名是需要花钱,很多小伙伴都不愿意, 其实这种前端静态页面github就可以帮我们预览其效果,而且只要在有网的情况下都可以访问 ...

  10. Java web项目 本地配置https调试

    一.创建密匙 网上有很多教程,就不在此赘述了. 假设最后生成的密匙为tomcat.keystore 密码为123456. 二.配置tomcat 首先,将密匙移到tomcat下根目录下. 进入conf文 ...