• opencv基础: 视频,摄像头读取与保存的常用方法


    当然还可以从视频中抓取截图,所以现在聊一下常用的抓取视频截图的的方法。

    VideoCapture 方法

     cv2.VideoCapture();
     cv2.VideoCapture( device);
     cv2.VideoCapture(filename);
    
    • 1
    • 2
    • 3

    上面有三种构造方法,

    • 第一种是无法构造方法。

    • 第二种参数device是一个数字。

      一般笔记本如此写cv2.VideoCapture(0); 因为默认是0 ,如果有多个摄像头,就需要看设置的摄像头代表的数字了。

    • 第二种参数device是一个字符串

      其代表是从视频文件种得到帧。

    release 方法

    释放资源的方法:

    cap = cv2.VideoCapture();
    cap.release()
    
    • 1
    • 2

    read 方法

    read方法就是读取视频的帧的方法。

    cap = cv2.VideoCapture();
    cap.read()
    
    • 1
    • 2
    • read() 方法返回的有两个值
      • 第一个值:为状态值,读到帧就是true
      • 第二个值:返回的视频帧,通俗的说就是图片

    来一个例子:

    import  cv2
    Cap = cv2.VideoCapture("1.mp4");
    flag,phto= Cap.read();
    
    cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
    # cv2.resizeWindow("Wind", 1920, 1080)
    cv2.imshow("Wind",phto)
    
    key=cv2.waitKey(0)
    
    if key=="q":
        cv2.destroyWindow()
    Cap.release()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    但是如果观察效果的话,会发现这是窗口只有镜头内容。

    在这里插入图片描述

    所以需要用一个while循环

    import  cv2
    Cap = cv2.VideoCapture("1.mp4");
    cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
    # cv2.resizeWindow("Wind", 1920, 1080)
    while True:
        flag, phto = Cap.read();
        if flag:
            cv2.imshow("Wind",phto)
            key=cv2.waitKey(1)
            if(key & 0xFF == ord('q')):
                 break
        else:
            break
    Cap.release()
    #释放VideoWriter
    Cap.release()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    isOpened方法

    这个方法是判断摄像头和文件是发可以正常打开,返回True 或 False:

    # Cap = cv2.VideoCapture(1);
    Cap = cv2.VideoCapture("1.mp4");
    # 可以使用判断是否摄像头打开 作为标识符值
    Cap.isOpened() 
    
    • 1
    • 2
    • 3
    • 4

    可以读取文件的方法修改为:

    import  cv2
    # 如果是通过摄像头的话
    # Cap = cv2.VideoCapture(1);
    Cap = cv2.VideoCapture("1.mp4");
    cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
    # cv2.resizeWindow("Wind", 1920, 1080)
    # Cap.isOpened():  可以使用判断是否摄像头打开  以及文件是否可以正常打开
    while Cap.isOpened():
        flag, phto = Cap.read();
        if flag:
            cv2.imshow("Wind",phto)
            # cv2.resizeWindow("Wind", 1920, 1080)
            key=cv2.waitKey(1)
            if(key & 0xFF == ord('q')):
                 break
        else:
            break
    Cap.release()
    #释放VideoWriter
    Cap.release()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    补充

    这里补充一点 如果再循环外:

    cv2.resizeWindow("Wind", 1920, 1080)
    
    • 1

    只会在循环种呈现一次,如果真的需要,那就行说在循环体内再写一遍。

    VideoWriter方法

    有时候,打开摄像头等,需要将内容保存到本地,所以就需要这个方法:

    如下:

    cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
    
    • 1
    1. filename(必选):要写入的视频文件的名称。

    2. fourcc(必选):用于指定视频编解码器的4个字符代码。例如,'MJPG’表示Motion JPEG编码。

      fourcc = cv2.VideoWriter_fourcc(*'MJPG')
      
      • 1
    3. fps(必选):视频的帧率,以每秒帧数(FPS)为单位。

    4. frameSize(必选):视频帧的大小,以像素为单位。

    5. isColor(可选):一个布尔值,指示是否使用彩色。如果为True,则使用彩色,否则为灰度。

    filename = 'tang1.avi'
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    fps = 30.0
    frameSize = (640, 480)
    isColor = True
    
    # 创建VideoWriter对象
    out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    不过这个等于创建了个对象,还需要进入写入,所以需要在用如下方法:

    #frame = cv2.imread('frame.jpg') 或者是视频  flag, frame = Cap.read();
    out.write(frame)
    
    • 1
    • 2

    结合如下写:

    import  cv2
    # 如果是通过摄像头的话
    # Cap = cv2.VideoCapture(1);
    Cap = cv2.VideoCapture("1.mp4");
    cv2.namedWindow("Wind", cv2.WINDOW_NORMAL)
    filename = 'tang1.avi'
    fourcc = cv2.VideoWriter_fourcc(*'MJPG')
    fps = 30.0
    frameSize = (640, 480)
    isColor = True
    
    # 创建VideoWriter对象
    out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
    # cv2.resizeWindow("Wind", 1920, 1080)
    # Cap.isOpened():  可以使用判断是否摄像头打开  以及文件是否可以正常打开
    while Cap.isOpened():
        flag, frame = Cap.read();
        if flag:
            cv2.imshow("Wind",phto)
            out.write(frame)
            # cv2.resizeWindow("Wind", 1920, 1080)
            key=cv2.waitKey(1)
            if(key & 0xFF == ord('q')):
                 break
        else:
            break
    Cap.release()
    #释放VideoWriter
    Cap.release()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    第四代智能井盖传感器:智能井盖位移怎么进行监测
    RHEL、CentOS和Fedora之间的区别!
    SQL编程 Task05.SQL高级处理
    ESP32蓝牙实例-BLE服务器与电池电源指示
    抖音矩阵系统,抖音矩阵源码定制。
    【20221114】【每日一题】复原IP地址
    深入理解Istio流量管理的熔断配置
    [ vulhub漏洞复现篇 ] Thinkphp SQL注入 && 敏感信息泄露
    网络安全之认识托管威胁检测与响应(MDR)
    最新电容笔推荐,2022年电容笔十大品牌排行榜
  • 原文地址:https://blog.csdn.net/u011863822/article/details/132764530