文章目录
一、上篇回顾
在上一篇中,简单介绍了如何在 Windows 和 Ubuntu 两个环境下部署和安装 OpenCV,从本篇开始将逐步介绍 OpenCV 中的常见操作。
本篇介绍 OpenCV 和摄像头的相关操作。
二、使用步骤
1. 调用摄像头的 API 介绍
OpenCV 调用摄像头使用 cv2.VideoCapture
,API 如下:
cpp
cv::VideoCapture::VideoCapture()
cv::VideoCapture::VideoCapture(const String& filename)
cv::VideoCapture::VideoCapture(const String& filename, int apiPreference)
cv::VideoCapture::VideoCapture(int index)
cv::VideoCapture::VideoCapture(int index, int apiPreference)
从 API 中可以看出,OpenCV 的 VideoCapture
对象可以用 摄像头或者一个视频文件作为输入流,apiPreference 则指定了图像视频流处理的 API,这些 API 以 CAP_
开头。
2. 代码示例
在编辑器中输入以下内容:
python3
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
print("摄像头无法打开!")
break
cv2.imshow("Capture", frame)
if cv2.waitKey(0) == ord('q'):
break
cv2.destroyAllWindows()
如果运行正常,那么应该能看到摄像头的画面内容。
3. 代码分析
python3
cap = cv2.VideoCapture(0)
这里,0 指的是摄像头的位置,如果只有一个摄像头,一般来说都是 0,而如果有多个摄像头,则可以通过更改编号来切换摄像头,笔记本电脑自带的摄像头也是 0。
python3
ret, frame = cap.read()
cap.read()
用于从视频流中读取一帧,函数返回两个参数,ret
是 bool
类型,用于判断是否成功读取视频帧,frame
是 np.ndarray
类型,是一个数组,用于记录摄像头的信息。
python3
cv2.imshow("Capture", frame)
imshow
函数用于显示画面,使用方法如下:
cpp
void cv::imshow(const String& winname, InputArray mat)
第一个参数是窗口名称,第二个参数是要显示的图像,也就是前面的 frame
。
python3
if cv2.waitKey(0) == ord('q'):
break
waitKey
函数用于接收键盘输入,注意 只有在窗口中按下按键才有用,在终端或者其他地方无效。
python3
int cv::waitKey(int delay = 0)
- delay < 0: 立即返回结果,不等待用户输入
- delay = 0: 无限期等待直到用户输入
- delay > 0: 等待指定时间 (ms) 后返回输入的内容。
返回的内容为 ASCII 值,因此需要进行转换,Python 中的 ord
函数可以将字符转换为 ASCII 值。
三、下篇预告
本篇简单介绍了 OpenCV 中 摄像头读取的相关操作。在摄像头读取时,可能会出现画面延迟,导致读取到的往往不是最新的画面,下期将介绍解决方法。