zoukankan      html  css  js  c++  java
  • python 处理视频输入输出

    视频的处理和图片的处理类似,只不过视频处理需要连续处理一系列图片。

    一般有两种视频源,一种是直接从硬盘加载视频,另一种是获取摄像头视频。

    0x00. 本地读取视频

    核心函数:

    cv.CaptureFromFile()

    代码示例:

    import cv2.cv as cv
    
    capture = cv.CaptureFromFile('myvideo.avi')
    
    nbFrames = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT))
    
    #CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream
    #CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream
    
    fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
    
    wait = int(1/fps * 1000/1)
    
    duration = (nbFrames * fps) / 1000
    
    print 'Num. Frames = ', nbFrames
    print 'Frame Rate = ', fps, 'fps'
    print 'Duration = ', duration, 'sec'
    
    for f in xrange( nbFrames ):
        frameImg = cv.QueryFrame(capture)
        print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_POS_FRAMES)
        cv.ShowImage("The Video", frameImg)
        cv.WaitKey(wait)

    cv2

    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()

    0x01. 摄像头视频读取

    核心函数:

    cv.CaptureFromCAM()

    示例代码:

    import cv2.cv as cv
    
    capture = cv.CaptureFromCAM(0)
    
    while True:
        frame = cv.QueryFrame(capture)
        cv.ShowImage("Webcam", frame)
        c = cv.WaitKey(1)
        if c == 27: #Esc on Windows
            break

    cv2

    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()

    0x02. 写入视频

    摄像头录制视频

    import cv2.cv as cv
    
    capture=cv.CaptureFromCAM(0)
    temp=cv.QueryFrame(capture)
    writer=cv.CreateVideoWriter("output.avi", cv.CV_FOURCC("D", "I", "B", " "), 5, cv.GetSize(temp), 1)
    #On linux I used to take "M","J","P","G" as fourcc
    
    count=0
    while count<50:
        print count
        image=cv.QueryFrame(capture)
        cv.WriteFrame(writer, image)
        cv.ShowImage('Image_Window',image)
        cv.WaitKey(1)
        count+=1

    从文件中读取视频并保存

    import cv2.cv as cv
    capture = cv.CaptureFromFile('img/mic.avi')
    
    nbFrames = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_COUNT))
    width = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH))
    height = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT))
    fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
    codec = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FOURCC)
    
    wait = int(1/fps * 1000/1) #Compute the time to wait between each frame query
    
    duration = (nbFrames * fps) / 1000 #Compute duration
    
    print 'Num. Frames = ', nbFrames
    print 'Frame Rate = ', fps, 'fps'
    
    writer=cv.CreateVideoWriter("img/new.avi", int(codec), int(fps), (width,height), 1) #Create writer with same parameters
    
    cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_POS_FRAMES,80) #Set the number of frames
    
    for f in xrange( nbFrames - 80 ): #Just recorded the 80 first frames of the video
    
        frame = cv.QueryFrame(capture)
    
        print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_POS_FRAMES)
    
        cv.WriteFrame(writer, frame)
    
        cv.WaitKey(wait)

    cv2

    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()
  • 相关阅读:
    Android 安卓初探 新建项目
    SQL 根据关联,用一个表的值修改另一个表对应字段的值
    SQL 字符串不足补零
    Android 安卓学习积累
    C#中定义数组
    如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据
    Lambda 表达式(C# 编程指南)
    不定的多条件的过滤
    如何利用【百度地图API】,制作地图地址标记?
    php调用.net生成的.dll文件
  • 原文地址:https://www.cnblogs.com/xiaoxiaoshuaishuai0219/p/6213679.html
Copyright © 2011-2022 走看看