You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV将单帧图像合并为视频文件的问题求助

OpenCV单帧合并视频及数组存储崩溃问题

我正尝试使用OpenCV将单帧图像合并为视频文件,希望结合现有代码生成单帧。以下是用于提取单帧的代码:

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('file_data.mp4',fourcc,20 (1920,1080),False)
while True:
    ret, frame=cap.read()
    mask = object_detector.apply(frame)
    _, mask  = cv2.threshold(mask,254,255,cv2.THRESH_BINARY)       
    contours,_ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    res = cv2.bitwise_and(frame,frame,mask=mask)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area>1000:   
            #print("Area of contour:", area)
            cv2.drawContours(frame, [cnt], -1, (0,255,0),2)
            cv2.imwrite("file%d.jpg"%count, frame)
            out.write(frame)
    if cv2.waitKey(1) and 0xFF == ord('q'):
        break

尝试将单帧存储到数组中时,虽无报错信息但电脑直接崩溃。相关参数:

fps = 20
width = 1920
height = 1080


问题分析

  1. 现有代码的语法/逻辑错误:

    • VideoWriter初始化时,帧率20和分辨率(1920,1080)之间缺少逗号,会触发参数传递错误;
    • 变量count未定义,执行cv2.imwrite时会抛出未定义变量的异常;
    • cv2.waitKey的条件写法错误,cv2.waitKey(1) and 0xFF == ord('q')逻辑颠倒,正确判断退出的写法应为cv2.waitKey(1) == ord('q');
    • 参数False表示输出灰度视频,但你处理的frame是彩色图,会导致视频写入失败。
  2. 数组存储崩溃原因:
    单帧1920×1080的彩色图像占用内存约1920*1080*3/1024/1024 ≈ 6MB,若视频有1000帧,仅存储帧就需要约6GB内存,帧数再多会直接耗尽系统内存,导致电脑崩溃。

修正后的代码(生成视频)

import cv2

# 初始化视频捕获(替换为你的输入视频路径或设备ID)
cap = cv2.VideoCapture("input_video.mp4")
count = 0  # 初始化帧计数变量

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 修正参数:补全逗号,改为彩色输出(True)
out = cv2.VideoWriter('file_data.mp4', fourcc, 20, (1920, 1080), True)

while True:
    ret, frame = cap.read()
    if not ret:  # 视频读取完毕自动退出
        break
    
    mask = object_detector.apply(frame)
    _, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY)       
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 1000:   
            cv2.drawContours(frame, [cnt], -1, (0,255,0), 2)
            cv2.imwrite(f"file{count}.jpg", frame)
            out.write(frame)
            count += 1  # 每保存一帧计数自增
    
    if cv2.waitKey(1) == ord('q'):
        break

# 释放资源,避免内存泄漏
cap.release()
out.release()
cv2.destroyAllWindows()

数组存储的优化方案

如果必须存储帧到数组,通过以下方式避免内存溢出:

  • 限制存储帧数:只保存关键帧或固定数量的帧;
  • 压缩帧尺寸:缩小分辨率后再存储;
  • 按需处理:处理完一帧即写入视频,不长期驻留内存。

示例代码(压缩帧存储):

import cv2

cap = cv2.VideoCapture("input_video.mp4")
frames = []
max_store_frames = 500  # 限制最大存储帧数
target_size = (640, 360)  # 缩小后的分辨率

while True:
    ret, frame = cap.read()
    if not ret or len(frames) >= max_store_frames:
        break
    
    # 处理帧逻辑...
    
    # 压缩后存入数组
    compressed_frame = cv2.resize(frame, target_size)
    frames.append(compressed_frame)

cap.release()

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:15:40