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

文章讲述了在处理视频检测时,遇到cv2.imwrite报错的问题,原因在于没有在分帧后判断是否还有帧。作者提供了修改后的代码,加入了分帧结束的判断条件,确保了正确保存每一帧图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提取视频每一帧存储图片

最近在搞视频检测问题,在用到将视频分帧保存为图片时,图片可以保存,但是会出现(-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循环来遍历所有帧,而是将所有帧读取到一个列表中。这样可以确保我们正确地获取了最后一帧,而不会错过任何帧。

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

### 使用 PythonOpenCV 实现将视频的每一帧保存图像文件 以下是基于所提供的引用以及专业知识构建的具体方法: 为了完成这一任务,需要加载目标视频文件,并通过循环读取其每一帧数据。随后,利用 `cv2.imwrite()` 方法逐一存储这些帧到指定路径下的 `.jpg` 文件中。 #### 安装依赖库 确保安装了所需的库: ```bash pip install opencv-python-headless ``` #### 示例代码实现 以下是一个完整的代码示例来展示如何提取保存视频的每一帧至单独的图像文件中[^1][^2]: ```python import cv2 import os import time def save_video_frames(video_path, output_folder): """ 将给定的视频逐帧保存图片。 参数: video_path (str): 输入视频文件的路径。 output_folder (str): 输出图片存放的文件夹路径。 """ # 创建输出文件夹如果不存在 if not os.path.exists(output_folder): os.makedirs(output_folder) # 打开视频文件 cap = cv2.VideoCapture(video_path) frame_count = 0 while True: ret, frame = cap.read() if not ret: break # 构造每张图片的名字 image_name = f"frame_{frame_count}.jpg" image_path = os.path.join(output_folder, image_name) # 保存当前帧作为图片 cv2.imwrite(image_path, frame) print(f"Saved {image_name}") frame_count += 1 cap.release() if __name__ == "__main__": input_video = "example.mp4" # 替换为目标视频文件名 output_dir = "./frames_output" start_time = time.time() # 记录开始时间 save_video_frames(input_video, output_dir) end_time = time.time() # 记录结束时间 elapsed_time = end_time - start_time print(f"\nTotal frames saved: {output_dir}\nTime taken: {elapsed_time:.2f} seconds.") ``` 上述脚本会打开输入视频流,依次读取其中的一帧并将它们分别存放到名为 `"./frames_output"` 的子目录下,命名方式采用连续编号的形式如 `frame_0.jpg`, `frame_1.jpg` 等等. 需要注意的是,在实际应用过程中可能遇到一些性能瓶颈或者内存占用问题,因此建议适当调整缓冲区大小或优化I/O操作效率[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

githubcurry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值