株洲网站开发,汉口网站建设 优帮云,唐山 建设工程信息网站,王也头像男提取视频每一帧存储图片
最近在搞视频检测问题#xff0c;在用到将视频分帧保存为图片时#xff0c;图片可以保存#xff0c;但是会出现(-215:Assertion failed) !_img.empty() in function cv::imwrite问题而不能正常运行#xff0c;在检查代码、检查路径等措施均无果后在用到将视频分帧保存为图片时图片可以保存但是会出现(-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 videos 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 videos fps is , f) # 显示视频帧率rval, frame video.read() # 读取视频帧
else:rval Falsewhile rval:print(index)rval,frame video.read()if frame is None:breakelse: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:breakframes.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循环来遍历所有帧而是将所有帧读取到一个列表中。这样可以确保我们正确地获取了最后一帧而不会错过任何帧。 如果仍然无法提取最后一帧请确保视频文件存在并且可读并尝试使用其他视频文件进行测试。