首页 > 其他分享 >OpenCV笔记:cv2.VideoCapture 完成视频的跳帧输出操作

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

时间:2023-08-14 16:33:05浏览次数:36  
标签:视频 get cv2 ret OpenCV VideoCapture 跳帧

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

来源:https://blog.csdn.net/weixin_44259720/article/details/127269955

作者 | Java Punk

仅用于学术分享,若侵权请联系删除

欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。

CV各大方向专栏与各个部署框架最全教程整理

【CV技术指南】CV全栈指导班、基础入门班、论文指导班 全面上线!!

一、核心方法

  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() 函数显然效率更高,更合适。

  1. 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 np
 
def 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()
            continue
        print("———————————————————— 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)
        pass
 
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    pass
 
if __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
...
  1. 效果展示

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

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

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

动图封面  

 

欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。

计算机视觉入门1v3辅导班

【技术文档】《从零搭建pytorch模型教程》122页PDF下载

QQ交流群:470899183。群内有大佬负责解答大家的日常学习、科研、代码问题。

其它文章

新认识了几位专注AI的大佬!

如何看待稚晖君的时间管理水平?

重新思考 视频超分辨 Transformers 中的对齐

RecursiveDet | 超越Sparse RCNN,完全端到端目标检测的新曙光

ICCV 2023 | ReDB:可靠、多样、类平衡的域自适应3D检测新方案!

大厂必考深度学习面试题及参考答案

ICCV2023 | 清华大学提出FLatten Transformer,兼顾低计算复杂度和高性能

ICCV'23 | MetaBEV:传感器故障如何解决?港大&诺亚新方案!

ICCV 2023 | 旷视研究院入选论文亮点解读

RCS-YOLO | 比YOLOv7精度提高了2.6%,推理速度提高了60%

国产130亿参数大模型免费商用!性能超Llama2-13B支持8k上下文,哈工大已用上

KDD 2023奖项出炉!港中文港科大等获最佳论文奖,GNN大牛Leskovec获创新奖

大连理工联合阿里达摩院发布HQTrack | 高精度视频多目标跟踪大模型

ICCV 2023 | Actformer:从单人到多人,迈向更加通用的3D人体动作生成

ReID专栏(二)多尺度设计与应用

ReID专栏(一) 任务与数据集概述

libtorch教程(三)简单模型搭建

libtorch教程(二)张量的常规操作

libtorch教程(一)开发环境搭建:VS+libtorch和Qt+libtorch

NeRF与三维重建专栏(三)nerf_pl源码部分解读与colmap、cuda算子使用

NeRF与三维重建专栏(二)NeRF原文解读与体渲染物理模型

NeRF与三维重建专栏(一)领域背景、难点与数据集介绍

异常检测专栏(三)传统的异常检测算法——上

异常检测专栏(二):评价指标及常用数据集

异常检测专栏(一)异常检测概述

BEV专栏(二)从BEVFormer看BEV流程(下篇)

BEV专栏(一)从BEVFormer深入探究BEV流程(上篇)

可见光遥感图像目标检测(三)文字场景检测之Arbitrary

可见光遥感目标检测(二)主要难点与研究方法概述

可见光遥感目标检测(一)任务概要介绍

TensorRT教程(三)TensorRT的安装教程

TensorRT教程(二)TensorRT进阶介绍

TensorRT教程(一)初次介绍TensorRT

AI最全资料汇总 | 基础入门、技术前沿、工业应用、部署框架、实战教程学习

计算机视觉入门1v3辅导班

计算机视觉交流群

聊聊计算机视觉入门

标签:视频,get,cv2,ret,OpenCV,VideoCapture,跳帧
From: https://www.cnblogs.com/wxkang/p/17629060.html

相关文章

  • 【opencv】传统图像识别:hog+svm实现图像识别详解
    图像识别技术是信息时代的一门重要的技术,其产生目的是为了让计算机代替人类去处理大量的物理信息。传统图像识别技术的过程分为信息的获取、预处理、特征抽取和选择、分类器设计和分类决策。本文也是从这四点出发进行行文,以期了解传统图像识别技术、掌握hog特征提取和svm分类器。......
  • java opencv在图片上绘制 矩形
    javaopencv在图片上绘制矩形 packagecom.vfsd.core;importorg.opencv.core.Core;importorg.opencv.core.CvType;importorg.opencv.core.Mat;importorg.opencv.core.Point;importorg.opencv.core.Rect;importorg.opencv.core.Scalar;importorg.opencv.highgu......
  • java opencv绘制工字型
    javaopencv绘制工字型 packagecom.vfsd.core;importjava.util.ArrayList;importjava.util.List;importorg.opencv.core.Core;importorg.opencv.core.CvType;importorg.opencv.core.Mat;importorg.opencv.core.Point;importorg.opencv.core.Rect;importorg......
  • OpenCV与CUDA简介
    因为算法的需要,正常的CPU算法速度不够需要进行加速,OpenCV中正好加入了GPU计算的模块,OpenCV中有两种GPU的加速方式,一种是通用标准的opencl,另一种是NVIDIA的cuda加速。opencl是苹果公司提出的一种通用标准,多种平台支持的标准。cuda是NVIDIA提出的并行计算平台,只有NVIDIA的显卡支......
  • opencv-python 车牌检测和识别
    首先利用级联分类器把车牌位置找到取出来,然后用ocr进行车牌识别。1 OCR之Tesseract安装Tesseract安装可以参考这个链接: https://blog.csdn.net/m0_53192838/article/details/127432761 写的比较详细,我在使用的时候有一个报错有点意思,记录一下: Tesseractocr识别报错:tesser......
  • opencv-python 人脸人眼检测
    人脸检测:在一张图像中判断是否存在人脸并找出人脸所在的位置。人脸识别:在人脸检测的基础上收集人脸数据集合进行处理保存信息,将输入人脸与保存的信息进行比对校验,得到是否为其中某个人脸。特征值:以某种特定规则对输入源进行处理得到具有唯一性质量化的值,在人脸识别中特征值的提......
  • opencv-python 视频前后景分离
    背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术。BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态部分,或者更一般而言,考虑到所观察场景的特征,可以将其视为背景的所有内容。前后景分离分为两步:第一步......
  • opencv-python 视频处理
    视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧,表示一秒钟显示30张图片。opencv中可以用 VideoCapture来捕获摄像头,用数字表示不同的设备,比如0,1。如果是视频文件,直接指定路径即可。VideoCapture类提供了初始化,打开视频文件或设备,视频帧捕获,视频文件或设备关闭,属性设......
  • C#实现PS曲线调整,OpenCV实现
    曲线原理 对于一个RGB图像, 可以对R, G, B通道进行独立的曲线调整,即,对三个通道分别使用三条曲线(Curve)。还可以再增加一条曲线对三个通道进行整体调整。 因此,对一个图像,可以用四条曲线调整。最终的结果,是四条曲线调整后合并产生的结果。比如:对红色通道定义一条曲线如下......
  • opencv-python图像金字塔
    图像金字塔是图像中多尺度表达的一种,主要用于图像特征检测,图像分割等领域,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔是同一图像不同分辨率的子图集合。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐渐降低,且来源于同一张原始图的图像集合。层......