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

标签: pyqt opencv 播放 | 发表时间:2016-02-14 02: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自带的人脸检测代码经过简单修改即可.

[译] OpenCV vs Dlib 人脸检测比较分析

- - IT瘾-dev
点击我爱计算机视觉标星,更快获取CVML新技术. 人脸检测是计算机视觉最典型的应用之一,早期OpenCV的logo就是Haar人脸检测的示意图. 很多人的第一个OpenCV学习目标就是跑通Haar级联人脸检测,Dlib库在业内开始流行很大程度上是因为其HOG-SVM人脸检测比OpenCV Haar的好,而近年来OpenCV和Dlib均已包含基于深度学习的人脸检测算法实现.

[OpenCV实战]5 基于深度学习的文本检测

- - IT瘾-geek
在这篇文章中,我们将逐字逐句地尝试找到图片中的单词. 基于最近的一篇论文进行文字检测. 应该注意,文本检测不同于文本识别. 在文本检测中,我们只检测文本周围的边界框. 但是,在文本识别中,我们实际上找到了框中所写的内容. 例如,在下面给出的图像中,文本检测将为您提供单词周围的边界框,文本识别将告诉您该框包含单词STOP.

使用opencv的dnn模块来进行yolov5的目标检测

- - YOLO – 迷途小书童的Note
yolov5 的 C++ 部署方案中,. opencv 应该是最能被想到的一种,从 3.3 版本后, opencv 就加入了. dnn 这个模块,有了这个模块,很多的机器学习项目就可以通过它来实现部署了,下面我们就来看看具体的实现步骤. 由于 opencv 无法直接读取. yolov5 中的 pt 模型文件,因此,需要将原来的 pt 文件转换成 opencv 能直接读取的 onnx 模型文件.

Adrian小哥教程:如何使用Tesseract和OpenCV执行OCR和文本识别

- - 机器之心
近期,Adrian Rosebrock 发布一篇教程,介绍了如何使用 OpenCV、Python 和 Tesseract 执行文本检测和文本识别. 从安装软件和环境、项目流程、review 代码、实验结果,到展示局限、提出建议,这篇教程可以说十分详细了. 机器之心对该教程进行了摘要编译介绍. 本教程将介绍如何使用 OpenCV OCR.

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑 - 【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 - CSDN博客

- -
本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器. 文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码. 在介绍四块知识点的时候分别一个,以及最后的综合示例中的一个. 依然是是放出一些程序运行截图吧:.