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

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

相关推荐
捉鸭子3 分钟前
某音a_bogus vmp逆向
爬虫·python·web安全·node.js·js
曲幽14 分钟前
FastAPI 生产环境静态文件完全指南:从 /favicon.ico 404 到 HSTS 混合内容,一次全根治
python·fastapi·web·static·media·404·hsts·favicon·url_for
Dontla15 分钟前
Python asyncpg库介绍(基于Python asyncio的PostgreSQL数据库驱动)连接池、SQLAlchemy
数据库·python·postgresql
zh15702324 分钟前
如何编写动态SQL存储过程_使用sp_executesql执行灵活查询
jvm·数据库·python
2401_8242226928 分钟前
SQL报表统计数据量巨大_分批统计策略
jvm·数据库·python
X566131 分钟前
mysql如何处理连接数过多报错_调整max_connections参数
jvm·数据库·python
m0_609160491 小时前
MongoDB中什么是Hashed Shard Key的哈希冲突_哈希函数的分布均匀性分析
jvm·数据库·python
Ulyanov1 小时前
《现代 Python 桌面应用架构实战:PySide6 + QML 从入门到工程化》 开发环境搭建与工具链极简主义 —— 拒绝臃肿,构建工业级基座
开发语言·python·qt·ui·架构·系统仿真
wuxinyan1231 小时前
大模型学习之路03:提示工程从入门到精通(第三篇)
人工智能·python·学习
如何原谅奋力过但无声1 小时前
【灵神高频面试题合集01-03】相向双指针、滑动窗口
数据结构·python·算法·leetcode