python - 使用opencv区分损坏的帧和视频结尾
问题描述
我正在尝试在 python 中使用 openCV 读取视频文件。我正在使用一个简单的测试来检查是否有返回的帧:
vid = cv.VideoCapture(video_path)
ok, image = vid.read()
if not ok:
break
好吧,这似乎工作正常,直到我发现一些视频在读取视频中间的某些帧时有些困难。例如,我可以阅读相同的视频imageio
,所以我想有一种方法可以阅读它们。我使用以下方法计算了“损坏”帧的数量:
for video_path in videos_list:
vid = cv.VideoCapture(video_path)
fr = 1
counter = 0
max_corrupted_frames = 20
while True:
ok, image = vid.read()
if not ok:
counter += 1
else:
if counter:
print('{} consecutive frames were not able to be read before frame {} in video {}'.format(
counter, fr, video_path))
counter = 0
if counter > max_corrupted_frames:
break
fr += 1
我的情况在 1 到 4 之间。使用更大的阈值,我可以确定视频是否已经结束,或者我只是在读取帧时遇到了一些问题,但它似乎很容易出错。
因此,出现了几个问题:
- 有没有其他方法可以确定视频是否已使用 openCV 结束(由于某种原因使用的方法
cap.isOpened()
对我不起作用)? - 为什么openCV在我的情况下无法读取这些帧但
imageio
没有?框架看起来很正常(使用 提取时imageio
)。
我在 Ubuntu 16.04 中使用 openCV 3.4.1 和 python 3.5.2,如果这有什么不同的话。
解决方案
推荐阅读
- excel - 如何比较 Excel 中不同列中的两个日期以查找一个日期早于另一个日期的行?
- html - 导航栏子菜单未与菜单项对齐
- ecmascript-6 - Vuex:提交一个对象,然后通过 ID 找到它
- python - pymysql事务保存一个插入查询但忽略两个更新查询而不引发错误
- java - 泛型中的编译类和运行时类
- auth0 - 未从 Auth0.authorize() 获取刷新令牌 - PKCE
- javascript - 检查公会 ID 的数组列表
- cmake - Cmake:如何使用 cmake 将 rpath 设置为 ${ORIGIN}
- spring-boot - 即使在 Spring Boot 中允许所有请求,如何修复 HTTP 401 错误?
- performance - 我在 Openshift webconsole 中看不到完整的数据库存储类列表