上篇文章介绍了在WIN10系统上, C++调用OpenCV接口,播放本地视频文件、本地和网络摄像头视频。本篇我们来看一下,Python如何调用OpenCV接口,做同样的事情。
| 序号 | 视频来源 | 视频格式/协议 | 参数 |
| 1 | 本地视频文件 | MP4 | 文件名称 |
| 2 | 笔记本摄像头 | 摄像头序号 | |
| 3 | 网络摄像头 | RTSP | rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101 |
下边我们用海康IP摄像机做测试,所以表格中的rtsp地址,是海康摄像机的URL格式,其它品牌(大华、宇视)与之类似。
rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101
rtsp:表示采用RTSP协议从摄像机取流
admin:摄像机网页登录用户名
123456:摄像机网页登录密码
192.168.1.105:摄像机IP地址
554:RTSP默认端口
以播放本地视频文件为例,流程如下,详细过程请参见后边代码。
创建测试项目、配置开发环境,具体可参考这篇文章,过程就不多说了。
Win10+Python3.10+OpenCV4.6.0加载显示图片_chexlong的博客-CSDN博客
这次测试项目名称play_video,VS2022种创建好的项目截图
将下列代码编辑到play_video.py文件里
- # !usr/bin/env python
- # -*- coding: utf-8 -*-
- import cv2
- import numpy as np
-
-
- #打开本地视频文件或网络摄像头,并播放视频
- def OpenAndPlayVideoFile(filename):
- try:
- print("======to start play video file...")
- #使用OpenCV自带的VideoCapture()函数定义视频文件对象,网络摄像机本质上可以看作远程网络视频文件
- cap = cv2.VideoCapture(filename)
-
- #打印视频参数:宽、高、每秒传输帧数
- print('width = ', cap.get(cv2.CAP_PROP_FRAME_WIDTH))
- print('height = ', cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
- print('fps = ', cap.get(cv2.CAP_PROP_FPS))
-
- #循环读取每一帧
- while(cap.isOpened()):
- #第一个返回值result是一个布尔值,表示当前这一帧是否获取正确
- result, frame = cap.read()
- #读取视频文件结束时,退出播放
- if not result:
- print('play end...')
- break
- #在名称为“video file”的窗口中,显示视频
- cv2.imshow("video file", frame)
- #当按下"q"或“Q”键时,退出播放
- key = cv2.waitKey(1)
- if key == ord('q') or key == ord('Q'):
- break
- #释放视频文件或摄像头资源
- cap.release()
- #销毁所有窗口,释放资源
- cv2.destroyAllWindows()
- print("end...")
- except Exception as e:
- #访问异常的错误编号和详细信息
- print(str(e))
-
-
- #打开本地摄像头,并播放视频
- def OpenAndPlayLocalCamera(index):
- print("======to start play local camera...")
- #使用OpenCV自带的VideoCapture()函数定义摄像头对象,打开0号、或1号、或2号...摄像头
- cap = cv2.VideoCapture(index)
-
- #打印视频参数:宽、高、每秒传输帧数
- print('width = ', cap.get(cv2.CAP_PROP_FRAME_WIDTH))
- print('height = ', cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
- print('fps = ', cap.get(cv2.CAP_PROP_FPS))
-
- #循环读取每一帧
- while(cap.isOpened()):
- #第一个返回值result是一个布尔值,表示当前这一帧是否获取正确
- result, frame = cap.read()
- #在名称为“video file”的窗口中,显示视频
- cv2.imshow("video file", frame)
- #当按下"q"或“Q”键时,退出播放
- key = cv2.waitKey(1)
- if key == ord('q') or key == ord('Q'):
- break
- #释放视频文件或摄像头资源
- cap.release()
- #销毁所有窗口,释放资源
- cv2.destroyAllWindows()
- print("end...")
-
- if __name__ == '__main__':
- #打开本地文件播放
- video_file = 'opencv.mp4'
- OpenAndPlayVideoFile(video_file)
-
- #打开本地0号摄像头播放
- OpenAndPlayLocalCamera(0)
-
- #打开网络摄像头播放
- url = 'rtsp://admin:123456@192.168.1.105:554/Streaming/Channels/101'
- OpenAndPlayVideoFile(url)
程序中实现了下边2个播放函数:
- #打开视频文件或网络摄像头,并播放视频
- OpenAndPlayVideoFile(filename)
-
- #打开本地摄像头,并播放视频
- OpenAndPlayLocalCamera(index)
代码中的视频文件opencv.mp4,放置在测试项目工程当前目录,如截图:

VS中代码截图:

视频文件:

网络摄像头:

调试控制台输出:
