美文网首页
上手OpenCV_GUI-L02-视频

上手OpenCV_GUI-L02-视频

作者: 全栈顾问 | 来源:发表于2019-06-10 15:13 被阅读0次

    目标

    学习如何读取、显示、保存视频。

    学习如何读取摄像头并显示。

    学习如何使用cv2.VideoCapture()和cv2.VideoWriter()函数。

    从摄像头捕获视频

    创建一个VideoCapture对象捕获视频。它的参数是一个设备索引号或视频文件的名称。设备索引号代表了特定摄像头。建立好对象后,可以一帧一帧地进行捕获。用完后要释放掉这个对象。

    获得摄像头的视频并播放。

    # coding: utf-8
    import numpy as np
    import cv2 as cv
    
    cap = cv.VideoCapture(0)
    if not cap.isOpened():
        print("Cannot open camera")
        exit()
    while True:
        # Capture frame-by-frame
        ret, frame = cap.read()
        # if frame is read correctly ret is True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        # Our operations on the frame come here
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        # Display the resulting frame
        cv.imshow('frame', gray)
        if cv.waitKey(1) == ord('q'):
            break
    # When everything done, release the capture
    cap.release()
    cv.destroyAllWindows()
    

    cap.read()返回一个布尔值。如果成功读取1帧,返回True。所以,可以通过检查这个返回值判断视频是否已经结束。

    有时候,cap可能没有初始化摄像头。这种情况,会显示代码错误。可以通过cap.IsOpened()检查是否已经初始化。返回True就是成功的,否则用cap.open()函数打开。

    你还可以通过函数cap.get(propId)获得一些视频的属性。propId的取值范围是0-18。每个值的定义可以通过查看 cv::VideoCapture::get()。其中的一些属性可以通过cap.set(propId,value)设置。

    例如:你可以通过get函数获得帧的宽度和高度,cap.get(cv2.CAP_PROP_FRAME_WIDTH) / cap.get(cv2.CAP_PROP_FRAME_HEIGHT),默认返回的是640x480。也可以通过set函数设置宽度和高度,ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320) and ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)。

    播放视频文件

    将参数改为视频文件,就可以播放一个文件。cv2.waitKey()决定了每1帧之间的间隔,如果太小视频就非常快,如果太大就非常慢,25毫秒通常比较合适。

    # coding: utf-8
    import numpy as np
    import cv2 as cv
    
    cap = cv.VideoCapture('01.mp4')
    while cap.isOpened():
        ret, frame = cap.read()
        # if frame is read correctly ret is True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        cv.imshow('frame', gray)
        if cv.waitKey(1) == ord('q'):
            break
    cap.release()
    cv.destroyAllWindows()
    

    保存视频

    创建一个VideoWriter对象。指定输出的文件名。指定FourCC编码。指定每秒帧数和帧大小。指定彩色还是灰度。

    FourCC是一个4位编码用来指定视频编码器。

    • 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: MJPG (.mp4), DIVX (.avi), X264 (.mkv).

    获得摄像头的视频,翻转图像,保存成avi格式的文件。

    # coding: utf-8
    import numpy as np
    import cv2 as cv
    
    cap = cv.VideoCapture(0)
    # Define the codec and create VideoWriter object
    fourcc = cv.VideoWriter_fourcc(*'DIVX')
    
    # 需要保证VideoWriter的size和摄像头的size一致,否则无法保存
    frame_width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
    frame_height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
    print("frame size:%fx%f", frame_width, frame_height)
    frame_size = (int(frame_width), int(frame_height))
    
    out = cv.VideoWriter('output.avi', fourcc, 20.0, frame_size)
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        frame = cv.flip(frame, 0)
        # write the flipped frame
        out.write(frame)
        cv.imshow('frame', frame)
        if cv.waitKey(1) == ord('q'):
            break
    # Release everything if job is finished
    cap.release()
    out.release()
    cv.destroyAllWindows()
    

    资料

    上手OpenCV-目录

    相关文章

      网友评论

          本文标题:上手OpenCV_GUI-L02-视频

          本文链接:https://www.haomeiwen.com/subject/dsiyxctx.html