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

  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. 【Qt开发】设置中心窗口 setCentralWidget

    http://blog.csdn.net/qter_wd007/article/details/7028920 Qt程序中的主窗口通常具有一个中心窗口部件.从理论上来讲,任何继承自QWidget的类的 ...

  2. python函数-内置函数

    官方文档[http://www.cnblogs.com/dingkailinux/p/7954484.html] 1.int()函数,表示整形,如 1,2,-1,-2. 2.float()函数,表示浮 ...

  3. 把对像生成json并存储到文件

    1.创建实体对像json import com.alibaba.fastjson.annotation.JSONField; import java.util.Date; public class S ...

  4. Java——LinkedList底层源码分析

    1.简介 LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢.另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈 ...

  5. 为什么你的javascript学了这么久,水平还是烂成了渣?

    今年我给公司面试时,面试了百来个人,水平我就呵呵了,还觉得自己学了很久很厉害了,其实呢,渣的很呀,这篇文章送给想学好javascript找份工作的同学们. 首先要说明的是,咱现在不是高手,最多还是一个 ...

  6. 分布式事务——幂等设计(rocketmq案例)

    幂等指的就是执行多次和执行一次的效果相同,主要是为了防止数据重复消费.MQ中为了保证消息的可靠性,生产者发送消息失败(例如网络超时)会触发 "重试机制",它不是生产者重试而是MQ自 ...

  7. AutoTikv简介

    AutoTikv是一个用于对TiKV数据库进行自动调优的工具.它的设计灵感来自于SIGMOD 2017的一篇paper:Automatic Database Management System Tun ...

  8. git Permanently added the RSA host key for IP address '13.250.177.223' to the list of known hosts.

    只要把那个ip地址添加进hosts列表中就可解决. 参见:https://blog.csdn.net/hunhun1122/article/details/79752125

  9. vue中获取滚动table的可视页面宽度,调整表头与列对齐(每列宽度不都相同)

    mounted() { // 在mounted中监听表格scroll事件 this.$refs.scrollTable.addEventListener( 'scroll',(event) => ...

  10. Result window is too large, from + size must be less than or equal to: [10000] but was [78440]. See the scroll api for a more efficient way to request large data sets

    {"error":{"root_cause":[{"type":"query_phase_execution_exception& ...