opencv读取视频,可以通过属性(CAP_PROP_FRAME_COUNT)获取视频的总帧数,但是有些视频通过该属性获取的帧数和实际遍历整个视频的帧数不一样。

import cv2 as cv
video = "1.avi"
cap = cv.VideoCapture(video)
frames = cap.get(cv.CAP_PROP_FRAME_COUNT)  # 通过属性获取帧数
count = 0  # 用于计算视频的实际帧数
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    count += 1
cap.release()
print(frames)
print(count)

输出为:
528
482

出现这种原因是,视频中包含了损坏的或不能被opencv解码的帧,opencv就会跳过这些帧,因此造成通过属性(CAP_PROP_FRAME_COUNT)和实际读取的帧数不一样。所以,如果想要获取能够读取的帧数,首先遍历一遍视频。
如果有哪位大神有更好的解析,希望指出来,大家共同进步!

本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级、中级、高级知识。 2. OpenCV 中摄像头捕获与视频处理 OpenCV 除了应用在图像处理领域外,还会应用到视频处理领域,接下来我们就将学习到,如何通过Python OpenCV 对摄像头捕获或者视频文件进行处理。 视频文件将从三个方向入手,分别是读取文件,显示视频,保存视频。 本文将为你核心解决以下2个函cv2.VideoCapture 与 cv2.VideoWrite,基于这2个函,会衍生出其它 // 获取视频 long totalFrameNumber = cap.get(CV_CAP_PROP_FRAME_COUNT); cout &lt;&lt; totalFrameNumber &lt;&lt; endl; 中,VS报了   未定义标识符 "CV_CAP_PROP_FRAME_COUNT"  的错误 新人(指我自己)可能百度这个错误也百度不... void QuickDemo::norm_demo(Mat &image) { Mat dst; image.convertTo(dst,CV_32F);//把类型转化为float类型 std::cout << image.type() &lt... opencv4中未定义标识符CV_CAP_PROP_FPS;CV_CAP_PROP_FRAME_COUNT;CV_CAP_PROP_POS_FRAMES问题 这次的问题是想要读取一段视频,但是在编写代码的过程中出现了未定义表示的问题,报错结果如下:、 经过多方查询,发现是由于opencv版本更新过快,opencv4中有许多标识符发生了更改,对于下列这三个标识符做出如下更改: CV_CAP_PROP_FPS -> CAP_PROP_FPS CV_CAP_PROP_FRAME_COUNT -&