OpenCV 单目摄像头(python版)

举报
一颗小树x 发表于 2021/01/25 01:49:29 2021/01/25
【摘要】 前言 本文主要介绍在OpenCV用使用单目摄像头,包括:打开单目摄像头、设置摄像头参数、拍照、录制视频。 环境:编程语言:Python3        主要依赖库:OpenCV3.x 或 OpenCV4.x   目录 1)打开摄像头 2)设置分辨率 3)细节提升 4)摄像头拍照 5)录制视频 &...

前言

本文主要介绍在OpenCV用使用单目摄像头,包括:打开单目摄像头、设置摄像头参数、拍照、录制视频。

环境:编程语言:Python3        主要依赖库:OpenCV3.x 或 OpenCV4.x

 

目录

1)打开摄像头

2)设置分辨率

3)细节提升

4)摄像头拍照

5)录制视频


 

单目摄像头

1)打开摄像头

OpenCV有VideoCapture()函数,能用来定义“摄像头”对象,0表示第一个摄像头(一般是电脑内置的摄像头);如果有两个摄像头,第二个摄像头则对应VideoCapture(1)。

在while循环中使用“摄像头对象”的read()函数一帧一帧地读取摄像头画面数据。

imshow函数是显示摄像头的某帧画面;cv2.waitKey(1)是等待1ms,如果期间检测到了键盘输入q,则退出while循环。


  
  1. # -*- coding: utf-8 -*-
  2. import cv2
  3. cap = cv2.VideoCapture(0) # 0表示第一个摄像头
  4. while(1):
  5. # get a frame
  6. ret, frame = cap.read()
  7. # show a frame
  8. cv2.imshow("capture", frame)
  9. if cv2.waitKey(1) & 0xFF == ord('q'):
  10. break
  11. cap.release()
  12. cv2.destroyAllWindows()

 调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。

 

2)设置分辨率

有时需要指定摄像头的分辨率,比如1920*1080;

cap.set(3,1920) 设置帧的宽度为1920。cap.set(4,1080) 设置帧的长度为1080。


  
  1. # -*- coding: utf-8 -*-
  2. import cv2
  3. cap = cv2.VideoCapture(0)
  4. #先设置分辨率,宽:1920 长:1080
  5. cap.set(3,1920)
  6. cap.set(4,1080)
  7. while(1):
  8. # get a frame
  9. ret, frame = cap.read()
  10. # show a frame
  11. cv2.imshow("capture", frame)
  12. if cv2.waitKey(1) & 0xFF == ord('q'):
  13. break
  14. cap.release()
  15. cv2.destroyAllWindows()

拓展:当摄像流为 cap,设置参数是cap.set(参数编号,参数);获取参数值的函数是 cap.get(参数编号)。

方法 释义
cv2.VideoCapture.get(0) 视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1) 基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2) 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3) 在视频流的帧的宽度
cv2.VideoCapture.get(4) 在视频流的帧的高度
cv2.VideoCapture.get(5) 帧速率
cv2.VideoCapture.get(6) 编解码的4字-字符代码
cv2.VideoCapture.get(7) 视频文件中的帧数
cv2.VideoCapture.get(8) 返回对象的格式
cv2.VideoCapture.get(9) 返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10) 图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11) 图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12) 图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13) 色调图像(仅适用于照相机)
cv2.VideoCapture.get(14) 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15) 曝光(仅适用于照相机)
cv2.VideoCapture.get(16) 指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17) × 暂时不支持
cv2.VideoCapture.get(18) 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

 

3)细节提升

其实在ret, frame = cap.read() 代码,能通过ret 的值来判断是否成功读取到摄像头的画面数据,加一个判断逻辑更严谨一些;

成功读取摄像头数据时,ret 值返回True;获取失败时返回False。


  
  1. # -*- coding: utf-8 -*-
  2. import cv2
  3. cap = cv2.VideoCapture(0)
  4. #先设置分辨率,宽:1920 长:1080
  5. cap.set(3,1920)
  6. cap.set(4,1080)
  7. while(1):
  8. # get a frame
  9. ret, frame = cap.read()
  10. if ret:
  11. # show a frame
  12. cv2.imshow("capture", frame)
  13. if cv2.waitKey(1) & 0xFF == ord('q'):
  14. break
  15. else:
  16. print("图像数据获取失败!!")
  17. break
  18. cap.release()
  19. cv2.destroyAllWindows()

 

4)摄像头拍照

拍照 = 保存图片,使用 cv2.imwrite 把当前摄像头的帧 数据写进去,保存为图片的形式;如果s键按下,则进行图片保存;


  
  1. # -*- coding: utf-8 -*-
  2. import cv2
  3. cap = cv2.VideoCapture(0)
  4. #先设置分辨率,宽:1920 长:1080
  5. cap.set(3,1920)
  6. cap.set(4,1080)
  7. # 图像计数 从1开始
  8. img_count = 1
  9. while(1):
  10. # get a frame
  11. ret, frame = cap.read()
  12. if ret:
  13. # show a frame
  14. cv2.imshow("capture", frame)
  15. # 等待按键事件发生 等待1ms
  16. key = cv2.waitKey(1)
  17. if key == ord('q'):
  18. # 如果按键为q 代表quit 退出程序
  19. print("程序正常退出..")
  20. break
  21. elif key == ord('s'):
  22. ## 如果s键按下,则进行图片保存
  23. # 写入图片 并命名图片为 图片序号.png
  24. cv2.imwrite("{}.png".format(img_count), frame)
  25. print("保存图片,名字为 {}.png".format(img_count))
  26. # 图片编号计数自增1
  27. img_count += 1
  28. else:
  29. print("图像数据获取失败!!")
  30. break
  31. cap.release()
  32. cv2.destroyAllWindows()

 

5)录制视频

保存图片使用的是cv2.imwrite(),要保存视频,需要创建一个VideoWriter对象,需要传入四个参数。

  • 输出的文件名,如’output.avi’
  • 编码方式FourCC码
  • 帧率FPS
  • 要保存的分辨率大小

  
  1. # -*- coding: utf-8 -*-
  2. import cv2
  3. cap = cv2.VideoCapture(0)
  4. # 定义编码方式并创建VideoWriter对象
  5. fourcc = cv2.VideoWriter_fourcc(*'MJPG')
  6. outfile = cv2.VideoWriter('output.avi', fourcc, 25., (640, 480))
  7. while(cap.isOpened()):
  8. ret, frame = cap.read()
  9. if ret:
  10. outfile.write(frame) # 写入文件
  11. cv2.imshow('frame', frame)
  12. if cv2.waitKey(1) == ord('q'):
  13. break
  14. else:
  15. break

使用cv2.VideoCapture()创建视频对象,然后在循环中一帧一阵显示图像。

 

参考:https://www.programcreek.com/python/example/85663/cv2.VideoCapture

https://appdividend.com/2020/06/26/python-cv2-videocapture-how-to-load-video-in-python/

 

 

 

 

文章来源: guo-pu.blog.csdn.net,作者:一颗小树x,版权归原作者所有,如需转载,请联系作者。

原文链接:guo-pu.blog.csdn.net/article/details/113073445

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。