上次我们学了图像的加载与保存,那么我们想通过摄像头按帧获取图像可以吗,当然!
打开摄像头,获取图像
代码如下:
import cv2 as cv #导入cv模块
import numpy as np #np科学计数的包,通过numpy对数据进行处理
def video_demo():
capture = cv.VideoCapture(0) #打开和电脑上连接的相机
while(True):
ret,frame = capture.read() #ret是返回值,frame是视频中的每一帧
frame = cv.flip(frame, 1)
cv.imshow("video", frame) #将每一帧显示出来
c = cv.waitKey(1)
if c == 27:
break
capture.release()
video_demo() #调用获取视频方法
cv.destroyAllWindows() #释放所有的内存
运行截图:
方法讲解:
1、capture = cv2.VideoCapture(0)
VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如capture = cv2.VideoCapture("…/test.avi")
2、ret,frame = capture .read()
capture .read()按帧读取视频,ret,frame是获capture .read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
3、cv::flip()
cv::flip()支持图像的翻转(上下翻转、左右翻转,以及同时均可)。
0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转
4、cv.waitKey(1),waitKey()方法本身表示等待键盘输入,
参数是1,表示延时1ms切换到下一帧图像,对于视频而言;
参数为0,如cv.waitKey(0)只显示当前帧图像,相当于视频暂停,;
参数过大如cv.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。
c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立
5、调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。