翼度科技»论坛 编程开发 python 查看内容

【Python】【OpenCV】视频帧和摄像头帧操作 and 窗口显示

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
一、读取写入视频文件
  1. 1 import cv2
  2. 2
  3. 3 # 创建一个视屏捕获对象
  4. 4 videoCapture = cv2.VideoCapture('AVI.avi')
  5. 5
  6. 6 # 获取视频的属性值,cv2.CAP_PROP_FPS获取视频帧率
  7. 7 fps = videoCapture.get(cv2.CAP_PROP_FPS)
  8. 8
  9. 9 # cv2.CAP_PROP_FRAME_WIDTH/HEIGHT 返回float类型 获取视频帧的宽高
  10. 10 size = int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), \
  11. 11        int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))
  12. 12
  13. 13 '''
  14. 14 创建一个写入对象,将帧写入输出的视频
  15. 15 cv2.VideoWriter_fourcc()函数指定编码器为 I420
  16. 16 fps 和 size 指定输出的帧率和尺寸
  17. 17 '''
  18. 18 videoWrite = cv2.VideoWriter('Out.avi',
  19. 19                              cv2.VideoWriter_fourcc('I', '4', '2', '0'),
  20. 20                              fps, size
  21. 21                              )
  22. 22
  23. 23 '''
  24. 24 对捕获到的视频对象进行读取帧,success表示是否成功读取一帧,frame表示当前帧。
  25. 25 循环读取写入输出视频。
  26. 26 '''
  27. 27 success, frame = videoCapture.read()
  28. 28 while success:
  29. 29        videoWrite.write(frame)
  30. 30        success, frame = videoCapture.read()
复制代码
 
二、捕获摄像头帧
  1. 1 import cv2
  2. 2
  3. 3 cameraCapture = cv2.VideoCapture(0)
  4. 4
  5. 5 fps = 30
  6. 6
  7. 7 size = int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), \
  8. 8         int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))
  9. 9
  10. 10 videoWriter = cv2.VideoWriter(
  11. 11     'OutVideo_GRAB.avi',
  12. 12     cv2.VideoWriter_fourcc('I', '4', '2', '0'),
  13. 13     fps,
  14. 14     size
  15. 15 )
  16. 16
  17. 17 success, frame = cameraCapture.read()
  18. 18
  19. 19 numFramesRemaining = 10 * fps
  20. 20 while success and numFramesRemaining > 0:
  21. 21     videoWriter.write(frame)
  22. 22     success, frame = cameraCapture.read()
  23. 23     numFramesRemaining -= 1
复制代码
和视频的读取写入没有什么差异,都是需要先创建一个VideoCapture Object来操作,下述是细微差别:
3   Line:VideoCapture(0),其中 0 代表设备,还可以1,2,3 分别代表不同的摄像头(如果存在),也可以输入网络摄像头,直接替换成URL即可
5   Line:需要手动设置fps的值
19 Line:需要设定一个时间,numFramesRemaining代表持续捕获300个帧,而每30个帧为一秒,所以将生成一个10秒钟的视频文件
 
三、窗口显示图片
  1. 1 import cv2
  2. 2
  3. 3 img = cv2.imread('CopyPic.png')
  4. 4 cv2.imshow('', img)
  5. 5 cv2.waitKey()
  6. 6 cv2.destroyAllWindows()
复制代码
 
 
四、窗口显示摄像头
  1. 1 import cv2
  2. 2
  3. 3 # 检测窗口是否被点击
  4. 4 clicked = False
  5. 5
  6. 6
  7. 7 # 定义鼠标事件处理函数
  8. 8 def onMouse(event: int, x, y, flags, param):
  9. 9     global clicked
  10. 10     if event == cv2.EVENT_LBUTTONUP:
  11. 11         clicked = True
  12. 12
  13. 13
  14. 14 # 创建一个视频对象
  15. 15 cameraCapture = cv2.VideoCapture(0)
  16. 16 # 定义窗口命
  17. 17 cv2.namedWindow('Camera')
  18. 18 # 将鼠标回调函数,将鼠标事件处理函数和窗口关联起来
  19. 19 cv2.setMouseCallback('Camera', onMouse)
  20. 20
  21. 21 print('Showing camera feed. Click window or press any key to stop.')
  22. 22 # 获取当前时间的摄像头帧
  23. 23 success, frame = cameraCapture.read()
  24. 24
  25. 25 # 循环获取当前时间的摄像头帧,当按下任意按键 or 点击鼠标时则停止显示
  26. 26 while success and cv2.waitKey(1) == -1 and not clicked:
  27. 27     cv2.imshow('Camera', frame)
  28. 28     success, frame = cameraCapture.read()
  29. 29
  30. 30 # 关闭窗口
  31. 31 cv2.destroyAllWindows()
  32. 32
  33. 33 # 释放摄像头资源
  34. 34 cameraCapture.release()
复制代码
 
针对多摄像头,我们需要先探明摄像头的设备号:
  1. 1 import cv2
  2. 2
  3. 3 for item in range(10):
  4. 4     # 创建一个object
  5. 5     camera = cv2.VideoCapture(item)
  6. 6
  7. 7     # 查询此摄像头是否能打开,如果不能则跳过,并输出一条 Error Message
  8. 8     if not camera.isOpened():
  9. 9         print(f"Can\'t open camera {item}")
  10. 10         continue
  11. 11
  12. 12     # 读取摄像头帧率
  13. 13     while True:
  14. 14         success, frame = camera.read()
  15. 15         # 当摄像头帧读取失败则跳过
  16. 16         if not success:
  17. 17             break
  18. 18
  19. 19         cv2.imshow(f'Camera device number: {item}', frame)
  20. 20
  21. 21         # 等待1毫秒,检查用户是否有键盘输入‘q’
  22. 22         if cv2.waitKey(1) == ord('q'):
  23. 23             break
  24. 24
  25. 25     camera.release()
  26. 26     cv2.destroyAllWindows()
复制代码
 

来源:https://www.cnblogs.com/vangoghpeng/p/17847357.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具