视频流基本处理操作

"""
    视频基本处理:
        1.从摄像机获取视频
        2.创建一个基于摄像头的视频读取流,给定基于第一个视频设备
        3.设置摄像头相关参数
        4.打印属性
        5.便利获取视频中的图像(读取当前时刻的摄像头捕获的图像,返回值:True/False, Image/None)
"""
# 从摄像机获取视频
# 创建一个基于摄像头的视频读取流,给定基于第一个视频设备
capture = cv2.VideoCapture(0)

# 设置摄像头相关参数宽度和高度
success = capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1000)
if success:
    print('设置获取视频窗口的宽度已成功!')
success = capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 520)
if success:
    print('设置摄像头窗口的高度已成功!')

# 打印属性
size = (
    int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
    int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
)
print(size)
print(capture.get(cv2.CAP_PROP_FPS))       # 30.0

# 创建一个视频输出对象,设置视频中的帧率,每秒存储多少幅图像
fps = 20   # 每秒存储20张

# 构造了一个视频写入对象 cv2.VideoWriter_fourcc('I', '4', '2', '0') 这个函数调用是用于指定视频文件的编码格式。
# 在这里,'I', '4', '2', '0' 代表一个特定的编码类型,即I420编码,也被称为YUV420格式。这是一种常用的视频编码格式,其中Y代表亮度分量,U和V代表色度分量,采样方式为4:2:0
video_writer = cv2.VideoWriter('V1wsy.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)

# 构造10秒输出图像
num_frame = 10 * fps - 1

# 读取初始化摄像头窗口参数、图像帧
success, frame = capture.read()

# 遍历获取视频中的图像(读取当前时刻的摄像头捕获的图像,返回值:True/False, Image/None)
while success and num_frame > 0:
    video_writer.write(frame)
    success, frame = capture.read()
    num_frame -= 1
# cv2.waitKey(1) == -1 ;   cv2.waitKey(1)代表一帧一帧读取图像; 键盘不做关闭操作(-1)
# while success and cv2.waitKey(1) == -1:
#     cv2.imshow('frame', frame)
#     # 读取下一个摄像头窗口及捕获的帧图像
#     success, frame = capture.read()

# 释放资源
capture.release()
cv2.destroyAllWindows()

"""
    1.读取已有的视频资源
    2.设置摄像头捕获视频的窗口参数(高度、宽度)并打印属性
    3.设置截取视频变图像,将要保存的路径
    4.设置每秒存储多少张
    5.遍历视频流并一帧一帧获取图片并保存在之前创建的路径文件下
    6.循环结束,释放资源
"""
import os
import cv2

#  3.设置截取视频变图像,将要保存的路径
p = './video'
if not os.path.exists(p):
    os.makedirs(p)

# 创建视频流对象
capture = cv2.VideoCapture('V1wsy.avi')

# 设置摄像头捕获视频的窗口参数(高度、宽度)
success = capture.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
if success:
    print('设置获取视频窗口的宽度已成功!')
success = capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
if success:
    print('设置获取视频窗口的高度已成功!')

# 并打印属性,元组形式表达
size = (
    int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),
    int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
)
print(size)

# # 设置每秒存储多少张
# fps = 20

# 获取当前时刻摄像头捕获的图像,并返回值:T、F
success, frame = capture.read()
k = 0
# 遍历视频流并一帧一帧获取图片并保存在之前创建的路径文件下
while success and cv2.waitKey(60) == -1:
    if k % 10 == 0:
        cv2.imwrite('./video/img_{}.png'.format(k), frame)
    k += 1
    # 读取视频流下一帧
    success, frame = capture.read()

# 释放资源
capture.release()
cv2.destroyAllWindows()

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
具体操作步骤如下: 1. 在前端,使用`navigator.mediaDevices.getUserMedia`方法获取用户的摄像头和麦克风权限,并创建一个视频流。可以参考以下代码示例: ```javascript navigator.mediaDevices.getUserMedia({ video: true, audio: true }) .then(function(stream) { // 获取到视频流 // 进行后续操作 }) .catch(function(error) { // 处理错误 }); ``` 2. 在前端,创建一个WebSocket连接或使用其他通信协议与后端建立连接。可以使用`WebSocket`对象来实现WebSocket连接。以下是一个示例: ```javascript const socket = new WebSocket('ws://your-backend-url'); ``` 3. 在前端,通过RTCPeerConnection对象建立与后端的连接。可以使用`RTCPeerConnection`对象来创建连接。以下是一个示例: ```javascript const peerConnection = new RTCPeerConnection(); // 添加视频流到连接中 stream.getTracks().forEach(function(track) { peerConnection.addTrack(track, stream); }); // 将连接的ICE候选信息发送给后端 peerConnection.onicecandidate = function(event) { if (event.candidate) { socket.send(JSON.stringify({ type: 'candidate', candidate: event.candidate })); } }; // 创建SDP offer并发送给后端 peerConnection.createOffer() .then(function(offer) { return peerConnection.setLocalDescription(offer); }) .then(function() { socket.send(JSON.stringify({ type: 'offer', offer: peerConnection.localDescription })); }) .catch(function(error) { // 处理错误 }); ``` 4. 在后端,接收前端传输过来的视频流,并进行处理。具体操作取决于你的后端技术栈。例如,你可以使用WebSocket库来接收前端传来的数据。 5. 在后端,将处理后的视频流通过WebSocket或其他通信协议传回前端或其他需要的地方。 以上是一个基本操作流程,具体实现可能会根据你的需求和技术栈有所不同。你可以参考WebRTC相关文档和示例代码来更深入地了解和实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值