0


OpenCV基础操作_视频读取

1 视频文件读取

**

  1. 1.1 cv2.
  1. VideoCapture

() **

在OpenCV中,可以使用VideoCapture来读取视频文件,或是摄像头数据。

函数定义:Reading and Writing Images and Video — OpenCV 2.4.13.7 documentation

Python:

  1. cv2.
  1. VideoCapture

() → <VideoCapture object>¶

Python:

  1. cv2.
  1. VideoCapture

(filename) → <VideoCapture object>

Python:

  1. cv2.
  1. VideoCapture

(device) → <VideoCapture object>

**

  1. 1.2 cv2.VideoCapture

.isOpened()**

判断文件打开是否成功,可以使用

  1. cv2.VideoCapture

**.isOpened()**这个函数。

函数定义:Reading and Writing Images and Video — OpenCV 2.4.13.7 documentation

Python:

  1. cv2.VideoCapture.
  1. isOpened

() → retval¶

返回值是True/False。如果视频文件打开成功,返回值为True。

1.3 cv2.VideoCapture.read()

在python中,我一般比较习惯用这样的方式进行操作:

先Open一个文件,然后通过

  1. cv2.VideoCapture

**.read()**的方式,读取每一帧数据。

  1. cv2.VideoCapture

.read()提供了一个最简单的视频帧处理方式,集合了抓起Grab(),解码retrieve()两个功能,返回解码之后的数据。需要特别注意的是,如果获取到空帧,抓取失败或是文件结束,返回值会是一个空指针。

函数定义:Reading and Writing Images and Video — OpenCV 2.4.13.7 documentation

1.4 示例代码:

  1. import cv2
  2. video = cv2.VideoCapture("./1.mp4")
  3. if video.isOpened():
  4. # video.read() 一帧一帧地读取
  5. # open 得到的是一个布尔值,就是 True 或者 False
  6. # frame 得到当前这一帧的图像
  7. open, frame = video.read()
  8. else:
  9. open = False
  10. while open:
  11. ret, frame = video.read()
  12. # 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
  13. if frame is None:
  14. break
  15. if ret == True:
  16. cv2.imshow("video",frame)
  17. # 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
  18. # 这里等于 27 也即是说按下 ESC 键即可退出该窗口
  19. if cv2.waitKey(10) & 0xFF == 27:
  20. break
  21. video.release()
  22. cv2.destroyAllWindows()

2 读取摄像头

VideoCapture也是支持读取摄像头的。我这边是一个摄像头,可以提供rtsp码流,码流地址是:rtsp://192.168.0.200:554/av0_0

实现的示例代码如下:

  1. import cv2
  2. video = cv2.VideoCapture("rtsp://192.168.0.200:554/av0_0")
  3. if video.isOpened():
  4. # video.read() 一帧一帧地读取
  5. # open 得到的是一个布尔值,就是 True 或者 False
  6. # frame 得到当前这一帧的图像
  7. open, frame = video.read()
  8. else:
  9. open = False
  10. while open:
  11. ret, frame = video.read()
  12. # 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
  13. if frame is None:
  14. break
  15. if ret == True:
  16. # 转换为灰度图
  17. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  18. cv2.imshow("video",gray)
  19. # 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
  20. # 这里等于 27 也即是说按下 ESC 键即可退出该窗口
  21. if cv2.waitKey(1) & 0xFF == 27:
  22. break
  23. video.release()
  24. cv2.destroyAllWindows()

上面代码处理摄像头数据,现在转换为gray,然后显示。

在实际项目中,可能会发现现实出来的摄像头数据会有延时,主要有如下几种可能:

1)摄像头本身做了buffer,可以通过配置摄像头的缓存帧,降低延时;

2)视频播放软件有buffer,比如vlc,也是可以调整的;

3)网络带宽,实践中,多路摄像头(比如说16路)在100M网络环境和1000M网络环境表现明显不同。这里面的网络环境是指全链路:包括网线、集线器、路由器、显示终端(电脑)等;

4)AI处理时间过长。如果在实际项目中,是直接采用串行设计,来一帧分析一帧,而这帧数据每一办法在固定的时间内分析完成(比如40ms),这样就会造成摄像头数据延时。一般有两种解决办法:

a、做丢帧处理,这需要依据场景来决定;

b、做异步架构调整。一个线程用来读取数据,一个线程用了做AI分析;

5)显示终端处理不过来。比如我们有关项目的架构是采用WebSocket的方式,把数据传给QT(大屏展示)和WebUI(浏览器),结果浏览器的渲染速度没有办法跟上,导致显示数据堆积。

6)其他情况

以上一些情况,供大家参考处理。

【参考文献】

[1] 每周一课 | OpenCV :图像基本操作


本文转载自: https://blog.csdn.net/putiancaijunyu/article/details/123865761
版权归原作者 孤独的小丑 所有, 如有侵权,请联系我们删除。

“OpenCV基础操作_视频读取”的评论:

还没有评论