• opencv videocapture


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    import time
    import cv2
    import numpy as np
    from os import path
    import pickle
     
     
    '''
    关于camera id 此处需要稍微说几句。一般我们测试时,可能会通过USB使用多个摄像头,也可能是笔记本自带摄像头。这个时候,通过id号来读摄像头的图像或者视频,
    就要关于摄像头的id号到底对应哪个摄像头。在ubuntu下,我们知道打开笔记本自带摄像头是用茄子命令,即cheese,而查看摄像头的的id号,一般可以通过 ls /dev/video*,
    这个命令是将所有摄像头设备都打印出来,比如打印出来有/dev/video0 /dev/video1,说明该电脑识别到两个摄像头,此时假设笔记本内置摄像头是video0,注意未必一定是0,需要测试,
    我自己笔记本上外接USB摄像头时,就会出现外接的摄像头是video0.此时如果我们想使用别的摄像头video1呢, cheese —device=/dev/video1,这样就打开了另外一个摄像头了。
    当然你也可以通过读摄像头的属性从而读到是第几个摄像头,这个网上有资料,稍微麻烦点。具体windows下,其实差不多,windows下可以通过设备查找。
    对于ubuntu下,如果想查找各个相机对应的一些详细属性,可以通过工具v4l-utils,如果系统没有安装,则需要安装一下(sudo apt install v4l-utils
    ),然后可以查看系统的相机列表(v4l2-ctl --list-devices),而后可以查看各个相机的参数,比如分辨率等。(v4l2-ctl --device=/dev/video4 --list-formats-ext
    ),v4l2-ctl -d /dev/video0 --list-ctrls曝光增益等。具体可以参考官网:https://www.mankier.com/1/v4l2-ctl
     
     
    '''
    cam_idx = 0
    #获取cap
    cam_cap = cv2.VideoCapture(cam_idx)#, cv2.CAP_DSHOW) 
    #设置width,height。
    cam_cap.set(3, 640)
    cam_cap.set(4, 480)
    # cam_cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    # cam_cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
     
    '''
    virtual bool cv::VideoCapture::set  (   int     propId,
    double  value
    )      
    virtual
    Python:
    cv.VideoCapture.set(    propId, value   ) -> retval
    set函数的使用,其中propId是VideoCaptureProperties,详细很多,可以看一下官方介绍。常用的有如下几个。
    CAP_PROP_POS_MSEC
    Python: cv2.CAP_PROP_POS_MSEC     Current position of the video file in milliseconds.
     
    CAP_PROP_POS_FRAMES
    Python: cv2.CAP_PROP_POS_FRAMES    0-based index of the frame to be decoded/captured next.
     
    CAP_PROP_POS_AVI_RATIO
    Python: cv2.CAP_PROP_POS_AVI_RATIO   Relative position of the video file: 0=start of the film, 1=end of the film.
     
    CAP_PROP_FRAME_WIDTH
    Python: cv2.CAP_PROP_FRAME_WIDTH   Width of the frames in the video stream.设置video输出的宽度,这个设置只在此程序中有效,别的程序还是默认值
     
    CAP_PROP_FRAME_HEIGHT
    Python: cv2.CAP_PROP_FRAME_HEIGHT   Height of the frames in the video stream. 设置video输出的高度,这个设置只在此程序中有效,别的程序还是默认值。
     
    CAP_PROP_FPS
    Python: cv2.CAP_PROP_FPS    Frame rate.
     
    CAP_PROP_FOURCC
    Python: cv2.CAP_PROP_FOURCC   4-character code of codec. see VideoWriter::fourcc. 视频写入时需要设置的
     
    CAP_PROP_FRAME_COUNT
    Python: cv2.CAP_PROP_FRAME_COUNT   Number of frames in the video file. 注意这里是视频文件。
    '''
    '''
    有set,就有get获取相应的属性。可以通过id号进行获取,当然也可以通过属性获取。
     
    cv2.VideoCapture.get(0) CV_CAP_PROP_POS_MSEC 视频文件的当前位置(播放)以毫秒为单位
    cv2.VideoCapture.get(1) CV_CAP_PROP_POS_FRAMES 基于以0开始的被捕获或解码的帧索引
    cv2.VideoCapture.get(2) CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
    cv2.VideoCapture.get(3) CV_CAP_PROP_FRAME_WIDTH 在视频流的帧的宽度
    cv2.VideoCapture.get(4) CV_CAP_PROP_FRAME_HEIGHT 在视频流的帧的高度
    cv2.VideoCapture.get(5) CV_CAP_PROP_FPS 帧速率
    cv2.VideoCapture.get(6) CV_CAP_PROP_FOURCC 编解码的4字-字符代码
    cv2.VideoCapture.get(7) CV_CAP_PROP_FRAME_COUNT 视频文件中的帧数
    cv2.VideoCapture.get(8) CV_CAP_PROP_FORMAT 返回对象的格式
    cv2.VideoCapture.get(9) CV_CAP_PROP_MODE 返回后端特定的值,该值指示当前捕获模式
    cv2.VideoCapture.get(10)    CV_CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于照相机)
    cv2.VideoCapture.get(11)    CV_CAP_PROP_CONTRAST 图像的对比度(仅适用于照相机)
    cv2.VideoCapture.get(12)    CV_CAP_PROP_SATURATION 图像的饱和度(仅适用于照相机)
    cv2.VideoCapture.get(13)    CV_CAP_PROP_HUE 色调图像(仅适用于照相机)
    cv2.VideoCapture.get(14)    CV_CAP_PROP_GAIN 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
    cv2.VideoCapture.get(15)    CV_CAP_PROP_EXPOSURE 曝光(仅适用于照相机)
    cv2.VideoCapture.get(16)    CV_CAP_PROP_CONVERT_RGB 指示是否应将图像转换为RGB布尔标志
    cv2.VideoCapture.get(17)    CV_CAP_PROP_WHITE_BALANCE × 暂时不支持
    cv2.VideoCapture.get(18)    CV_CAP_PROP_RECTIFICATION 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
    对应序号可以从opencv官方文件中查看得到。
    enum    cv::VideoCaptureProperties {
      cv::CAP_PROP_POS_MSEC =0,
      cv::CAP_PROP_POS_FRAMES =1,
      cv::CAP_PROP_POS_AVI_RATIO =2,
      cv::CAP_PROP_FRAME_WIDTH =3,
      cv::CAP_PROP_FRAME_HEIGHT =4,
      cv::CAP_PROP_FPS =5,
      cv::CAP_PROP_FOURCC =6,
      cv::CAP_PROP_FRAME_COUNT =7,
      cv::CAP_PROP_FORMAT =8,
      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,
      cv::CAP_PROP_WHITE_BALANCE_BLUE_U =17,
      cv::CAP_PROP_RECTIFICATION =18,
      cv::CAP_PROP_MONOCHROME =19,
      cv::CAP_PROP_SHARPNESS =20,
      cv::CAP_PROP_AUTO_EXPOSURE =21,
      cv::CAP_PROP_GAMMA =22,
      cv::CAP_PROP_TEMPERATURE =23,
      cv::CAP_PROP_TRIGGER =24,
      cv::CAP_PROP_TRIGGER_DELAY =25,
      cv::CAP_PROP_WHITE_BALANCE_RED_V =26,
      cv::CAP_PROP_ZOOM =27,
      cv::CAP_PROP_FOCUS =28,
      cv::CAP_PROP_GUID =29,
      cv::CAP_PROP_ISO_SPEED =30,
      cv::CAP_PROP_BACKLIGHT =32,
      cv::CAP_PROP_PAN =33,
      cv::CAP_PROP_TILT =34,
      cv::CAP_PROP_ROLL =35,
      cv::CAP_PROP_IRIS =36,
      cv::CAP_PROP_SETTINGS =37,
      cv::CAP_PROP_BUFFERSIZE =38,
      cv::CAP_PROP_AUTOFOCUS =39,
      cv::CAP_PROP_SAR_NUM =40,
      cv::CAP_PROP_SAR_DEN =41,
      cv::CAP_PROP_BACKEND =42,
      cv::CAP_PROP_CHANNEL =43,
      cv::CAP_PROP_AUTO_WB =44,
      cv::CAP_PROP_WB_TEMPERATURE =45,
      cv::CAP_PROP_CODEC_PIXEL_FORMAT =46,
      cv::CAP_PROP_BITRATE =47,
      cv::CAP_PROP_ORIENTATION_META =48,
      cv::CAP_PROP_ORIENTATION_AUTO =49,
      cv::CAP_PROP_OPEN_TIMEOUT_MSEC =53,
      cv::CAP_PROP_READ_TIMEOUT_MSEC =54
    }
        '''
    print (cam_cap.get(3)) # 注意返回的是浮点型数据,因此如果你要用这个返回值,注意一下数据类型。
     
    frames = []
    while (cam_cap.isOpened()):
        ret, frame = cam_cap.read()   
        if not ret:
            print ('No camera')
            break
        # import pdb
        # pdb.set_trace()
        print (frame.shape)
         
        frame_copy = frame.copy()   
        cv2.imshow('origin', frame)
        # cv2.waitKey(0)
        if cv2.waitKey(20) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break
         
    cam_cap.release()
     
    '''
    以上程序是读视频流,直接摄像头读入数据的,如果你要读的是视频文件,那方式也差不多。只是更简单。如果视频文件不存在,ret会返回False.
    '''
    video_file = 'SampleVideo_1280x720_1mb.mp4'
    video_cap = cv2.VideoCapture(video_file)
    print ('video file width',video_cap.get(3))
    print ('video file height',video_cap.get(4))
    print ('video file fps',video_cap.get(cv2.CAP_PROP_FPS)) # 注意这些属性在python下使用时,没有CV_,而C++中有的。
    print ('video file totoal frames.',video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
    '''
    video file width 1280.0
    video file height 720.0
    video file fps 25.0
    video file totoal frames. 132.0
    '''
    while True:
        ret, frame = video_cap.read()
        if not ret:
            break   
     
        cv2.imshow('video file frame',frame)
        cv2.waitKey(25)
     
     
    video_cap.release()
     
    '''
    以上都是单视频读,如果想多个视频同时读,可以使用多进程的方式。具体可参考另外一个程序.
    '''

      

  • 相关阅读:
    Azure DevOps (十三) 通过Azure Devops部署一个Go的Web应用
    jenkins部署-linux为例
    openEuler系统安装并运行nginx
    vue使用ant design Vue中的a-select组件实现下拉分页加载数据
    Zookeeper事务日志预分配空间解析
    揭秘界面控件DevExpress WinForms为何弃用受关注的MaskBox属性
    xml类型字段内容解析到表
    Jmeter安装与测试
    RocketMQ如何安全的批量发送消息❓
    [车联网安全自学篇] 七. ATTACK安全之Android SSH原理分析以及攻击检测
  • 原文地址:https://www.cnblogs.com/jianyingzhou/p/16712525.html