计算机视觉cv2入门之视频处理

打印 上一主题 下一主题

主题 1782|帖子 1782|积分 5346


        在我们进行计算机视觉任务时,常常会对视频中的图像进行操作,这里我来给大家分享一下,cv2对视频文件的操作方法。这里我们主要介绍cv2.VideoCapture函数的基本使用方法。
cv2.VideoCapture函数

当我们在使用cv2.VideoCapture函数时,我们通常使用轮询的方式,即:
  1. while True:
  2.     if condition1:
  3.         do something
  4.     if condition2:
  5.         break
  6.     ...
复制代码
更一般化的是 
  1. import cv2
  2. #这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
  3. cap=cv2.VideoCapture(index=0)
  4. if cap.isOpened():
  5.     while True:
  6.         ret,frame=cap.read()
  7.         #...
  8.         #... 针对视频中的每一帧图像的其他操作
  9.         #....
  10.         if not ret:
  11.             break
  12.         cv2.imshow('test',frame)
  13.         key=cv2.waitKey(1)
  14.         if key==27:#置顶一个按键来结束循环,这里使用esc健的ASCII码
  15.             break
  16.     cap.release()
  17.     cv2.destroyAllWindows()
  18. else:
  19.     print('摄像头未打开')
复制代码
初始化

        视频文件

        如果你必要处理的是已有的视频文件,而不是打开摄像头捕捉的实时视频流,那么只必要传入filename即可。apiPerference是可选参数主要用来指定视频捕捉的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择
  1. import cv2
  2. '''
  3. filename:视频文件路径 .mp4
  4. apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)
  5. apiPerference参数常用flag:
  6. cv2.CAP_ANY:        自动选择默认后端(OpenCV自行决定)跨平台
  7. cv2.CAP_ANDROID:  使用Android的Camera2 API
  8. cv2.CAP_DSHOW:        使用DirectShow(Windows专用)
  9. cv2.CAP_MSMF:    使用Microsoft Media Foundation(Windows 10+)
  10. cv2.CAP_V4L2:    使用Video4Linux2(Linux专用)Linux
  11. cv2.CAP_FFMPEG:         使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)
  12. cv2.CAP_GSTREAMER:        使用 GStreamer(Linux常用)
  13. cv2.CAP_OPENNI:        用于深度摄像头(如Kinect)特定设备
  14. '''
  15. cap=cv2.VideoCapture(r'test.mp4')
复制代码

实时视频流 

        如果你处理的是实时视频流,那么必要设置index参数,不使用外接装备时index一般都设置为apiPerference是可选参数主要用来指定视频捕捉的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择
  1. import cv2
  2. '''
  3. index:0或1,0是电脑内置摄像头,1是外接摄像头,没有外接摄像头仍然设置Index=1的话不会报错,只是代码不运行
  4. apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)
  5. apiPerference参数常用flag:
  6. cv2.CAP_ANY:        自动选择默认后端(OpenCV自行决定)跨平台
  7. cv2.CAP_ANDROID:  使用Android的Camera2 API
  8. cv2.CAP_DSHOW:        使用DirectShow(Windows专用)
  9. cv2.CAP_MSMF:    使用Microsoft Media Foundation(Windows 10+)
  10. cv2.CAP_V4L2:    使用Video4Linux2(Linux专用)Linux
  11. cv2.CAP_FFMPEG:         使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)
  12. cv2.CAP_GSTREAMER:        使用 GStreamer(Linux常用)
  13. cv2.CAP_OPENNI:        用于深度摄像头(如Kinect)特定设备
  14. '''
  15. cap=cv2.VideoCapture(index=1,apiPreference=cv2.CAP_ANY)
复制代码

 常用属性

cap.isOpened()

检查视频源是否打开,返回值为True 或False
  1. import cv2
  2. cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)
  3. if cap.isOpened():
  4.     print('摄像头已打开')
  5.     while True:
  6.         ret,frame=cap.read()
  7.         cv2.imshow('test',frame)
  8.         key=cv2.waitKey(1)
  9.         if key==27:#按下esc健退出
  10.             break
  11.     cap.release()
  12.     cv2.destroyAllWindows()
  13. else:
  14.     print('摄像头未打开')
复制代码

cap.read() 

        用来读取视频中的下一帧,返回值为(ret,frame) ret为是否成功,frame为图像数据
        cap.read()是我们处理视频文件中最关键的函数,如果没有这一步,那么根本无法处理视频文件中的图像。
  1. import cv2
  2. cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)
  3. if cap.isOpened():
  4.     print('摄像头已打开')
  5.     while True:
  6.         ret,frame=cap.read()
  7.         if not ret:
  8.             break
  9.         cv2.imshow('test',frame)
  10.         key=cv2.waitKey(1)
  11.         if key==27:#按下esc健退出
  12.             break
  13.     cap.release()
  14.     cv2.destroyAllWindows()
  15. else:
  16.     print('摄像头未打开')
复制代码

cap.release() 

        用来开释视频源,出如今cv2.destroyAllWindows()前。
  1. import cv2
  2. #这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
  3. cap=cv2.VideoCapture(index=0)
  4. if cap.isOpened():
  5.     while True:
  6.         ret,frame=cap.read()
  7.         #...
  8.         #...
  9.         #....
  10.         cv2.imshow('test',frame)
  11.         key=cv2.waitKey(1)
  12.         if key==27:#设定一个按键来结束循环,这里使用esc健的ASCII码
  13.             break
  14.     cap.release()
  15.     cv2.destroyAllWindows()
  16. else:
  17.     print('摄像头未打开')
复制代码

视频属性控制 

 cap.get(propId)

         用来获取当前视频的属性值,比如帧宽,高,FPS等。
        这里我们以获取当前帧率并标记在窗口内为例:
  1. fps=cv2.get(cv2.CAP_PROP_FPS)
复制代码
        fps的范例为Float
  1. import cv2
  2. #这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
  3. cap=cv2.VideoCapture(index=0)
  4. if cap.isOpened():
  5.     while True:
  6.         ret,frame=cap.read()
  7.         fps=cap.get(cv2.CAP_PROP_FPS)
  8.         #...
  9.         #...
  10.         #....
  11.         cv2.putText(img=frame,text=f'fps:{fps}',org=(50,50),fontFace=1,fontScale=3,color=(255,0,0))
  12.         cv2.imshow('test',frame)
  13.         key=cv2.waitKey(1)
  14.         if key==27:#设定一个按键来结束循环关闭摄像头,这里使用esc健的ASCII码
  15.             break
  16.     cap.release()
  17.     cv2.destroyAllWindows()
  18. else:
  19.     print('摄像头未打开')
复制代码





最后,我将所有的本文所有的要点都总结在了下方这个表格里。
参数/方法​​​​说明​​​​初始化​​cap=cv2.VideoCapture()创建视频捕捉对象,参数可以是装备索引(摄像头)或视频文件路径。​​常用属性​​cap.isOpened()检查视频源是否成功打开,返回 True/False。cap.read()读取下一帧,返回 (ret, frame),ret 为是否成功,frame 为图像数据。cap.release()开释视频源。​​视频属性控制​​cap.get(propId)获取视频属性值(如帧宽、高、FPS 等),propId 为属性标识。cap.set(propId, value)设置视频属性值(部门属性可修改)。​​常用属性标识(propId)​​cv2.CAP_PROP_FRAME_WIDTH帧的宽度(像素)。cv2.CAP_PROP_FRAME_HEIGHT帧的高度(像素)。cv2.CAP_PROP_FPS视频的帧率(Frames Per Second)。cv2.CAP_PROP_FRAME_COUNT视频的总帧数(仅对文件有效)。cv2.CAP_PROP_POS_MSEC当前帧的时间戳(毫秒,仅对文件有效)。cv2.CAP_PROP_POS_FRAMES当前帧的索引(从 0 开始)。​​其他方法​​cap.grab()快速抓取下一帧(不解码),通常与 cap.retrieve() 配合使用。cap.retrieve()解码并返回由 grab() 抓取的帧。cap.getBackendName()返回当前使用的后端名称(如 FFMPEG、DSHOW)。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表