赞
踩
最近在搞视频检测问题,在用到将视频分帧保存为图片时,图片可以保存,但是会出现(-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
问题而不能正常运行,在检查代码、检查路径等措施均无果后,了解了视频分帧的原理后,才解决了问题,原因是缺少分帧结束的判断条件,在写入前,加上:
if frame is None;
break
else:
import cv2 # 读取视频并分帧为图片 video = cv2.VideoCapture("python/video/video2.mp4") save_path = "python/img2" index = 0 if video.isOpened(): f = int(video.get(cv2.CAP_PROP_FPS)) # 读取视频帧率 print("The video's fps is ", f) # 显示视频帧率 rval, frame = video.read() # 读取视频帧 else: rval = False while rval: print(index) rval,frame = video.read() cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame) index += 1
出现报错的原因很简单,在使用rval,frame
读取视频的帧时,帧图片保存在frame
对应的索引里。而在写入图片时,没有加入判断条件,当视频被分帧结束后,cv2.imread函数
还在将空白信息写入文件夹,所以会出现报错,因此,只要在 cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame)
代码前一行加入判断条件,判断分帧结束后,停止写入即可。加入判断条件:
if frame is None:
break
else:
就可以正确导入分帧后的图片了
import cv2 # 读取视频并分帧为图片 video = cv2.VideoCapture("python/video/video2.mp4") save_path = "python/img2" index = 0 if video.isOpened(): f = int(video.get(cv2.CAP_PROP_FPS)) # 读取视频帧率 print("The video's fps is ", f) # 显示视频帧率 rval, frame = video.read() # 读取视频帧 else: rval = False while rval: print(index) rval,frame = video.read() if frame is None: break else: cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame) index += 1
正确输出分帧后的图片,并保存在文件夹中:
完整代码:
import cv2 # 打开视频文件 cap = cv2.VideoCapture('python/video/video2.mp4') # 读取视频文件中的所有帧 frames = [] while cap.isOpened(): ret, frame = cap.read() if not ret: break frames.append(frame) # 检查是否有帧可用 if len(frames) > 0: # 提取最后一帧并将其保存为图像 last_frame = frames[-1] cv2.imwrite('python/img/last.jpg', last_frame) print("last picture over") else: print("错误:无法提取任何帧") # 释放视频文件句柄 cap.release()
在这个代码中,我们首先读取视频文件中的所有帧,并将它们存储在一个列表中。然后,我们检查列表中是否有任何帧可用。如果有,则提取最后一帧并将其保存为图像。否则,我们打印错误消息。
这里要注意,在这个代码中,我们没有使用while循环来遍历所有帧,而是将所有帧读取到一个列表中。这样可以确保我们正确地获取了最后一帧,而不会错过任何帧。
如果仍然无法提取最后一帧,请确保视频文件存在并且可读,并尝试使用其他视频文件进行测试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。