| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1983 人关注过本帖
标题:python 拆分最后一帧时,总会出错,不知如何修改?
只看楼主 加入收藏
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1931
专家分:2992
注 册:2009-12-22
结帖率:89.13%
收藏
已结贴  问题点数:20 回复次数:8 
python 拆分最后一帧时,总会出错,不知如何修改?
程序代码:
import cv2
import os
   
def video2frame(videos_path,frames_save_path,time_interval):

  '''
  :param videos_path: 视频的存放路径
  :param frames_save_path: 视频切分成帧之后图片的保存路径
  :param time_interval: 保存间隔
  :return:
  '''
  vidcap = cv2.VideoCapture(videos_path)
  success, image = vidcap.read()
  count = 0
  while success:
    success, image = vidcap.read()
    count += 1
    if count % time_interval == 0:
      cv2.imencode('.jpg', image)[1].tofile(frames_save_path + "/frame%d.jpg" % count)
    # if count == 20:
    #   break
  print(count)

if __name__ == '__main__':
   videos_path = 'E:/1.mp4'
   frames_save_path = 'E:/图片'
   time_interval = 1  #几帧保存一次
isExists = os.path.exists(frames_save_path)
if not isExists:
  os.makedirs(frames_save_path)
  video2frame(videos_path, frames_save_path, time_interval)
搜索更多相关主题的帖子: count python  保存 if 
2022-05-01 20:07
古123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:219
专家分:1098
注 册:2017-2-5
收藏
得分:20 
读取视频最后一帧的时候,success为true,因此while循环还会继续运行一次,但此时已经得不到视频帧了,此时success,image为false,None,触发cv2.imencode中的错误。
2022-05-01 23:28
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1931
专家分:2992
注 册:2009-12-22
收藏
得分:0 
回复 2楼 古123
那要如何修改代码呢?

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2022-05-02 11:13
古123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:219
专家分:1098
注 册:2017-2-5
收藏
得分:0 
循环里的读取后面加一个success判断
2022-05-02 12:19
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1931
专家分:2992
注 册:2009-12-22
收藏
得分:0 
加个判断,会损失一帧,不值得。

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2022-05-03 18:58
古123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:219
专家分:1098
注 册:2017-2-5
收藏
得分:0 
回复 5楼 yuma
我的意思是在read()之后加个判断,并不会造成损失。
因为出错的并不是视频最后一帧,而是当循环运行到最后一帧时,success为True,会继续循环一次,此时读取的是视频的最后一帧+1帧,是超出视频长度没有数据的,所以此时read()返回时为false,None,循环终止。
2022-05-04 09:04
古123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:219
专家分:1098
注 册:2017-2-5
收藏
得分:0 
程序代码:
import cv2
import os
   
def video2frame(videos_path,frames_save_path,time_interval):

  '''
  :param videos_path: 视频的存放路径
  :param frames_save_path: 视频切分成帧之后图片的保存路径
  :param time_interval: 保存间隔
  :return:
  '''
  vidcap = cv2.VideoCapture(videos_path)
  success, image = vidcap.read()
  count = 0
  while success:
    success, image = vidcap.read()
    if not success:
        break
    count += 1
    if count % time_interval == 0:
      cv2.imencode('.jpg', image)[1].tofile(frames_save_path + "/frame%d.jpg" % count)
    # if count == 20:
    #   break
  print(count)

if __name__ == '__main__':
   videos_path = 'E:/1.mp4'
   frames_save_path = 'E:/图片'
   time_interval = 1  #几帧保存一次
isExists = os.path.exists(frames_save_path)
if not isExists:
  os.makedirs(frames_save_path)
  video2frame(videos_path, frames_save_path, time_interval)
2022-05-04 19:59
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1931
专家分:2992
注 册:2009-12-22
收藏
得分:0 
回复 7楼 古123
非常感谢版本的修改。

不过很奇怪,网上的python将视频切分成帧的代码,都会少一帧。将帧合并成视频,再切分成帧,帧会继续少一帧。。。。

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2022-05-04 21:44
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1931
专家分:2992
注 册:2009-12-22
收藏
得分:0 
请看新开的帖。

[此贴子已经被作者于2022-5-17 17:35编辑过]


心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2022-05-17 08:40
快速回复:python 拆分最后一帧时,总会出错,不知如何修改?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026476 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved