首页 > 代码库 > Python-OpenCV教程-2

Python-OpenCV教程-2

OpenCV版本要求在2.3.1以上

本文主要介绍如何在Python中用OpenCV读取、保存和播放一段视频流以及用OpenCV来调用摄像头。


1.调用摄像头

为了捕捉摄像头的画面,我们首先要生成一个VideoCapture对象,这个对象的参数可以是设备号或者是视频文件的名称。设备号可以在/dev下查看,我的摄像头的设备名称是video0,所以设备号就是0。获得了VideoCapture对象后,我们就能通过这个对象的read函数来一帧一帧地获得图像了。

以下程序的效果是:从摄像头中获得图像,并把它转换成灰度图像,最后显示出来。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
其中,cap.read()还会返回一个bool类型的值,它代表返回的这一帧图像是否是正确的。我们可以检查这个返回值来确定一段视频是否已经播放到头了。

有时,cap会无法初始化capture,如果我们要检查初始化是否正常,可以使用cap.isOpened()这个函数。如果返回True,则用cap.open()来打开。

我们还能通过cap.get(proId)来获得一些视频的属性,并且通过cap.set(proId,value)来修改某些属性。proId的取值范围是0到18。

举个例子,我们可以通过cap.get(3)和cap.get(4)来获得视频的帧宽度以及帧高度,然后通过get函数去修改它们。

2.播放一个视频文件

播放视屏文件的流程几乎和调用摄像头是一样的,但是我们在调用摄像头中有一个重要的东西没讲,那就是我们要为cv.waitKey()设置一个合适的延时,如果延时太小,那么视频就会很快,如果延时太大,那么视频就会变得很慢(用这个方法可以去看慢动作),通过设这个值为1是比较合适的。

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):
    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()

3,保存视频文件

保存视频文件的流程略微复杂,首先我们需要确定以下的一些参数:视频的FourCC格式、视频的尺寸、视频每秒的帧数以及视频的颜色。然后根据这些参数,我们生成一个VideoWriter对象来保存这段视频文件。

设置FourCC格式时,原文里采用了cv2.VideoWriter_fourcc()这个函数,但我在运行程序的时候显示这个函数不存在,所以我改用了

cv2.cv.CV_FOURCC这个函数。关于FourCC该采用哪种格式,请参考最下面的原文。

下面的范例代买从摄像头中捕捉视频,并把这个视频倒立以后进行保存。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
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

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

翻译自http://docs.opencv.org/trunk/doc/py_tutorials/py_gui/py_video_display/py_video_display.html#display-video

Python-OpenCV教程-2