Python+opencv(二)——视频的读入,显示和保存

 

用摄像头捕获视频

摄像头捕获视频简单的来说就是捕获每一帧图片

  • 创建一个VideoCapture对象

    • 可以用如下的方式来创建: cap = cv2.VideoCapture(0)

      • VideoCapture对象的参数可以是设备的索引号或者一个视频文件,一般0是指一般笔记本的内置摄像头
  • 查看每一帧图片是否正确捕获

    • 然后可以用cap.read()来查看帧数是否读取正确,这里的cap是你创建的VideoCapture对象,cap.read()会返回一个元组。

      • 元组中的第一个元素是True/False,代表帧数是否读取正确,如果读取正确则会返回True
      • 第二个参数是捕获的每一帧的画面

效果图如下

(True, array([[[ 77,  96,  85],
        [ 81,  99,  88],
        [ 81,  99,  88],
        ...,
        [ 41,  59,  62],
        [ 44,  58,  59],
        [ 43,  57,  58]],

       [[ 80,  94,  84],
        [ 81,  95,  85],
        [ 83,  96,  86],
        ...,
        [ 43,  59,  60],
        [ 48,  62,  61],
        [ 46,  59,  58]],

       [[ 84,  95,  85],
        [ 85,  96,  86],
        [ 87,  95,  88],
        ...,
        [ 41,  57,  58],
        [ 45,  61,  59],
        [ 43,  60,  58]],

       ...,

       [[ 98,  85,  52],
        [ 98,  85,  52],
        [ 99,  83,  53],
        ...,
        [ 93, 103,  88],
        [ 95, 104,  94],
        [ 94, 103,  93]],

       [[ 91,  78,  47],
        [ 91,  78,  47],
        [ 89,  76,  52],
        ...,
        [ 95, 105,  92],
        [ 94, 105,  95],
        [ 94, 105,  95]],

       [[ 80,  70,  44],
        [ 78,  68,  41],
        [ 70,  61,  41],
        ...,
        [ 91, 105,  92],
        [ 89, 105,  94],
        [ 89, 105,  94]]], dtype=uint8))
  • 常用的颜色转换函数cv2.cvtColor()

    • opencv中有一个常用的颜色转换函数cv2.cvtColor()

      • 这个函数的第一个参数是图像信息
      • 这个函数的第二个参数是要转换的类型,第二个参数主要有如下几个
        • COLOR_BGR2GRAY               BGR<->Gray
        • cv2.COLOR_BGR2HSV            BGR<->HSV
  • 我们可以用下面这段代码来打开摄像头并且开始捕获视屏: 

import numpy as np
import cv2


cap = cv2.VideoCapture(0)

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

    • 当然有时候我们不一定能够打开摄像头装置,我们可以用cap.isOpened()来检查是否初始化成功,如果返回值是True那么表示没有问题,不然就要使用函数cap.open()来打开摄像头
  • 获取视频参数信息

  • 我们可以用cap.get(propId)来获视频的一些参数信息,这里的propId是0到18中的任意数字,每个数字代表一个属性
参数 功能/意义
CV_CAP_PROP_POS_MSEC 0 视频文件的当前位置(以毫秒为单位)或视频捕获时间戳。
CV_CAP_PROP_POS_FRAMES 1 基于0的索引将被解码/捕获下一帧。
CV_CAP_PROP_POS_AVI_RATIO 2 视频文件的相对位置:0 - 电影的开始,电影的1 - 结束。
CV_CAP_PROP_FRAME_WIDTH 3 视频每一帧的宽。
CV_CAP_PROP_FRAME_HEIGHT 4 视频每一帧的高。
CV_CAP_PROP_FPS 5 视频的帧速。
CV_CAP_PROP_FOURCC 6 4个字符表示的视频编码器格式。
CV_CAP_PROP_FRAME_COUNT 7 视频的帧数。
CV_CAP_PROP_FORMAT 8 byretrieve()返回的Mat对象的格式。
CV_CAP_PROP_MODE 9 指示当前捕获模式的后端特定值。
CV_CAP_PROP_BRIGHTNESS 10 图像的亮度(仅适用于相机)。
CV_CAP_PROP_CONTRAST 11 图像对比度(仅适用于相机)。
CV_CAP_PROP_SATURATION 12 图像的饱和度(仅适用于相机)。
CV_CAP_PROP_HUE 13 图像的色相(仅适用于相机)。
CV_CAP_PROP_GAIN 14 图像的增益(仅适用于相机)。
CV_CAP_PROP_EXPOSURE 15 曝光(仅适用于相机)。
CV_CAP_PROP_CONVERT_RGB 16 表示图像是否应转换为RGB的布尔标志。
CV_CAP_PROP_WHITE_BALANCE 17 目前不支持
CV_CAP_PROP_RECTIFICATION 18 立体摄像机的整流标志(注意:只有当前支持DC1394 v 2.x后端)
  • 修改视频的参数信

    • 我们可以用cap.set(propId,value)来修改视频的参数,其中value是要设置成的值

从文件中播放视频

文件中播放视频和摄像头捕获视频一样,只是我们要将索引号改为视屏文件的名字,在播放每一帧的时候,使用cv2.waitKey()来设置合适的持续时间,通常情况下,25毫秒就够了。代码如下,只需要修改VideoCapture的值便可。

import numpy as np
import cv2
 
cap = cv2.VideoCapture('7D8C0161054035F6A30F0342C237F6D4.mp4')
 
while(cap.isOpened()):
    
    ret, frame = cap.read()
    if frame is None:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    cv2.imshow('frame',gray)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break
 
cap.release()
cv2.destroyAllWindows()

保存视频

  • 创建保存视频对象

    • 我们只需要创建一个VideoWrite对象 out = cv2.VideoWriter('filename',fourcc, 20.0, (640,480))
      • 创建这个对象的时候第一个参数是你要保存的视频的文件名
      • 第二个参数是fourcc,若将第二个参数设为-1那么程序运行的时候会弹出来要你从系统已经有的编码方式中选择一个
      • 第三个参数是播放频率
      • 第四个参数第四个参数是帧的大小
      • FourCC是一个四字节的字节码,用来确定视频的编码格式,可用的编码列表可以从fourcc.org中查到
        • FourCC可以用以下的方法传送的程序:
          • opencv3的话用这种方法(其中的*'XVID'是编码格式):
            • fourcc = cv2.VideoWriter_fourcc(*'XVID')
              out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
               
              • In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. MJPG results in high size video. X264 gives very small size video)
              • In Windows: DIVX (More to be tested and added)
              • In OSX : (I don’t have access to OSX. Can some one fill this?)

我们也可以设置isColor标签,如果设置为True那么就是每一帧的图片都是彩色。

 

下面这段代码就是捕捉摄像头的视频并且保存他

import numpy as np
import cv2

cap = cv2.VideoCapture(0)


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) //如果你需要将视频倒转之后保存,那么你可以加入这句代码
  	    out.write(frame)
  	    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
  	    break

cap.release()
out.release()
cv2.destroyAllWindows()

 

你可能感兴趣的:(pythton+opencv)