Opencv读取视频获取的总帧数比实际少很多问题

Opencv读取视频获取的总帧数比实际少很多问题

问题描述

​ 在读取一段从摄像头拉流保存下来的8分钟视频,opencv(opencv4.4)获取到的总帧数只有7帧,循环读取解码视频,获取到的帧数也只有7帧,明显此时存在问题

产生问题背景

​ opencv读取拉流视频,可能不同的解码器,会导致在调用opencv自身的解码器无法对视频进行解码,导致一部分帧解码失败,导致实际看到的帧数和读取到的帧数相差甚远

opencv视频解码code
import cv2
video_file = "Camera.mp4"
capture = cv2.VideoCapture(video_file)      #读取视频或摄像               

# Get Video info : resolution, fps, frame count
width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))         #宽
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))       #高
fps = int(capture.get(cv2.CAP_PROP_FPS))                   #帧率
frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))   #总帧数
print("video fps: %d, frame_count: %d,width: %d,height: %d" % (fps, frame_count,width,height))
frameNr = 0
while True:
    ret, frame = capture.read() #opencv 读取到的视频帧默认是bgr
    if not ret:
        break
    # frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #图片bgr转换成rgb
    cv2.imshow('demo', frame)
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break
    frameNr = frameNr + 1
    
    
# 关闭视频文件
capture.release() 
cv2.destroyAllWindows()

video fps: 25, frame_count: 6,width: 1920,height: 1080

解决办法

方法一:对视频通过ffmpeg解码
ffmpeg -i Camera_0420230221104457_20230221111458Centralized Storage.mp4 out.mp4
ffmpeg相关教程
方法二:使用imageio-ffmpeg读取视频,对视频进行解码
安装ffmpeg解码器
apt-get install ffmpeg

Centos安装ffmpeg

安装imageio-ffmpeg 包
pip install imageio-ffmpeg -i https://pypi.douban.com/simple
imageio视频解码code
import cv2
import numpy as np
import imageio

#pip install imageio-ffmpeg -i https://pypi.douban.com/simple

video_file = "Camera.mp4"
cap = imageio.get_reader(video_file, 'ffmpeg')   #读取视频或摄像   
fps = cap.get_meta_data()['fps']                 #帧率
(width,height) = cap.get_meta_data()['size']     #size,(宽,高)     
duration = cap.get_meta_data()['duration']       #时长
# frame_count = cap.count_frames()                #总帧率 可以通过时长x帧率获取(存在异常AttributeError: 'Reader' object has no attribute 'count_frames')
frame_count = int(fps*duration)                   #总帧率 可以通过时长x帧率获取
print("video fps: %d, frame_count: %d,width: %d,height: %d" % (fps, frame_count,width,height))

for frameNr,frame in enumerate(cap): #imageio 读取到的视频帧默认是rgb
    #image的类型是imageio.core.util.Image可用使用的下面这一注释行转换为arrary
    #image = skimage.img_as_float(im).astype(np.float32)
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    cv2.imshow('demo', frame_rgb)
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break
    frameNr = frameNr + 1
     
# 关闭视频文件
cap.close()

video fps: 25, frame_count: 10814,width: 1920,height: 1080

Python-opencv是一个使用Python进行图像处理和计算机视觉的。运动方向判断是指通过分析视频中物体或者人的运动轨迹来判断其运动的方向。运动方向判断可以在很多应用中使用,比如行人检测、车辆跟踪等。 在这个.rar文件中,你可以找到一些使用Python-opencv处理视频中运动方向判断的示例代码和一些视频样本。通过运行这些示例代码,你可以学习如何使用Python-opencv来实现运动方向判断的功能。 Python-opencv中处理视频的基本步骤包括读取视频获取每一帧图像、预处理图像、计算运动方向等。首先,使用cv2.VideoCapture函数读取视频文件。然后,使用while循环遍历每一帧图像,并对每一帧进行预处理,比如转换成灰度图像、平滑处理等。接下来,使用cv2.absdiff函数计算当前帧和上一帧之间的差别,通过阈值化处理得到前景图像。然后,可以使用cv2.findContours函数找出前景图像中的轮廓,进一步筛选出运动物体的轮廓。最后,计算轮廓的中心点坐标并与上一帧的中心点坐标进行比较,从而判断运动方向。 通过这些步骤,我们可以实现对视频中运动方向的判断。当然,这只是一个简单的示例,实际应用中可能需要更复杂的算法和处理步骤。但是通过学习这个.rar文件中的代码和示例,你可以了解到使用Python-opencv处理视频中运动方向判断的基本方法,同时也可以根据自己的需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值