调用摄像头
代码:
# -*- coding=GBK -*-
import cv2 as cv
# 打开摄像头获取图片
def video_demo():
capture = cv.VideoCapture(0, cv.CAP_DSHOW) # 打开摄像头,0代表的是设备id,如果有多个摄像头,可以设置其他数值
while True:
ret, frame = capture.read() # 读取摄像头,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表有没有读到图片;第二个参数是frame,是当前截取一帧的图片
frame = cv.flip(frame, 1) # flip():图像翻转函数 第二个参数 小于0: 180°旋转,等于0: 上下颠倒,大于0: 水平颠倒(镜像图)
cv.imshow("video", frame)
if cv.waitKey(10) & 0xFF == ord('q'): # 详见备注
break
# key = cv.waitKey(10)
# if key == 27 :
# break
video_demo()
cv.destroyAllWindows()
结果:
备注:
while True 实现无限循环,保证read()函数能一帧一帧读取视频图像
其中 cv.waitKey(10) & 0xFF == ord('q') 这句代码不是cv.waitKey(10) + & + 0xFF == ord('q') 这样理解的而是cv.waitKey(10) & 0xFF + == ord('q')这样理解的,cv.waitKey(10)表示待用户10ms内触发键盘按键并返回按键对应的SACII码,与0xFF做&/位与运算是为了避免waitKey()返回负数的值,当然在一定情况下可以把 & 0xFF删除也没问题
“& 0xFF”问题详见:https://blog.csdn.net/i6223671/article/details/88924481
ord()函数为键盘按键接收函数,简单来说就是接收键盘上按键对应的字符,并返回字符对应的ASCII码,输入参数要求为字符型
打开视频文件
代码:
# -*- coding=GBK -*-
import cv2 as cv
capture = cv.VideoCapture('HeartMake.mp4') # 读取视频文件
fps = capture.get(cv.CAP_PROP_FPS) # 获取码率
size = (int(capture.get(cv.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv.CAP_PROP_FRAME_HEIGHT))) # 获取尺寸
fNUMS = capture.get(cv.CAP_PROP_FRAME_COUNT) # 获取帧数
def video_demo():
cv.namedWindow("video", 0)
cv.resizeWindow("video", 1000, 600) # 设置播放窗口长和宽
# ret, frame = capture.read() # 读取第一帧
while True:
ret, frame = capture.read() # 读取下一帧
cv.imshow("video", frame) # 显示目前帧
cv.waitKey(int(fps)) # 设置延迟,便于观看体验
# if cv.waitKey(10) & 0xFF == ord('q'):
# break
if cv.waitKey(1) == 27 :
break
# ret, frame = capture.read() # 读取下一帧
capture.release()
video_demo()
cv.destroyAllWindows()
结果:
备注:
无论时调用摄像头进行实时播放还是打开视频文件播放,capture.read()这个函数读取的是一帧,并且是一帧一帧读取。而且.read是capture的一个属性,意味着当capture只有一帧时,capture.read()只能返回一帧,当capture有多帧时,capture.read()是按顺序一帧一帧返回,而while循环是提供了一帧一帧之间的连贯性