准备这一两个月看看以前的书,另外学习下视频方面的东西(CV方面)。
之前学过几天QT/PyQt,于是用PyQt结合OpenCV,做了一个小程序。具有播放并保存摄像头捕获组成的视频,以及播放本地视频文件两个小功能。
界面很简单,没图没真相 。
代码就100多行,很容易看懂。最后感叹下OpenCV和python的强大,噢,还有QT/PyQt。。
#! /usr/bin/env python
#coding=utf-8
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
import opencv
from PIL import Image
#this is important for capturing/displaying images
from opencv import highgui
from opencv import cv
import time
MPEG1VIDEO = 0x314D4950
camera = highgui.cvCreateCameraCapture(0)#找摄像头,一般填0-99都可以
class MainWindow(QWidget):
def __init__(self, parent = None):
QWidget.__init__(self)
self.resize(550, 550)
self.setWindowTitle('vedio control')
self.status = 0 #0 is init status;1 is play video; 2 is capture video
self.image = QImage()
#录制的视频保存位置、格式等参数设定
self.videowriter = highgui.cvCreateVideoWriter("test.mpg", highgui.CV_FOURCC('m','p','g','1'), 25, cv.cvSize(200,200), 1)
#播放的视频位置
self.playcapture = highgui.cvCreateFileCapture("test.avi")
#初始化按钮
self.capturebtn = QPushButton('capture')
self.playbtn = QPushButton('play')
exitbtn = QPushButton('exit')
# 界面布局
vbox = QVBoxLayout()
vbox.addWidget(self.capturebtn)
vbox.addWidget(self.playbtn)
vbox.addWidget(exitbtn)
self.piclabel = QLabel('pic')
hbox = QHBoxLayout()
hbox.addLayout(vbox)
hbox.addStretch(1)
hbox.addWidget(self.piclabel)
self.setLayout(hbox)
#加载初始页面
if self.image.load("1.jpg"):
self.piclabel.setPixmap(QPixmap.fromImage(self.image))
#设定定时器
self.timer = Timer() #录制视频
self.playtimer = Timer("updatePlay()")#播放视频
#信号--槽
self.connect(self.timer, SIGNAL("updateTime()"),
self.CaptureVGA)
self.connect(self.capturebtn, SIGNAL("clicked()"),
self.PauseBegin)
self.connect(self.playtimer, SIGNAL("updatePlay()"),
self.PlayVideo)
self.connect(self.playbtn, SIGNAL("clicked()"),
self.VideoPlayPause)
self.connect(exitbtn, SIGNAL("clicked()"),
app, SLOT("quit()"))
def PlayVideo(self):
im = highgui.cvQueryFrame(self.playcapture)
im = opencv.adaptors.Ipl2PIL(im)
im = im.convert('RGB').tostring('jpeg', 'RGB')
self.image.loadFromData(QByteArray(im))
self.piclabel.setPixmap(QPixmap.fromImage(self.image))
def VideoPlayPause(self):
self.status, playstr, capturestr = ((1, 'pause', 'capture'), (0, 'play', 'capture'), (1, 'pause', 'capture'))[self.status]#三种状态分别对应的显示、处理
self.playbtn.setText(playstr)
self.capturebtn.setText(capturestr)
if self.status is 1:#状态1,播放视频
self.timer.stop()
self.playtimer.start()
else:
self.playtimer.stop()
def PauseBegin(self):
self.status, playstr, capturestr = ((2, 'play', 'pause'), (2, 'play', 'pause'), (0, 'play', 'capture'))[self.status]
self.capturebtn.setText(capturestr)
self.playbtn.setText(playstr)
print self.status, playstr, capturestr
if self.status is 2:#状态2,录制并显示视频
self.timer.start()
self.playtimer.stop()
else:
self.timer.stop()
def CaptureVGA(self):
im = highgui.cvQueryFrame(camera)
highgui.cvWriteFrame(self.videowriter, im)#录制视频,写入文件
#convert Ipl image to PIL image
im = opencv.adaptors.Ipl2PIL(im)
im = im.convert('RGB').tostring('jpeg', 'RGB')# 转换格式,jpeg
self.image.loadFromData(QByteArray(im))#格式支持QT,直接加载
#im.save('3.jpg')#opencv 返回的是Ipl 格式,QT无法直接显示。不知道如何转换格式,采用保存、读取的方式。
#pic.load('3.jpg')
self.piclabel.setPixmap(QPixmap.fromImage(self.image)) #一帧一帧的显示
class Timer(QThread):
def __init__(self, signal = "updateTime()", parent=None):
super(Timer, self).__init__(parent)
self.stoped = False
self.signal = signal
self.mutex = QMutex()
def run(self):
with QMutexLocker(self.mutex):
self.stoped = False
while True:
if self.stoped:
return
self.emit(SIGNAL(self.signal))
time.sleep(0.04) #40毫秒发送一次信号,每秒25帧
def stop(self):
with QMutexLocker(self.mutex):
self.stoped = True
def isStoped(self):
with QMutexLocker(sellf.mutex):
return self.stoped
if __name__ == "__main__" :
app = QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
相关推荐
### Python+OpenCV+PyQt5录制双目摄像头视频的实例详解 #### 一、引言 在实际应用中,经常需要使用多个摄像头同时录制视频,例如在立体视觉或者3D建模等领域。然而,市面上大多数现成的软件难以满足同时录制双目...
2. **视频编码与解码**:OpenCV 可以处理各种视频编码格式,如 H.264,这使得录制的视频可以在不同的平台上播放。 3. **图像处理**:OpenCV 包含一系列函数,用于对图像进行操作,如灰度转换、直方图均衡化、滤波、...
- 同步音频和视频:录制时,需要确保音频和视频同步,否则会导致播放时出现音画不同步的问题。这通常通过记录音频和视频的开始时间戳并进行相应调整来实现。 4. **时间戳与帧率**: - 在录制过程中,每个视频帧...
PyQt提供了QMediaPlayer和QVideoWidget,它们可以组合使用来播放视频流。 4. **摄像头接入**:使用Python的OpenCV库或其他相关库,可以获取来自本地摄像头的视频流,并将其馈送到PyQt的视频播放组件中。 5. **多...
本仓库为教程中所用到的源码、图片和音视频素材等目录入门篇标题简介了解和安装OpenCV-Python度量运行时间/提升效率的几种方式图片的载入/显示和保存高保真保存图片、Matplotlib库的简单使用打开摄像头捕获图片/录制...
- **OpenCV**: 虽然主要用于图像处理和计算机视觉,但OpenCV也能播放视频文件。 - **matplotlib**:这个数据可视化库也可以通过`matplotlib.pyplot.imshow()`显示视频帧。 - **imageio**: 一个通用的多媒体读写库...
- 高质量的屏幕录制需要维持恒定的帧率,以确保视频播放流畅。这通常通过设置合适的间隔时间来控制录制间隔,确保每秒捕获特定数量的帧。 3. **视频编码与格式**: - 录制的屏幕数据需要编码成特定的视频格式,如...
PyAudio用于音频处理,可以录制、播放声音;OpenCV则在视频处理方面发挥作用,可以捕获、处理和传输视频流。 为了实现即时通讯,ChatApp可能还利用了WebSockets协议,这是一种全双工的通信协议,能在客户端和服务器...
4. **音频通信**:`pyaudio`库用于音频的录制和播放,实现双向语音通信,让主人能听到宠物的声音,同时向宠物播放声音,增强互动体验。 5. **硬件交互**:如果系统包含智能玩具,可能需要与硬件设备(如蓝牙或Wi-Fi...
GUI允许用户输入RTSP流的URL,控制播放,以及可能的其他高级功能,如多摄像头管理、录制等功能。 5. **多线程和并发处理**:由于实时视频流需要持续不断地接收和处理数据,因此多线程技术在RTSPCamViewer中扮演着...