本次用到的是一款DELL的摄像头,比较便宜。因为自带的摄像头不太方便
先来一张捕获到的照片。虽然不太清晰但是已经够用了
因为最近做图形算法比较多,所以对cv2熟悉是必然的,倒是和以前的函数差不多,就是一些小细节不太一样。
代码语言:javascript复制import cv2
import numpy as np
cap = cv2.VideoCapture(1)
while(True):
ret, frame = cap.read()
cv2.imshow('frame', frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyWindows()
首先是对自己的摄像头做一个测试,这个代码会打开一个视频的捕获窗口
代码语言:javascript复制import cv2
win_name = 'VideoCaptureProperties'
videoCapture = cv2.VideoCapture(1) # 调用相机
width = videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH) # 宽度
height = videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 高度
fps = videoCapture.get(cv2.CAP_PROP_FPS) # 帧率
fourcc = videoCapture.get(cv2.CAP_PROP_FOURCC) # 编解码器4位char
brightness = videoCapture.get(cv2.CAP_PROP_BRIGHTNESS) # 亮度,调用相机
contrast = videoCapture.get(cv2.CAP_PROP_CONTRAST) # 对比度,调用相机
saturation = videoCapture.get(cv2.CAP_PROP_SATURATION) # 饱和度,调用相机
hue = videoCapture.get(cv2.CAP_PROP_HUE) # 色调,调用相机
gain = videoCapture.get(cv2.CAP_PROP_GAIN) # 增益,调用相机
exposure = videoCapture.get(cv2.CAP_PROP_EXPOSURE) # 曝光,调用相机
print('宽度:{}'.format(width))
print('高度:{}'.format(height))
print('帧率:{}'.format(fps))
print('编解码器:{}'.format(fourcc))
print('亮度:{}'.format(brightness))
print('对比度:{}'.format(contrast))
print('饱和度:{}'.format(saturation))
print('色调:{}'.format(hue))
print('增益:{}'.format(gain))
print('曝光:{}'.format(exposure))
videoCapture.release()
这串代码是摄像头的基本信息的输出
稍等片刻就会打印出来
随手一算,30W
我们的下视摄像头是这个分辨率
因为是用的vscode,在jupyter里面输出大量的log的时候会有限制,可以自己去打开这个限制。
代码语言:javascript复制import cv2
# win_name = 'VideoCaptureProperties'
win_name = 'da'
cv2.namedWindow(win_name)
videoCapture = cv2.VideoCapture(1)
width = videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH) # 宽度
height = videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 高度
fps = videoCapture.get(cv2.CAP_PROP_FPS) # 帧率
frame_count = videoCapture.get(cv2.CAP_PROP_FRAME_COUNT) # 总帧数
time_count = int(frame_count / fps) # 总秒数
fourcc = videoCapture.get(cv2.CAP_PROP_FOURCC) # 编解码器4位char
print('宽度:{}'.format(width))
print('高度:{}'.format(height))
print('帧率:{}'.format(fps))
print('总帧数:{}'.format(frame_count))
print('总秒数:{}'.format(time_count))
print('编解码器:{}'.format(fourcc))
while True:
ret, frame = videoCapture.read()
if ret is True:
cv2.imshow(win_name, frame)
time_current = int(videoCapture.get(
cv2.CAP_PROP_POS_MSEC) / 1000) # 第几秒
frame_current = videoCapture.get(cv2.CAP_PROP_POS_FRAMES) # 第几帧
print('第{}秒 第{}帧'.format(time_current, frame_current))
if cv2.waitKey(25) & 0xFF == ord('q'): # q退出
break
else:
break
videoCapture.release()
cv2.destroyAllWindows()
有用的代码是这些,来输出帧率
开始输出了
ret, frame = cap.read()读取每一帧,其中ret表示一个True/False的布尔值,用来表示是否读取成功。frame表示读取到的np.array类型的每一帧,就是图片。
这个里面是一些参数值,可以参考
具体使用就是直接用get方法读取
接着打印出来就好
而且也可以来修改对应得值:
对应的,使用 cap.set(propId,value) 来修改视频属性,value 就是你想要设置成的新值。
可以写成这样
我解释一下这个imshow为什么会预览视频:
cv2.imshow('frame',frame)将每一帧显示在一个叫frame的窗口上。这里解释一下,为什么这样显示在窗口上会产生视频的效果。操作图像的时候显示多幅图像的时候,若cv2.imshow() 指定相同的窗口名,这样后面显示的图片会覆盖前面的图片,而产生一个窗口。这里视频显示也是同样的道理,每次while循环,窗口'frame'的名字不变,这样每一帧会覆盖上一帧,就产生了视频的效果。