热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenCV笔记:cv2.VideoCapture完成视频的跳帧输出操作

背景我开始关注这个问题,是在使用PaddleOCROpenCV进行视频文字识别的时候,因为OpenCV需要循环读取视频的每一帧进行解析,这


背景

        我开始关注这个问题,是在使用 PaddleOCR + OpenCV 进行视频文字识别的时候,因为OpenCV 需要循环读取视频的每一帧进行解析,这就导致视频播放特别卡顿。由于视频中相邻帧的内容是一样的,重复识别也没有意义,所以我就在考虑:有没有办法跳帧输出?

        咱们能想到的所有问题,都已经被设计师考虑过了,需要用到下面两个函数:


  • cv2.VideoCapture.grab()
  • cv2.VideoCapture.get()

        你可能需要用到的文章:


  • 关于:Python基础,爬虫,机器学习,常见异常和面试【篇】(专题汇总)



正文


一、核心方法


1. cv2.VideoCapture.grab() 函数

# 视屏获取,videoPath为视频的路径
cap = cv2.VideoCapture(videoPath)
# 往下读一帧ret,并返回图片信息frame
ret, frame = cap.read()
# 只往下读一帧ret
ret = cap.grad()

  • read()函数,输出的是两个参数:第一个参数 ret 为 True 或 False,代表有没有读取下一到帧图片;第二个参数 frame,表示读到的一帧图片的信息,OCR就是对 frame 进行识别处理。
  •  grad()函数,输出的是一个参数:ret 为 True 或 False,代表有没有读取下一到帧图片。

        从上面的对比可以看出来,grab() 仅仅是用来指向下一帧,并没有返回多余的图片信息,当不需要解析图片的时候,grab() 函数显然效率更高,更合适。


2. cv2.VideoCapture.get() 函数

        cv2.VideoCapture.get(n) ,n 的范围是 0~7,这个方法可以帮助我们获取视频的属性。其中我们用到的就是 get(1) - 获取视频当前帧,可以方便我们做跳帧操作。

        总结了一下:


方法含义
cv2.VideoCapture.get(0)视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1)当前帧,基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2)视频文件的相对位置(播放):0 = 电影开始,1 = 影片的结尾。
cv2.VideoCapture.get(3)在视频流的帧的宽度
cv2.VideoCapture.get(4)在视频流的帧的高度
cv2.VideoCapture.get(5)帧率
cv2.VideoCapture.get(6)编解码的4字 - 字符代码
cv2.VideoCapture.get(7)视频文件中的帧数

        除此之外,还可以用另外几个方法获取视频属性:


  • cv2.VideoCapture.get(cv2.CAP_PROP_FPS):获取帧率;
  • cv2.VideoCapture.get(cv2.CAP_PROP_FRAME_COUNT):获取视频时长,单位- 秒。



二、实战练习


1. 代码展示

        我这里设置的是每间隔10帧输出一次,大家可以根据自己的需要设置,代码如下:


  • get(1) 获取当前帧率跳帧

# _*_coding:utf-8_*_
# 作者: Java Punk
# 时间: 2022-10-09 14:49:45
# 功能: 场景文字识别import cv2
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
import numpy as npdef ch_match(videoPath):ocr = PaddleOCR(use_angle_cls=True, lang="ch")# 视屏获取cap = cv2.VideoCapture(videoPath)# 判断是否正常打开ret = cap.isOpened()# 循环读取视频帧while ret:# 获取当前视频帧位置now_fps = cap.get(1)# 设置每 10 帧输出一次if (now_fps % 10 != 0):# 跳帧ret = cap.grab()continueprint("———————————————————— read fps", now_fps)# 是否截取到图片;图片信息ret, frame = cap.read()# 对返回的图片进行文字识别result = ocr.ocr(frame, cls=True, rec=True)boxes = [line[0] for line in result]txts = [line[1][0] for line in result]scores = [line[1][1] for line in result]# simsun.ttc 是一款很常见、实用的电脑字体,这里作为识别的模板im_show = draw_ocr(frame, boxes, txts, scores, font_path='../fonts/SIMSUN.TTC')im_show = Image.fromarray(im_show)tp_img = np.asarray(im_show)cv2.imshow('tp_img', tp_img)cv2.waitKey(1)passcv2.waitKey(0)cv2.destroyAllWindows()passif __name__ == '__main__':print("———————————————————— start ————————————————————\n")# 图片路径自己设置,下面是我本地的路径,记得替换!!!ch_match('../img/yz_words/vlog_zxyw_02.mp4')print("———————————————————— end ————————————————————\n")

  • 改动一下:记录帧率进行跳帧

       实际上每一次视频的 while 循环,都是往下走了一帧,所以我们也可以取巧的利用 i++ 进行跳帧,此时 i = cv2.VideoCapture.get(1)。

...# 视频帧计数timeC = 0 # 循环读取视频帧while ret:timeC = timeC + 1# 每隔 10 帧进行操作if (timeC % 10 != 0): ret = cap.grab()continue...

2. 效果展示

        感兴趣的小伙伴可以把跳帧部分的代码去掉看看效果,对比一下,说下我用公司电脑测试的结果:


  • 执行跳帧前:原视频时长7s,最后 cv2.imshow() 时长 2min;
  • 执行跳帧后:原视频时长7s,最后 cv2.imshow() 时长 20s;

下面是“执行跳帧后”的效果(由于上传大小限制,无奈只能降低画质):



 


推荐阅读
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析
    池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 在该项目中,参与者需结合历史使用模式和天气数据,以预测华盛顿特区自行车共享系统的租赁需求。数据分析部分首先涉及数据的收集,包括用户骑行记录和气象信息,为后续模型构建提供基础。通过深入的数据预处理和特征工程,确保数据质量和模型准确性,最终实现对自行车租赁需求的有效预测。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 本文介绍了在 Android 平台上的图片上传工具类优化方案,重点讨论了如何通过设置 `MultipartEntity` 来实现图片的高效上传。具体实现中,通过自定义 `UserUploadServiceImpl` 类,详细展示了如何构建和发送包含图片数据的 HTTP 请求。此外,还探讨了如何处理上传过程中的常见问题,如网络异常和文件格式验证,以确保上传的稳定性和可靠性。 ... [详细]
  • 在前一篇文章中,我们介绍了如何使用Requests库发送GET请求。本文将深入探讨如何通过Requests库发送POST请求,包括参数格式、请求封装等关键技巧,并通过“历史上的今天”API实例进行详细说明。 ... [详细]
  • 在Matlab中,我尝试构建了一个神经网络模型,用于预测函数 y = x^2。为此,我设计并实现了一个拟合神经网络,并对其进行了详细的仿真和验证。通过调整网络结构和参数,成功实现了对目标函数的准确估计。此外,还对模型的性能进行了全面评估,确保其在不同输入条件下的稳定性和可靠性。 ... [详细]
  • 利用Java开发百度图片爬虫,实现高效下载功能
    为了满足大量图像素材的需求以支持机器学习项目,本文介绍了一种基于Java语言开发的百度图片爬虫工具,该工具能够高效地抓取并下载百度图片中的资源。文章首先展示了爬虫运行的效果图,并详细阐述了其工作原理和技术实现路径,重点解析了如何通过分析百度图片的网页结构来实现精准抓取。此外,还讨论了在实际应用中可能遇到的问题及解决方案。 ... [详细]
  • Matplotlib在数据科学中的可视化应用与技术解析
    Matplotlib和数据可视化 数据的处理、分析和可视化已经成为Python近年来最为重要的应用领域之一,其中数据的可视化指的是将数据呈现为漂亮的统计图表ÿ ... [详细]
  • 使用cpphttplib构建HTTP服务器以处理带有查询参数的URL请求 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
author-avatar
手机用户2602881417
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有