OpenCV-Python学习教程.1

2021-04-14 11:05:17 浏览数 (2)

本次用到的是一款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'的名字不变,这样每一帧会覆盖上一帧,就产生了视频的效果。


0 人点赞