IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> python opencv 保存摄像头视频,以及fourc编码的介绍 -> 正文阅读

[人工智能]python opencv 保存摄像头视频,以及fourc编码的介绍

之所以写这篇博客,主要还是想介绍一下fourcc编码

1 读取摄像头

1.1 正常读取一个摄像头

1、读取摄像头

  • 只读取摄像头
  • 没有做其他操作
import cv2

# 获取摄像头 0代表摄像头索引
cap = cv2.VideoCapture(0)

while cap.isOpened():
    # 如果正确读取每一帧,则ret返回True,frame返回当前帧的数据
    ret, frame = cap.read()
    if not ret:
        print("Opening the camera failed!")
    
    # 显示摄像头流
    cv2.imshow("frame", frame)
    
    # 按q键退出显示
    key = cv2.waitKey(1)
    if key == ord("q"):
        break
        
cap.release()
cv2.destroyAllWindows()

1.2 获取摄像头属性和设置摄像头属性

opencv-python默认读取摄像头的分辨率为:640x480,下面我们将:

  • 获取摄像头的分辨率 和 帧率
  • 设置摄像头的帧率
import cv2

# 获取摄像头 0代表摄像头索引
cap = cv2.VideoCapture(0)

# 获取摄像头的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 或者用 cv2.CAP_PROP_FPS属性对应的数组id也是可以的
# cap = cap.get(5)
print(f"camera fps: {fps}")  # camera fps: 30.0


# 获取摄像头的分辨率
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 或者用属性对应的id
# width = cap.get(3)
# width = cap.get(4)
print(f"camera resolution: ({width}x{height})")  # camera resolution: (640.0x480.0)

# 设置摄像头分辨率
cap.set(3, 1280)
cap.set(4, 720)
# 此时再获取重新设置后的分辨率
width2 = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height2 = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(f"camera resolution: ({width2}x{height2})")  # camera resolution: (1280.0x720.0)


while cap.isOpened():
    # 如果正确读取每一帧,则ret返回True,frame返回当前帧的数据
    ret, frame = cap.read()
    if not ret:
        print("Opening the camera failed!")

    # 显示摄像头流
    cv2.imshow("frame", frame)

    # 按q键退出显示
    key = cv2.waitKey(1)
    if key == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

1.3 把摄像头流保存成视频

1、把摄像头流保存成mp4视频文件

import cv2

# 获取摄像头 0代表摄像头索引
cap = cv2.VideoCapture(0)

# 获取摄像头帧率
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 设置摄像头分辨率
cap.set(3, 1280)
cap.set(4, 720)
# 此时再获取重新设置后的分辨率
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(f"camera resolution: ({width}x{height})")  # camera resolution: (1280.0x720.0)
size = (int(width), int(height))

# 设置保存视频的编码格式
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
videowriter = cv2.VideoWriter()
videowriter.open("output.mp4", fourcc, fps, size, True)
# videowriter.open(filename="output.mp4", fourcc=fourcc, fps=fps, frameSize=size, isColor=True)

while cap.isOpened():
    # 如果正确读取每一帧,则ret返回True,frame返回当前帧的数据
    ret, frame = cap.read()
    if not ret:
        print("Opening the camera failed!")

    # 保存视频
    videowriter.write(frame)

    # 显示摄像头流
    cv2.imshow("frame", frame)

    # 按q键退出显示
    key = cv2.waitKey(1)
    if key == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

通过上面代码保存的视频,你会发现:

  • 视频帧率是fps=30
  • 视频分辨率是1280x720,就是720P的

2、保存的视频,如果你去播放一下会发现速度特别快,像是倍速播放一样,这是为什么呢?

我们先来计算读取一帧需要的大概时间:

import cv2
import time

# 获取摄像头 0代表摄像头索引
cap = cv2.VideoCapture(0)

# 获取摄像头帧率
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 设置摄像头分辨率
cap.set(3, 1280)
cap.set(4, 720)
# 此时再获取重新设置后的分辨率
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(f"camera resolution: ({width}x{height})")  # camera resolution: (1280.0x720.0)
size = (int(width), int(height))

# 设置保存视频的编码格式
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
videowriter = cv2.VideoWriter()
videowriter.open("output.mp4", fourcc, fps, size, True)
# videowriter.open(filename="output.mp4", fourcc=fourcc, fps=fps, frameSize=size, isColor=True)

while cap.isOpened():
    start = time.time()
    # 如果正确读取每一帧,则ret返回True,frame返回当前帧的数据
    ret, frame = cap.read()
    if not ret:
        print("Opening the camera failed!")

    # 保存视频
    videowriter.write(frame)

    # 显示摄像头流
    cv2.imshow("frame", frame)

    # 按q键退出显示
    key = cv2.waitKey(1)
    if key == ord("q"):
        break

    end = time.time()
    print(f"Read a frame time: {(end-start)*1000:.3f}ms")

cap.release()
cv2.destroyAllWindows()

输出结果,大概读取一帧的时间是100ms,按照这个时间,while循环处理完一帧数据之后,就会循环下一帧数据,这个循环的速度大概相当于是100fps

Read a frame time: 99.573ms
Read a frame time: 100.382ms
Read a frame time: 99.949ms
Read a frame time: 100.631ms
Read a frame time: 98.024ms
Read a frame time: 101.144ms
Read a frame time: 100.274ms
Read a frame time: 100.390ms

因此,如果我们要把上面循环的速度也变成30fps,就需要控制一下循环的速度,因此只要在每帧读完之后睡眠一下,就可以大概控制帧率为30fps了,睡眠时间(参考):

s l e e p _ t i m e = 1000 w e b c a m _ f p s = 1000 m s 30 f p s sleep\_time = \frac{1000}{webcam\_fps}=\frac{1000ms}{30fps} sleep_time=webcam_fps1000?=30fps1000ms?

此时,用下面的代码再保存一下视频看看效果吧:

import cv2
import time

# 获取摄像头 0代表摄像头索引
cap = cv2.VideoCapture(0)

# 获取摄像头帧率
fps = cap.get(cv2.CAP_PROP_FPS)

# 设置摄像头分辨率
cap.set(3, 1280)
cap.set(4, 720)
# 此时再获取重新设置后的分辨率
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(f"camera resolution: ({width}x{height})")  # camera resolution: (1280.0x720.0)
size = (int(width), int(height))

# 设置保存视频的编码格式
fourcc = cv2.VideoWriter_fourcc(*"mp4v")   # 保存成mp4格式
# fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 保存成avi格式
videowriter = cv2.VideoWriter()
videowriter.open("output.mp4", fourcc, fps, size, True)
# videowriter.open(filename="output.mp4", fourcc=fourcc, fps=fps, frameSize=size, isColor=True)

while cap.isOpened():
    start = time.time()
    # 如果正确读取每一帧,则ret返回True,frame返回当前帧的数据
    ret, frame = cap.read()
    if not ret:
        print("Opening the camera failed!")

    # 保存视频
    videowriter.write(frame)

    # 显示摄像头流
    cv2.imshow("frame", frame)

    # 按q键退出显示
    key = cv2.waitKey(1)
    if key == ord("q"):
        break

    end = time.time()
    print(f"Read a frame time: {(end-start)*1000:.3f}ms")
    # sleep睡眠的的单位是 秒 s
    time.sleep(1/fps)

cap.release()   # 释放摄像头
videowriter.release()
cv2.destroyAllWindows()  # 关闭所有的图像窗口

实际测试,即使我把睡眠时间调整到0.1s,保存的视频播放依然很快,目前我不知道怎么解决了,如有知道如何解决,请留言,谢谢!

2 更多关于视频捕获属性 cv2.CAP_PROP

opencv 官网video I/O模块的doc

1、获取属性

  • cap.get(propId)

2、设置属性

  • cap.set(propId, value)

3、更多CAP_PROP属性介绍

视频捕获属性(VideoCaptureProperties

参数视频捕获属性(VideoCaptureProperties属性功能描述
cv2.VideoCapture.get(0)cv2.CAP_PROP_POS_MSEC = 0视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1)cv2.CAP_PROP_POS_FRAMES = 1基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2)cv2.CAP_PROP_POS_AVI_RATIO = 2视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3)cv2.CAP_PROP_FRAME_WIDTH = 3在视频流的帧的宽度
cv2.VideoCapture.get(4)cv2.CAP_PROP_FRAME_HEIGHT = 4在视频流的帧的高度
cv2.VideoCapture.get(5)cv2.CAP_PROP_FPS = 5帧速率
cv2.VideoCapture.get(6)cv2.CAP_PROP_FOURCC = 6编解码的4字-字符代码
cv2.VideoCapture.get(7)cv2.CAP_PROP_FRAME_COUNT = 7视频文件中的帧数
cv2.VideoCapture.get(8)cv2.CAP_PROP_FORMAT = 8返回对象的格式
cv2.VideoCapture.get(9)cv2.CAP_PROP_MODE = 9返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10)cv2.CAP_PROP_BRIGHTNESS = 10图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11)cv2.CAP_PROP_CONTRAST = 11图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12)cv2.CAP_PROP_SATURATION = 12图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13)cv2.CAP_PROP_HUE = 13图像色调(仅适用于照相机)
cv2.VideoCapture.get(14)cv2.CAP_PROP_GAIN = 14图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15)cv2.CAP_PROP_EXPOSURE = 15曝光(仅适用于照相机)
cv2.VideoCapture.get(16)cv2.CAP_PROP_CONVERT_RGB = 16指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17)cv2.CAP_PROP_WHITE_BALANCE_BLUE_U = 17× 暂时不支持
cv2.VideoCapture.get(18)cv2.CAP_PROP_RECTIFICATION = 18立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
cv2.VideoCapture.get(19)cv2.CAP_PROP_MONOCHROME = 19-
cv2.VideoCapture.get(20)cv2.CAP_PROP_SHARPNESS = 20-
cv2.VideoCapture.get(21)cv2.CAP_PROP_AUTO_EXPOSURE = 21-
cv2.VideoCapture.get(22)cv2.CAP_PROP_GAMMA = 22-
cv2.VideoCapture.get(23)cv2.CAP_PROP_TEMPERATURE = 23-
cv2.VideoCapture.get(24)cv2.CAP_PROP_TRIGGER = 24-
cv2.VideoCapture.get(25)cv2.CAP_PROP_TRIGGER_DELAY = 25-
cv2.VideoCapture.get(26)cv2.CAP_PROP_WHITE_BALANCE_RED_V = 26-
cv2.VideoCapture.get(27)cv2.CAP_PROP_ZOOM = 27-
cv2.VideoCapture.get(28)cv2.CAP_PROP_FOCUS = 28-
cv2.VideoCapture.get(29)cv2.CAP_PROP_GUID = 29-
cv2.VideoCapture.get(30)cv2.CAP_PROP_ISO_SPEED = 30-
cv2.VideoCapture.get(32)cv2.CAP_PROP_BACKLIGHT = 32-
cv2.VideoCapture.get(33)cv2.CAP_PROP_PAN = 33-
cv2.VideoCapture.get(34)cv2.CAP_PROP_TILT = 34-
cv2.VideoCapture.get(35)cv2.CAP_PROP_ROLL = 35-
cv2.VideoCapture.get(36)cv2.CAP_PROP_IRIS = 36-
cv2.VideoCapture.get(37)cv2.CAP_PROP_SETTINGS = 37弹出视频/摄像机过滤器对话框(注意:当前仅DSHOW后端支持。属性值将被忽略)
cv2.VideoCapture.get(38)cv2.CAP_PROP_BUFFERSIZE = 38-
cv2.VideoCapture.get(39)cv2.CAP_PROP_AUTOFOCUS = 39-
cv2.VideoCapture.get(40)cv2.CAP_PROP_SAR_NUM = 40sample aspect ratio: num/den (num)
cv2.VideoCapture.get(41)cv2.CAP_PROP_SAR_DEN = 41采样长宽比:num / den(den)(Sample aspect ratio: num/den (den))
cv2.VideoCapture.get(42)cv2.CAP_PROP_BACKEND = 42当前后端(枚举VideoCaptureAPI)。 只读属性。
cv2.VideoCapture.get(43)cv2.CAP_PROP_CHANNEL = 43视频输入或通道数(仅适用于支持的摄像头)
cv2.VideoCapture.get(44)cv2.CAP_PROP_AUTO_WB = 44启用/禁用自动白平衡
cv2.VideoCapture.get(45)cv2.CAP_PROP_WB_TEMPERATURE = 45白色平衡色温
cv2.VideoCapture.get(46)cv2.CAP_PROP_CODEC_PIXEL_FORMAT = 46(只读)编解码器的像素格式。 4-character code-请参见VideoWriter :: fourcc。 AV_PIX_FMT_ *的子集;如果未知,则为-1
cv2.VideoCapture.get(47)cv2.CAP_PROP_BITRATE = 47(只读)视频比特率,单位为千比特/秒(kbits/s)
cv2.VideoCapture.get(48)cv2.CAP_PROP_ORIENTATION_META = 48只读)由stream meta定义的帧旋转(仅适用于FFmpeg后端)
cv2.VideoCapture.get(49)cv2.CAP_PROP_ORIENTATION_AUTO = 49如果为true -旋转CvCapture的输出帧考虑视频文件的元数据(仅适用于FFmpeg后端)

3 视频四字符编码foucc

1、我们在保存视频之前,需要先设置保存视频的编码格式

fourcc = cv2.VideoWriter_fourcc(*"mp4v") 

也可以写成如下的形式:

fourcc = cv2.VideoWriter_fourcc("M", "P", "4", "V")

2、fourcc为四个字符用来表示编码格式

3、定义保存视频编码格式

◆ fourcc()
static int cv::VideoWriter::fourcc	(	char 	c1,
char 	c2,
char 	c3,
char 	c4 
)		

# Python:
cv.VideoWriter_fourcc(	c1, c2, c3, c4	) ->	retval

4、fourcc的编码格式有很多,具体可以去这里查看

在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 11:54:48  更:2021-07-17 11:55:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/22 11:19:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码