PyQt+OpenCV 录制保存、播放视频

标签: pyqt opencv 播放 | 发表时间:2016-02-13 18:36 | 作者:hereson
分享到:
出处:http://www.iteye.com

准备这一两个月看看以前的书,另外学习下视频方面的东西(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_())



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [pyqt opencv 播放] 推荐:

PyQt+OpenCV 录制保存、播放视频

- - 编程语言 - ITeye博客
准备这一两个月看看以前的书,另外学习下视频方面的东西(CV方面). 之前学过几天QT/PyQt,于是用PyQt结合OpenCV,做了一个小程序. 具有播放并保存摄像头捕获组成的视频,以及播放本地视频文件两个小功能. 界面很简单,没图没真相. 代码就100多行,很容易看懂. 最后感叹下OpenCV和python的强大,噢,还有QT/PyQt.

Windows平台上编译OpenCV的Android版本

- Pei - C++博客-首页原创精华区
Android NDK(r5b或更高版本). 在opencv\android\scripts\目录下,新建wincfg.cmd文件. 关于wincfg.cmd文件的配置,可以参考opencv\android\scripts\wincmd.cfg.tmpl文件. 编译完成即可在opencv\android\build目录下得到所有的静态库文件.

记录下用OpenCV做Demo时候用到的小代码

- Fenix - 丕子
Demo做完了,但是鲁棒性和泛化能力很差,是关于视频中人体检测跟踪以及计数的,对我这个没有接触过视频以及跟踪的人来说,10天搞定还真是困难很大. 主要就是先进行图像差将运动的前景减出来,然后只要在前景当中运行HOG的MultiScale方法检测行人,这样可以提高一部分效率,毕竟前景图都是原始图的子图.

在 Mac OS X 10.6 下编译安装高性能 OpenCV 库

- Wolf - Chun Tian (binghe)
最初由 Intel 开发的 OpenCV 库已经逐渐成为目前计算机视觉和图像识别领域的事实标准了,教科书里几乎所有的主流图形算法都在 OpenCV 里可以找到高效的实现. 为了完成公司安排给我的工作,这个库是我的必经之路,道理很简单:我不可能花费一个相关专业的硕士研究生的在校时间去把所有底层算法从头学习并实现一遍,我的时间顶多只有一两个月,因此重要的是如何用尽可能少的时间把整个工作中我最不擅长的部分用现成的开源软件来完成.

利用OpenCV的人脸检测给头像带上圣诞帽

- - CSDN博客综合推荐文章
采用一张圣诞帽的png图像作为素材,.     利用png图像背景是透明的,贴在背景图片上就是戴帽子的效果了. 人脸检测的目的主要是为了确定贴帽子的位置,类似ps中自由变换的功能,检测到人脸中间的位置,resize圣诞帽子和人脸大小匹配,确定位置,贴上去,ok. 代码:非常简洁,根据参考博客给出的代码,由OpenCV自带的人脸检测代码经过简单修改即可.

在ubuntu10.04+上播放DVD

- zyhong17 - Wow! Ubuntu
ubuntu默认没有可以播放商业DVD电影的软件,即使软件源中也不存在. 通常在无法播放DVD时会提示“ An error occurred: Could not read from resource”. 以下方法可以使你在10.04之后的版本上轻松播放DVD. (Totem-gstreamer 默认可以播放DVD,但是存在一些bug).

WebView中的视频播放

- - 移动开发 - ITeye博客
activity_main.xml如下:. private String videoUrl = "视频地址.mp4";. private String imgUrl = "视频封面图片地址.png";. private String html = "<html>视频如下:<br/><a href='" + videoUrl.

nginx 播放视频(1)

- - ITeye博客
1,首先拷贝一个flv文件到nginx 的html目录中. cp /var/www/html/ajl/uploadvideos/20150428101917_31520150408监利新闻(三).flv ./. flv文件的路径是:/usr/local/nginx/html/broadcast2/20150428101917_31520150408监利新闻(三).flv.

【Android】播放视频的简易播放器源码

- - CSDN博客推荐文章
一,MainActivity.java源码. if(!checkSDCard()) //如果没有SD卡. mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1); //显示动画用的容器. 三,源码中所需其余图片等 ,自备就可以.