opencv视频读写

视频操作

目标
  • 打开摄像头并捕获照片
  • 播放本地视频,录制视频
import cv2
import numpy as np
import matplotlib.pyplot as ply

打开摄像头

cv2.VideoCapture(0): 创建VideoCapture,对象,0是摄像头编号

windows系统下,采用dshow流媒体机制时需要使用cv2.CAP_DSHOW作为cv2.VideoCapture(0, cv2.CAP_DSHOW)的参数

capture = cv2.VideoCapture(0)
cv2.namedWindow("thresh", cv2.WINDOW_AUTOSIZE)
while(True):
    ret, frame = capture.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 二值化
    # _, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
    # 获取捕获的分辨率
    # propId可以直接写数字,也可以用OpenCV的符号表示
    width, height = capture.get(3), capture.get(4)
    # print(width, height)

    # 以原分辨率的一倍来捕获
    capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2)
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height * 2)
    cv2.imshow('frame', frame)
    # 灰度图
    # cv2.imshow('gary', gray)
    # cv2.imshow('thresh', thresh)
    if cv2.waitKey(1) == 27:
        break
  • capture.read()函数返回的第一个参数是一个布尔值,表示当前这一帧是否获取正确。
  • capture.get()可以获取摄像头的一些属性
  • capture.set()可以修改这些属性值
参数含义
0:CV_CAP_PROP_POS_MSEC视频文件的当前位置(毫秒)
1:CV_CAP_PROP_POS_FRAMES基于0的索引的下一个要解码/捕获的帧。
CV_CAP_PROP_POS_AVI_RATIO视频文件的相对位置:0-胶片开始,1-胶片结束。
CV_CAP_PROP_FRAME_WIDTH视频流中帧的宽度。
CV_CAP_PROP_FRAME_HEIGHT视频流中帧的高度。
CV_CAP_PROP_FPS帧速率。
CV_CAP_PROP_FOURCC编解码器的4字符代码。
CV_CAP_PROP_FRAME_COUNT视频文件中的帧数。
CV_CAP_PROP_FORMAT返回的Mat对象的格式。
CV_CAP_PROP_MODE后端特定值,指示当前捕获模式。
CV_CAP_PROP_BRIGHTNESS图像亮度(仅适用于相机)
CV_CAP_PROP_CONTRAST图像对比度(仅适用于相机)
CV_CAP_PROP_SATURATION图像的饱和度(仅适用于相机)
CV_CAP_PROP_HUE图像的色调(仅适用于相机)
CV_CAP_PROP_GAIN图像增益(仅适用于相机)
CV_CAP_PROP_EXPOSURE曝光(仅适用于相机)
CV_CAP_PROP_CONVERT_RGB指示是否应将图像转换为RGB的布尔标志。
CV_CAP_PROP_WHITE_BALANCE当前不支持
CV_CAP_PROP_RECTIFICATION立体相机的校正标志(注:仅DC1394 v 2.x后端当前支持)

播放本地视频

把摄像头换成文件路径即可,cv2.waitKey()的参数表示暂停的时间,一般为25或30.

capture = cv2.VideoCapture('/home/jokesnow/Videos/minzu.mp4')
while(capture.isOpened()):
    ret, frame = capture.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == 27:
        break

录制视频

保存图片使用cv2.imwrite(),保存视频我们需要创建一个VideoWriter的对象,然后传给它四个参数:

  • 输出的文件名
  • 编码方式FourCC码
    • FourCC是用来指定视频编码方式的四字节码。如MJPG编码可以这样写:cv2.VideoWriter_fourcc(*'MJPG')cv2.VideoWriter_fourcc('M', 'j', 'p', 'G')
    • 帧率FPS
    • 要保存的分辨率大小
capture = cv2.VideoCapture(0)

# 定义编码方式并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
outfile = cv2.VideoWriter('/home/jokesnow/Videos/output.avi', fourcc, 25., (640, 480))

while(capture.isOpened()):
    ret, frame = capture.read()
    if ret:
        outfile.write(frame)
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) == 27:
            break
    else:
        break

特定颜色物体追踪

步骤:

  1. 捕获视频中的一帧
  2. 从BGR转换到HSV
  3. 提取蓝色范围的物体
  4. 只显示蓝色物体
import numpy as np

capture = cv2.VideoCapture(0)
# 蓝色的范围
lower_blue = np.array([100, 100, 100])
upper_blue = np.array([130, 255, 255])

while(True):
    # 捕获一帧
    ret, frame = capture.read()
    # 从BGR转换到HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # inRange():介于lower/upper之间的为白色,其余为黑色
    mask = cv2.inRange(hsv, lower_blue, upper_blue)
    # 只保留蓝色
    res = cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)
    cv2.imshow('res', res)

    if cv2.waitKey(1) == 27:
        break

颜色HSV范围的获取:

blue = np.uint8([[[255, 0, 0]]])
red = np.uint8([[[0, 0, 255]]])
green = np.uint8([[[0, 255, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print('b:', hsv_blue, 'g:', hsv_green, 'r:', hsv_red)

提取红绿蓝三种颜色

import numpy as np

capture = cv2.VideoCapture(0)
# 蓝色的范围
lower_blue = np.array([90, 100, 100])
upper_blue = np.array([140, 255, 255])
lower_green = np.array([40, 100, 100])
upper_green = np.array([80, 255, 255])
lower_red = np.array([0, 100, 100])
upper_red = np.array([30, 255, 255])

while(True):
    ret, frame = capture.read()

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    mask_blue= cv2.inRange(hsv, lower_blue, upper_blue)
    mask_green= cv2.inRange(hsv, lower_green, upper_green)
    mask_red= cv2.inRange(hsv, lower_red, upper_red)
    res1 = cv2.bitwise_and(frame, frame, mask=mask_blue)
    res2 = cv2.bitwise_and(frame, frame, mask=mask_green)
    res3 = cv2.bitwise_and(frame, frame, mask=mask_red)
    res = res1 + res2 + res3
    
    cv2.imshow('frame', frame)
    cv2.imshow('mask_blue', mask_blue)
    cv2.imshow('mask_green', mask_green)
    cv2.imshow('mask_red', mask_red)
    cv2.imshow('res', res)

    if cv2.waitKey(1) == 27:
        break
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值