关闭

【OpenCv-Python】二、Getting Started with Videos

标签: OpenCvPython中文手册图像识别处理视频
52人阅读 评论(0) 收藏 举报
分类:

开始使用视频

目标

  • 学会读取视频、显示视频和保存视频
  • 学会从摄像头中捕捉并显示它
  • 你将要学习这两个函数:cv2.VideoCapture(), cv2.VideoWriter()

2.1 从摄像头中捕捉视频

通常,我们必须用摄像头捕捉实时图像。OpenCv 为此提供了一个非常简单的接口。让我们使用摄像头捕获一段视频(我正使用我的笔记本电脑内置的摄像头),将它转换成灰度视频并显示它。这是是一个简单的开始。

为了捕获视频,你需要创建一个 VideoCapture 对象。它的参数可以是设备索引,也可以是视频文件的名称。设备索引就是指定的摄像头的编号。一般的笔记本中都有摄像头(比如在我的例子中)。所以我只传递 0 (或者 -1)。你可以通过传递 1 选择第二个摄像头等。之后,你就可以一帧一帧的捕获视频里。但是在最后不要忘了停止捕获视频。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    #一帧一帧捕获视频 
    #ret的值为True 或 False 。frame 表示当前截取一帧的图片
    ret, frame = cap.read()

    #在这里,我们在每一帧上操作
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    #显示帧的结果
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#当一切结束时,释放资源
cap.release()
cv2.destroyAllWindows()

cap.read() 返回一个布尔值(True / False)。如果帧读取是正确的,它会返回True。因此你可以通过检查它的返回值确定视频是否到达了文件尾。

有时,cap 不能正确的初始化捕获。这种情况下,上面的代码会报错。你可以检查它是否进行了初始化通过 cap.isOpened() 方法。如果返回值 是True,那么则没问题。否则,就使用 cap.open()。

你可以使用函数 cap.get(prold) 来获得视频的一些参数信息。这里propld 可以是1-18的任意整数。每一个数字表示视频的一个属性(如果它适用于该视频),可以在这里看到完整的详细信息:属性标识符,其中的一些值可以用 cap.set(propld,value) 进行修改。value 是你想要的新值。

例如,我可以使用 cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640x480 。但是我们可以使用 ret=cap.set(3,320) 和 ret=cap.set(4,240) 来把宽和高改成320x240

注意

当你的程序报错时,你首先应该检查的是你的摄像头能否在其他的程序中正常工作(比如Linux 下的 Cheese)

2.2 从文件中播放视频

与从摄像头中捕获相同,只要将摄像头的设备索引号改成视频的文件名称即可。在播放每一帧时,使用cv2.waitKey() 设置适当的持续时间。如果设置的太低视频就会播放的非常快,如果设置的太高,视频就会播放的特别慢(当然,这就是你如何使用慢镜头显示视频的方法)。25毫秒在正常情况下是可以的。

import numpy as np
import cv2
#改写了原文档中代码 改写后代码在视频播放完后,会自动退出循环
cap = cv2.VideoCapture('video1.avi')

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        cv2.imshow('frame',gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else :
        break
cap.release()
cv2.destroyAllWindows()

注意

你应该确保你已经正确安装了合适版本的 ffmpeg 或者 gstreamer。如果你装错了那就比较头疼了。

2.3 保存视频

我们捕获一个视频,然后一帧帧处理并且想保存这个视频。对于图像来说它是非常简单的,只需要使用 cv.imwrite().但是在这里,需要做更多的工作。

这次我们创建一个 VideoWriter 对象。我们应该指定一个输出文件名称(比如:out.avi) 然后,我们需要指定 FourCC 编码(下面将要介绍)。每秒的帧数和帧大小也需要确定。最后一个时 isColor 标志,如果时 True,每一帧就是彩色图,否则就是灰色图。

FourCC 是一个四字节码,用来确定视频的编码格式。可用的编码列表可以从 fourcc.org 查到。这是依赖于平台,下面的编码器对我来说没问题。

  • In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID 更加适合. MJPG 的结果是高尺寸的视频. X264 提供非常小的视频)
  • In Windows: DIVX (有待测试和添加)
  • In OSX :(我没有OSX的权限。有人能够填这张表吗?)

FourCC 码是以下面的格式传给程序,以MJPG为例:cv2.VideoWriter_fourcc(‘M’,’J’,’P’,’G’)
或者cv2.VideoWriter_fourcc(*’MJPG)

下面的代码是从摄像投中捕获视频,沿水平方向旋转每一帧并保存它。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# 定义编码格式并且创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# 如果工作结束则释放掉所有资源
cap.release()
out.release()
cv2.destroyAllWindows()

个人补充部分

上面的保存视频代码在MAC 上执行报错,可能在windows 上可以。
下面保存视频代码,可在Mac 上成功运行。

# coding:utf-8
import cv2
import sys


cap = cv2.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
cap.set(1, 10.0)
#此处fourcc的在MAC上有效,如果视频保存为空,那么可以改一下这个参数试试, 也可以是-1
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
# 第三个参数则是镜头快慢的,10为正常,小于10为慢镜头
out = cv2.VideoWriter('output2.avi', fourcc,10,(640,480))
while True:
    ret,frame = cap.read()
    if ret == True:
        frame = cv2.flip(frame, 1)
        a = out.write(frame)
        cv2.imshow("frame", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()
1
0
查看评论

TensorFlow学习篇【1】Getting Started With TensorFlow

学习网址:https://www.tensorflow.org/get_started/get_started This guide gets you started programming in TensorFlow. Before using this guide, inst...
  • lingyu666hapy
  • lingyu666hapy
  • 2017-03-14 16:52
  • 723

【OpenCv-Python】一、Getting Started with Images

1.1读入图像 使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,或者给函数提供一个完整的路径,第二个参数是要告诉函数应该如何读取这幅图片。 cv2.IMREAD_COLOR:读取一副彩色图像。图像的透明度会被忽略,这是默认参数。 cv2.IMREAD...
  • vcx08
  • vcx08
  • 2018-01-07 13:34
  • 78

《Getting Started with WebRTC》第二章 WebRTC技术介绍

《Getting Started with WebRTC》第二章 WebRTC技术介绍 本章作WebRTC的技术介绍,主要讲以下的概念:   .  如何建立P2P的通信   .  有效的信令选项   .  关键API的关系 ...
  • fireroll
  • fireroll
  • 2015-03-12 21:50
  • 1693

2016.9.13 Programming for Everybody (Getting Started with Python)

传送门:https://www.coursera.org/account/accomplishments/certificate/JMA8ZGF6ZT6R
  • qq_33638791
  • qq_33638791
  • 2016-09-13 11:45
  • 440

LLVM每日谈之十九 LLVM的第一本系统的书<Getting Started with LLVM Core Libraries>

作者:史宁宁(snsn1984)LLVM终于有了一本系统的书了——《Getting Started with LLVM Core Libraries》。这本书号称是LLVM的第一本书,但是据说日本早就有两本日文的关于LLVM的书,这个了解的不多。不过可以肯定的是,这本书是英文表述的第一本书。这本书的...
  • snsn1984
  • snsn1984
  • 2014-11-05 09:59
  • 5276

Getting Started with LLVM Core Libraries阅读笔记

Getting Started with LLVM Core Libraries 目录 1 Build and Install LLVM2 External Projects3 Tools and Design4 Frontend5 LLVM IR6 Ba...
  • cteng
  • cteng
  • 2014-09-21 00:19
  • 2983

《getting started with p5.js》(中文版) 第一章 您好:了解p5.js

第一章 您好:了解p5.js
  • weixin_38082483
  • weixin_38082483
  • 2017-12-20 12:29
  • 255

使用MAT分析Android的内存

如果使用DDMS确实发现了我们程序中存在内存泄露,那如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候。这里介绍一个极好的内存分析工具Memory Analyzer Tool(MAT)。  ...
  • u011494050
  • u011494050
  • 2014-07-02 15:05
  • 1099

Best Machine Learning Resources for Getting Started

Best Machine Learning Resources for Getting Started by Jasonb on November 27, 2013 in Machine Learning 101, Resou...
  • hj_huangjun
  • hj_huangjun
  • 2014-01-22 10:43
  • 1430

JUCE

JUCE   JUCE (Jules' Utility Class Extensions)是由Raw MaterialSoftware发布的一套基于c++的跨平台应用程序框架类库(Windows, Mac,Linux)。JUCE的特殊之处在于其友好的用户界面以及强大的音频、图像
  • gxp
  • gxp
  • 2011-09-27 09:56
  • 7549
    个人资料
    • 访问:126510次
    • 积分:3214
    • 等级:
    • 排名:第12600名
    • 原创:187篇
    • 转载:4篇
    • 译文:9篇
    • 评论:33条
    RUNNING|~_~|My web
    微信公众号
    课程设计、视频资源、有料趣文
    Worldhello


    微信公众号:Worldhello
    期待您的关注!
    博客专栏
    最新评论