注册 登录
编程论坛 Python论坛

python 拆分最后一帧时,总会出错,不知如何修改?

yuma 发布于 2022-05-01 20:07, 2158 次点击
程序代码:
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)
8 回复
#2
古1232022-05-01 23:28
读取视频最后一帧的时候,success为true,因此while循环还会继续运行一次,但此时已经得不到视频帧了,此时success,image为false,None,触发cv2.imencode中的错误。
#3
yuma2022-05-02 11:13
回复 2楼 古123
那要如何修改代码呢?
#4
古1232022-05-02 12:19
循环里的读取后面加一个success判断
#5
yuma2022-05-03 18:58
加个判断,会损失一帧,不值得。
#6
古1232022-05-04 09:04
回复 5楼 yuma
我的意思是在read()之后加个判断,并不会造成损失。
因为出错的并不是视频最后一帧,而是当循环运行到最后一帧时,success为True,会继续循环一次,此时读取的是视频的最后一帧+1帧,是超出视频长度没有数据的,所以此时read()返回时为false,None,循环终止。
#7
古1232022-05-04 19:59
程序代码:
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)
#8
yuma2022-05-04 21:44
回复 7楼 古123
非常感谢版本的修改。

不过很奇怪,网上的python将视频切分成帧的代码,都会少一帧。将帧合并成视频,再切分成帧,帧会继续少一帧。。。。
#9
yuma2022-05-17 08:40
请看新开的帖。

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

1