1 前言
上篇文章介绍了在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默认端口
2 调用流程
以播放本地视频文件为例,流程如下,详细过程请参见后边代码。
- 打开视频文件
- 查看视频参数
- 循环读取视频每一帧
- 在窗口显示视频
- 当按下q或Q键时,退出当前播放
- 释放相关资源
3 创建测试项目
创建测试项目、配置开发环境,具体可参考这篇文章,过程就不多说了。
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中代码截图:
4 播放效果截图
视频文件:
网络摄像头:
调试控制台输出: