python使用opencv提取视频中的每一帧、最后一帧,并存储成图片

提取视频每一帧存储图片

最近在搞视频检测问题,在用到将视频分帧保存为图片时,图片可以保存,但是会出现(-215:Assertion failed) !_img.empty() in function 'cv::imwrite'问题而不能正常运行,在检查代码、检查路径等措施均无果后,了解了视频分帧的原理后,才解决了问题,原因是缺少分帧结束的判断条件,在写入前,加上:

py 复制代码
if frame is None;
           break
else:
py 复制代码
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)代码前一行加入判断条件,判断分帧结束后,停止写入即可。加入判断条件:

py 复制代码
if frame is None:
            break
else:

就可以正确导入分帧后的图片了

正确的完整代码如下:

py 复制代码
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

正确输出分帧后的图片,并保存在文件夹中:

提取视频最后一帧存储图片

完整代码:

python 复制代码
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循环来遍历所有帧,而是将所有帧读取到一个列表中。这样可以确保我们正确地获取了最后一帧,而不会错过任何帧。

如果仍然无法提取最后一帧,请确保视频文件存在并且可读,并尝试使用其他视频文件进行测试。

相关推荐
小oo呆14 分钟前
【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核
python·jupyter·conda
2201_7549184144 分钟前
OpenCV 图像透视变换详解
人工智能·opencv·计算机视觉
天上路人1 小时前
AI神经网络降噪算法在语音通话产品中的应用优势与前景分析
深度学习·神经网络·算法·硬件架构·音视频·实时音视频
小白学大数据1 小时前
Scrapy框架下地图爬虫的进度监控与优化策略
开发语言·爬虫·python·scrapy·数据分析
浊酒南街1 小时前
TensorFlow之微分求导
人工智能·python·tensorflow
立秋67891 小时前
用Python绘制梦幻星空
开发语言·python·pygame
alpszero1 小时前
YOLO11解决方案之对象裁剪探索
人工智能·python·计算机视觉·yolo11
视频砖家2 小时前
如何设置FFmpeg实现对高分辨率视频进行转码
ffmpeg·音视频·视频编解码·视频转码
白云千载尽2 小时前
相机、雷达标定工具,以及雷达自动标定的思路
python·自动驾驶·ros
咕噜咕噜啦啦2 小时前
python爬虫实战训练
爬虫·python