OpenCV 单目摄像头(python版)
前言
本文主要介绍在OpenCV用使用单目摄像头,包括:打开单目摄像头、设置摄像头参数、拍照、录制视频。
环境:编程语言:Python3 主要依赖库:OpenCV3.x 或 OpenCV4.x
目录
单目摄像头
1)打开摄像头
OpenCV有VideoCapture()函数,能用来定义“摄像头”对象,0表示第一个摄像头(一般是电脑内置的摄像头);如果有两个摄像头,第二个摄像头则对应VideoCapture(1)。
在while循环中使用“摄像头对象”的read()函数一帧一帧地读取摄像头画面数据。
imshow函数是显示摄像头的某帧画面;cv2.waitKey(1)是等待1ms,如果期间检测到了键盘输入q,则退出while循环。
-
# -*- coding: utf-8 -*-
-
import cv2
-
-
cap = cv2.VideoCapture(0) # 0表示第一个摄像头
-
while(1):
-
# get a frame
-
ret, frame = cap.read()
-
# show a frame
-
cv2.imshow("capture", frame)
-
if cv2.waitKey(1) & 0xFF == ord('q'):
-
break
-
cap.release()
-
cv2.destroyAllWindows()
调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。
2)设置分辨率
有时需要指定摄像头的分辨率,比如1920*1080;
cap.set(3,1920) 设置帧的宽度为1920。cap.set(4,1080) 设置帧的长度为1080。
-
# -*- coding: utf-8 -*-
-
import cv2
-
-
cap = cv2.VideoCapture(0)
-
#先设置分辨率,宽:1920 长:1080
-
cap.set(3,1920)
-
cap.set(4,1080)
-
while(1):
-
# get a frame
-
ret, frame = cap.read()
-
# show a frame
-
cv2.imshow("capture", frame)
-
if cv2.waitKey(1) & 0xFF == ord('q'):
-
break
-
cap.release()
-
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。
-
# -*- coding: utf-8 -*-
-
import cv2
-
-
cap = cv2.VideoCapture(0)
-
#先设置分辨率,宽:1920 长:1080
-
cap.set(3,1920)
-
cap.set(4,1080)
-
while(1):
-
# get a frame
-
ret, frame = cap.read()
-
if ret:
-
# show a frame
-
cv2.imshow("capture", frame)
-
if cv2.waitKey(1) & 0xFF == ord('q'):
-
break
-
else:
-
print("图像数据获取失败!!")
-
break
-
cap.release()
-
cv2.destroyAllWindows()
4)摄像头拍照
拍照 = 保存图片,使用 cv2.imwrite 把当前摄像头的帧 数据写进去,保存为图片的形式;如果s键按下,则进行图片保存;
-
# -*- coding: utf-8 -*-
-
import cv2
-
-
cap = cv2.VideoCapture(0)
-
#先设置分辨率,宽:1920 长:1080
-
cap.set(3,1920)
-
cap.set(4,1080)
-
# 图像计数 从1开始
-
img_count = 1
-
-
while(1):
-
# get a frame
-
ret, frame = cap.read()
-
if ret:
-
# show a frame
-
cv2.imshow("capture", frame)
-
# 等待按键事件发生 等待1ms
-
key = cv2.waitKey(1)
-
if key == ord('q'):
-
# 如果按键为q 代表quit 退出程序
-
print("程序正常退出..")
-
break
-
elif key == ord('s'):
-
## 如果s键按下,则进行图片保存
-
# 写入图片 并命名图片为 图片序号.png
-
cv2.imwrite("{}.png".format(img_count), frame)
-
print("保存图片,名字为 {}.png".format(img_count))
-
# 图片编号计数自增1
-
img_count += 1
-
-
else:
-
print("图像数据获取失败!!")
-
break
-
cap.release()
-
cv2.destroyAllWindows()
5)录制视频
保存图片使用的是cv2.imwrite(),要保存视频,需要创建一个VideoWriter对象,需要传入四个参数。
- 输出的文件名,如’output.avi’
- 编码方式FourCC码
- 帧率FPS
- 要保存的分辨率大小
-
# -*- coding: utf-8 -*-
-
import cv2
-
-
cap = cv2.VideoCapture(0)
-
# 定义编码方式并创建VideoWriter对象
-
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
-
outfile = cv2.VideoWriter('output.avi', fourcc, 25., (640, 480))
-
-
while(cap.isOpened()):
-
ret, frame = cap.read()
-
if ret:
-
outfile.write(frame) # 写入文件
-
cv2.imshow('frame', frame)
-
if cv2.waitKey(1) == ord('q'):
-
break
-
else:
-
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
- 点赞
- 收藏
- 关注作者
评论(0)