Python opencv cv2.cv.CV_CAP_PROP_FRAME_COUNT得到错误的数字


import os
import cv2
path='/home/nlpr4/video-data/UCF-101/GolfSwing/v_GolfSwing_g24_c06.avi'
cap=cv2.VideoCapture(path)
video_length=int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
success=True
count=0
while success:
    success,image=cap.read()
    if success==False:
        break
    count=count+1
print video_length,count
输出:

149 
146

为什么两个数字不同?怎么了?

CAP_PROP_FRAME_COUNT的get()永远不应该是准确的!如果你检查了openv的源代码。你可以找到这个:

int64_t CvCapture_FFMPEG::get_total_frames() const
{
    int64_t nbf = ic->streams[video_stream]->nb_frames;
    if (nbf == 0)
    {
        nbf = (int64_t)floor(get_duration_sec() * get_fps() + 0.5);
    }
    return nbf;
}

这意味着它将首先查看nb_frames的流头,您可以使用ffprobe检查。如果没有这样的字段,那么就没有比直接解码视频更好的方法来获取帧数了。opencv用get_duration_sec() * get_fps() + 0.5做了一个粗略的估计,这肯定不意味着精度。

因此,为了获得正确的帧数,您必须解码并读取整个流,或者您必须要求视频生成器生成具有nb_frames字段的正确流头。

CV_CAP_PROP_FRAME_COUNT给出了来自视频标题的'帧数'属性。另一个数字基本上是"我可以从这个视频文件读取多少帧?"。

如果视频包含无法读取/解码的帧(例如,由于损坏),OpenCV跳过这些帧(在尝试读取它们之后)并给你下一个有效帧。因此,两个数字之间的差值就是无法读取的帧数。

同样,如果你的视频头被损坏和/或不能被OpenCV使用的底层编解码器解析,那么这些数字也可能不同。

试试下面的代码:

#!/usr/bin/env python
import numpy as np
import cv2
video = "../videos/sample.avi"
video_capture = cv2.VideoCapture(video)
video_length = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))
count = 0
while(True):
        # Capture frame-by-frame
        ret, frame = video_capture.read()
        if not ret:
            break
        count += 1
print video_length, count
# When everything done, release the capture
video_capture.release()
cv2.destroyAllWindows()

在我的机器上显示:

$ ./openstack_video_frames.py 
1232 1232

相关内容

  • 没有找到相关文章

最新更新