读取并播放影片
这篇教学会介绍 OpenCV 里的 VideoCapture() 方法,透过这个方法,读取电脑中的影片,或打开电脑的摄影镜头读取图像画面。
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
快速导览:
VideoCapture() 打开影片
使用 VideoCapture() 方法时,如果参数指定“影片路径”,可以打开电脑中的影片,如果参数指定“0、1、2...”数字,则会打开电脑的摄影镜头读取图像画面,数字代表镜头的编号,通常都从 0 开始,如果有外接镜头可能会是 1、2 之类的编号。
cap = cv2.VideoCapture(0) # 讀取攝影鏡頭
cap = cv2.VideoCapture('影片路徑') # 讀取電腦中的影片
如果有遇到错误消息 ( 特别是 Windows ),可以尝试加入第二个 cv2.CAP_DSHOW 参数 ( 表示 DirectShow,也就是目前系统 )。
cv2.CAP_DSHOW 是 DirectShow,内容是一个“数值”,使用后等同输入 700,第二个参数详细可以参考:Flags for video I/O
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
使用 VideoCapture() 之后,通常会再透过 cap.isOpened() 来判断影片是否正常打开,如果正常打开会回传 True,否则是 False,下方的程序码执行后,会读取电脑摄影镜头,如果没有读取到镜头信息,就会印出 Cannot open camera 的文字。
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
顺利开起影片后,就能使用 cap.read() 的方法,读取影片的每一帧 ( 例如 60fps 表示一秒钟有六十帧 ),读取后会回传两个值,第一个值 ret 为 True 或 False,表示顺利读取或读取错误,第二个值表示读取到影片某一帧的画面,如果读取成功,就能透过 imshow() 的方法,将该帧的画面显示出来,下方的程序码除了显示图片,更搭配 waitKey(1) 方法,就能不断更新显示的图片,看起来就像播放影片一般。
使用 waitKey(1) 表示每一毫秒更新一次画面,参数数值设定越大,图片更新时间就会越长,影片看起来就会出现延迟的状况,参考:waitKey() 等待多久关闭
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read() # 讀取影片的每一幀
if not ret:
print("Cannot receive frame") # 如果讀取錯誤,印出訊息
break
cv2.imshow('oxxostudio', frame) # 如果讀取成功,顯示該幀的畫面
if cv2.waitKey(1) == ord('q'): # 每一毫秒更新一次,直到按下 q 結束
break
cap.release() # 所有作業都完成後,釋放資源
cv2.destroyAllWindows() # 結束所有視窗
搭配 cvtColor() 改变影片色彩
cvtColor() 方法可以改变图片的色彩,如果将影片每一帧的图片套用 cvtColor(),最后就会呈现的改变颜色的影片,下面的程序码执行后,就会读取电脑摄影机,并将彩色影片转换成黑白色彩的影片。
色彩模式参考:cvtColor() 颜色转换名称与数字对照
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 轉換成灰階
# gray = cv2.cvtColor(frame, 6) # 也可以用數字對照 6 表示轉換成灰階
cv2.imshow('oxxostudio', gray)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
读取串流图片 MJPEG ( Motion JPEG )
使用 cap.read() 不仅能读取电脑摄影机画面,也可以读取 MJPEG ( Motion JPEG ) 的图片串流格式,Motion JPEG ( Motion Joint Photographic Experts Group、M-JPEG ) 是一种图像压缩格式,每一个视频框图像分别使用 JPEG 编码,常用在网络摄影机、物联网摄影机之类的装置。
下方的范例读取交通部的“CCTV 开放数据集”所提供的“国道监视器图像”,读取后就能打开 OpenCV 视窗并即时监看特定图像。
import cv2
cap = cv2.VideoCapture('https://cctvn.freeway.gov.tw/abs2mjpg/bmjpg?camera=15771')
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read() # 讀取影片的每一幀
if not ret:
print("Cannot receive frame") # 如果讀取錯誤,印出訊息
# 出現錯誤就再讀取一次,避免程式到此處就停止
cap = cv2.VideoCapture('https://cctvn.freeway.gov.tw/abs2mjpg/bmjpg?camera=15771')
continue
cv2.imshow('oxxostudio', frame) # 如果讀取成功,顯示該幀的畫面
if cv2.waitKey(1) == ord('q'): # 每一毫秒更新一次,直到按下 q 結束
break
cap.release() # 所有作業都完成後,釋放資源
cv2.destroyAllWindows() # 結束所有視窗
参考数据
- OpenCV:Getting Started with Videos
- OpenCV:cvtColor() 颜色转换名称与数字对照
微信扫码关注
抖音扫码关注