当前位置: 首页 > backend >正文

OpenCV-循环读取视频帧,对每一帧进行处理

原型代码

  • 内存模型:
    • 核心变量:frame,Numpy ndarray,每次会被覆盖,大小保持恒定
import cv2video_path = 'your_video.mp4'cap = cv2.VideoCapture(video_path)if not cap.isOpened():print("Can't open Video")exit()while True:ret, frame = cap.read()if not ret:break# # 在这里对每一帧进行处理# cv2.imshow('Frame', frame)if cv2.waitKey(25) & OxFF == ord('q'): # 25ms内,有按钮按下,且按下的按钮为qbreakcap.release()
cv2.destroyAllWindows()

函数封装

对其进行一个函数封装,传入一个process函数,其对每个frame进行统一的处理,然后输出一个处理后的视频。

import cv2 
import numpy as np # 用于帧的类型提示 
from typing import Callable, Optional # 用于类型提示def process_video_frames( video_file_path: str, frame_processor: Callable[[np.ndarray], np.ndarray], output_path=Optional[str] = None ) -> None:cap = cv2.VideoCaputer(video_path)if not cap.isOpened():print("Can't open Video")exit()# [[OpenCV-获取视频属性]]frame_width, frame_height, fps = get_video_properties(video_capture: cv2.VideoCapture)video_writer = Noneif output_path:fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 定义视频编码器video_writer = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))if not video_writer.isOpened():print("Init Video Writer Failed.Processed Video will not be saved")video_writer = Nonewhile True:ret, frame = cap.read()if not ret:break# # 在这里对使用process函数对每一帧进行进行处理processed_frame = frame_processor(current_frame)# 如果输出视频写入器已成功初始化,则写入处理后的帧if video_writer:# 确保处理后的帧尺寸与原始视频一致,否则可能无法写入if processed_frame.shape[:2] != (frame_height, frame_width):print(f"警告: 处理后的帧尺寸 {processed_frame.shape[:2]} 与原始视频尺寸 "f"{(frame_height, frame_width)} 不匹配。可能导致写入问题。")video_writer.write(processed_frame)	cap.release()if video_writer:video_writer.release()cv2.destroyAllWindows()
http://www.xdnf.cn/news/17852.html

相关文章:

  • Qt——常用Widget(控件)
  • 【swift】SwiftUI动画卡顿全解:GeometryReader滥用检测与Canvas绘制替代方案
  • 有红帽认证证书可以0元置换华为openEuler-HCIA/HCIP认证
  • 醋酸镧:看不见的科技助力
  • 介绍TCP的拥塞控制
  • Oracle EBS R12.2 adlnkoh.sh执行报错
  • windows系统创建FTP服务
  • ar / let / const 以及不同写法的区别一
  • Vue 侦听器(watch 与 watchEffect)全解析2
  • [Chat-LangChain] 前端用户界面 | 核心交互组件 | 会话流管理
  • NY232NY236美光固态闪存NY240NY241
  • 责任链模式C++
  • 当云手机出现卡顿怎么办?
  • 第五天~提取Arxml中描述信息New_CanCluster--Expert
  • SpatialVLM和SpatialRGPT论文解读
  • 【进阶】Java技术栈八股文学习资料整理
  • Python 常用库速查手册
  • 如何使用亚马逊云科技EC2服务部署语音转写系统
  • 【算法专题训练】13、回文字符串
  • webrtc编译arm/arm64
  • STM32 - Embedded IDE - GCC - 显著减少固件的体积
  • 鸿蒙任务调度机制深度解析:优先级、时间片、多核与分布式的流畅秘密
  • 【开发语言】Groovy语言:Java生态中的动态力量
  • 【Cuda 编程思想】LinearQaunt-分块量化矩阵乘法计算过程
  • 从零到一:发布你的第一个 npm 开源库(2025 终极指南)
  • Shortest Routes II(Floyd最短路)
  • 数据结构初阶(15)排序算法—交换排序(快速排序)(动图演示)
  • Docker 缓存优化:通过 cpolar 内网穿透服务远程管理 Redis
  • C语言零基础第17讲:数据在内存中的存储
  • 新手向:Python函数定义与参数传递(位置参数、关键字参数、默认参数)