Opencv(三)-视频获取

获取视频

1、cv2.VideoCapture()

1
cap = cv2.VideoCapture(camera_idx)

用于获取视频。其中,camera_idx是o,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频。

2、cv2.namedWindow()

1
cv2.namedWindow(window_name)

为窗口命名。参数为窗口标题,字符串。

3、cap.read()

1
ret, frame = cap.read()

读取一帧的数据。第一个返回值是布尔类型,判断是否读取到图片,第二个返回值是读取到的图片。

4、cv2.imshow()

1
cv2.imshow(window_name, frame)

显示每一帧图片。第一个参数是窗口名称,第二个参数是图片对象。

5、cv2.waitKey()

1
cv2.waitKey(parameter)

parameter = NONE & 0表示一直显示,除此之外表示显示的毫秒数。

  • 参数为0,表示图片显示着,直到你按下任意一个键,才被关掉。

  • ```python
    if cv2.waitKey(1) & 0xFF == ord(‘q’):

    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
      
    运行代码,会显示一张图片,当你按下`q`键时,显示图片的窗口被关掉。

    <!--more-->

    **完整代码如下:**

    ```python
    import cv2

    def CatchUsbVideo(window_name, camera_idx):
    #cv2.namedWindow('窗口标题',默认参数)
    cv2.namedWindow(window_name)

    #视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
    #camera_idx是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频
    cap = cv2.VideoCapture(camera_idx)

    while cap.isOpened():
    ok, frame = cap.read() #读取一帧数据
    if not ok:
    break

    #显示图像并等待10毫秒按键输入,输入‘q’退出程序
    cv2.imshow(window_name, frame)
    c = cv2.waitKey(10)
    if c & 0xFF == ord('q'):
    break

    #释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()

    if __name__ == '__main__':
    CatchUsbVideo("截取视频流", 0)

保存/读取视频

1、存取图片
1
cv2.imwrite(path, frame)

第一个参数是保存路径,第二个参数是要保存的图片的对象。

1
cv2.imread(path)

参数为图片路径。

注意:读取出来的图片的像素可能与原图片的像素不同,这是图片格式不同导致的。.jpeg后缀的图像,其由于jpeg图像本身的编解码问题,写入时的编码与读取时的解码所得不能完美互为逆操作,从而导致的每次写入之后,读取的值都不同。而.png格式就不会出现问题。

2、存取视频

保存视频或摄像头视频到本地磁盘,需要使用Opencv中的VideoWriter,以及其中的write()函数。

1
VideoWriter(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
  • 第一个参数为保存的路径名,并且同时为视频命名。
  • 第二个参数为编码器。也可以用cv2.VideoWriter_fourcc()代替,常用的有 “DIVX”、”MJPG”、“XVID”、“X264”。
  • fps为被创建视频的帧率。
  • frameSize是视频的宽和高,是一个二元组。
  • 最后一个是参数默认彩色保存。

示例如下:

首先用电脑上的摄像头拍摄一段视频保存到同级目录下,然后再将其读出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2

cap = cv2.VideoCapture(0)

filename = "1.avi"
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
fps = 20
frameSize = (640,480)
out = cv2.VideoWriter(filename,fourcc,fps,frameSize)

while True:
ret, frame = cap.read()
if ret:
out.write(frame)
cv2.imshow("video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break

cap.release()
cv2.destroyAllWindows()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

cap = cv2.VideoCapture("1.avi")

while True:
ret, frame = cap.read()
if ret:
cv2.imshow("video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()

opencv获取RTSP流媒体视频

1、rtsp简介

RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容。

2、rtsp的url格式

“rtsp”和“rtspu”表示要通过 RTSP 协议来定位网络资源。 RTSP URL 的语法和语义如下所示:

1
"rtsp:" | "rtspu:" ) "//" host [ ":" port ] [ abs_path]

这里我们以萤石摄像头为例:

萤石摄像头的rtsp协议的url格式为:

1
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
  • username: 用户名。例如admin。
  • password: 密码。例如12345。一般为摄像头的验证码。
  • ip: 为设备IP。例如 192.0.0.64。
  • port: 端口号默认为554,若为默认可不填写。
  • codec:有h264、MPEG-4、mpeg4这几种。
  • channel: 通道号,起始为1。例如通道1,则为ch1。
  • subtype: 码流类型,主码流为main,辅码流为sub。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

url = "rtsp://admin:UJMIPO@192.168.137.250:554/h264/ch1/main/av_stream"
cap = cv2.VideoCapture(url)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("video", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

知识拓展:

视频文件格式,即视频文件的后缀,如mp4,avi等等,主要为帮助系统的程序知道应该使用何种程序打开该文件;这就是说如果你把一个视频格式的文件后缀从avi改成mp4,并不意味该文件就变成了mp4格式。
视频封装格式则是一种视频封装容器。什么意思呢?在视频文件中同时含有视频部分、音频部分等等;那么视频封装容器则一种可以把多种视频数据放在一起的一个大盒子。这个盒子就是我们常说的视频格式,例如AVI(后缀.avi)格式、MPEG(后缀.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4)格式、REAL Video(后缀.rmvb)格式、Flash Video(后缀.flv)格式等等。

视频文件格式,即视频文件的后缀,如mp4,avi等等,主要为帮助系统的程序知道应该使用何种程序打开该文件;这就是说如果你把一个视频格式的文件后缀从avi改成mp4,并不意味该文件就变成了mp4格式。
视频封装格式则是一种视频封装容器。什么意思呢?在视频文件中同时含有视频部分、音频部分等等;那么视频封装容器则一种可以把多种视频数据放在一起的一个大盒子。这个盒子就是我们常说的视频格式,例如AVI(后缀.avi)格式、MPEG(后缀.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4)格式、REAL Video(后缀.rmvb)格式、Flash Video(后缀.flv)格式等等。

那么视频编码器又是什么呢?视频编码器是指能够对数字视频进行压缩存储和解压缩的程序或设备。目前场景的编码器有H.26X系列(目前最流行的是H.264和H.265)和MPEG系列(目前最流行的是MPEG-4第十部分,即H.264)。上文代码中提到的XVID(旧称为DIVX)是一个开放源代码的MPEG-4视频编解码器。