计算机视觉cv2入门之视频处理_cv2.videocapture
在我们进行计算机视觉任务时,经常会对视频中的图像进行操作,这里我来给大家分享一下,cv2对视频文件的操作方法。这里我们主要介绍cv2.VideoCapture函数的基本使用方法。
cv2.VideoCapture函数
当我们在使用cv2.VideoCapture函数时,我们通常使用轮询的方式,即:
while True: if condition1: do something if condition2: break ...
更一般化的是
import cv2#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename=\'\')cap=cv2.VideoCapture(index=0)if cap.isOpened(): while True: ret,frame=cap.read() #... #... 针对视频中的每一帧图像的其他操作 #.... if not ret: break cv2.imshow(\'test\',frame) key=cv2.waitKey(1) if key==27:#置顶一个按键来结束循环,这里使用esc健的ASCII码 break cap.release() cv2.destroyAllWindows()else: print(\'摄像头未打开\')
初始化
视频文件
如果你需要处理的是已有的视频文件,而不是打开摄像头捕获的实时视频流,那么只需要传入filename即可。apiPerference是可选参数主要用来指定视频捕获的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择
import cv2\'\'\'filename:视频文件路径 .mp4apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)apiPerference参数常用flag:cv2.CAP_ANY:自动选择默认后端(OpenCV自行决定)跨平台cv2.CAP_ANDROID: 使用Android的Camera2 APIcv2.CAP_DSHOW:使用DirectShow(Windows专用)cv2.CAP_MSMF: 使用Microsoft Media Foundation(Windows 10+)cv2.CAP_V4L2: 使用Video4Linux2(Linux专用)Linuxcv2.CAP_FFMPEG: 使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)cv2.CAP_GSTREAMER:使用 GStreamer(Linux常用)cv2.CAP_OPENNI:用于深度摄像头(如Kinect)特定设备\'\'\'cap=cv2.VideoCapture(r\'test.mp4\')
实时视频流
如果你处理的是实时视频流,那么需要设置index参数,不使用外接设备时index一般都设置为apiPerference是可选参数主要用来指定视频捕获的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择
import cv2\'\'\'index:0或1,0是电脑内置摄像头,1是外接摄像头,没有外接摄像头仍然设置Index=1的话不会报错,只是代码不运行apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)apiPerference参数常用flag:cv2.CAP_ANY:自动选择默认后端(OpenCV自行决定)跨平台cv2.CAP_ANDROID: 使用Android的Camera2 APIcv2.CAP_DSHOW:使用DirectShow(Windows专用)cv2.CAP_MSMF: 使用Microsoft Media Foundation(Windows 10+)cv2.CAP_V4L2: 使用Video4Linux2(Linux专用)Linuxcv2.CAP_FFMPEG: 使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)cv2.CAP_GSTREAMER:使用 GStreamer(Linux常用)cv2.CAP_OPENNI:用于深度摄像头(如Kinect)特定设备\'\'\'cap=cv2.VideoCapture(index=1,apiPreference=cv2.CAP_ANY)
常用属性
cap.isOpened()
检查视频源是否打开,返回值为True 或False
import cv2cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)if cap.isOpened(): print(\'摄像头已打开\') while True: ret,frame=cap.read() cv2.imshow(\'test\',frame) key=cv2.waitKey(1) if key==27:#按下esc健退出 break cap.release() cv2.destroyAllWindows()else: print(\'摄像头未打开\')
cap.read()
用来读取视频中的下一帧,返回值为(ret,frame) ret为是否成功,frame为图像数据
cap.read()是我们处理视频文件中最关键的函数,如果没有这一步,那么根本无法处理视频文件中的图像。
import cv2cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)if cap.isOpened(): print(\'摄像头已打开\') while True: ret,frame=cap.read() if not ret: break cv2.imshow(\'test\',frame) key=cv2.waitKey(1) if key==27:#按下esc健退出 break cap.release() cv2.destroyAllWindows()else: print(\'摄像头未打开\')
cap.release()
用来释放视频源,出现在cv2.destroyAllWindows()前。
import cv2#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename=\'\')cap=cv2.VideoCapture(index=0)if cap.isOpened(): while True: ret,frame=cap.read() #... #... #.... cv2.imshow(\'test\',frame) key=cv2.waitKey(1) if key==27:#设定一个按键来结束循环,这里使用esc健的ASCII码 break cap.release() cv2.destroyAllWindows()else: print(\'摄像头未打开\')
视频属性控制
cap.get(propId)
用来获取当前视频的属性值,比如帧宽,高,FPS等。
这里我们以获取当前帧率并标记在窗口内为例:
fps=cv2.get(cv2.CAP_PROP_FPS)
fps的类型为Float
import cv2#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename=\'\')cap=cv2.VideoCapture(index=0)if cap.isOpened(): while True: ret,frame=cap.read() fps=cap.get(cv2.CAP_PROP_FPS) #... #... #.... cv2.putText(img=frame,text=f\'fps:{fps}\',org=(50,50),fontFace=1,fontScale=3,color=(255,0,0)) cv2.imshow(\'test\',frame) key=cv2.waitKey(1) if key==27:#设定一个按键来结束循环关闭摄像头,这里使用esc健的ASCII码 break cap.release() cv2.destroyAllWindows()else: print(\'摄像头未打开\')
最后,我将所有的本文所有的要点都总结在了下方这个表格里。
cap=cv2.VideoCapture()
cap.isOpened()
True
/False
。cap.read()
(ret, frame)
,ret
为是否成功,frame
为图像数据。cap.release()
cap.get(propId)
propId
为属性标识。cap.set(propId, value)
cv2.CAP_PROP_FRAME_WIDTH
cv2.CAP_PROP_FRAME_HEIGHT
cv2.CAP_PROP_FPS
cv2.CAP_PROP_FRAME_COUNT
cv2.CAP_PROP_POS_MSEC
cv2.CAP_PROP_POS_FRAMES
cap.grab()
cap.retrieve()
配合使用。cap.retrieve()
grab()
抓取的帧。cap.getBackendName()
FFMPEG
、DSHOW)
。