使用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
问题分析
现有代码的语法/逻辑错误:
VideoWriter初始化时,帧率20和分辨率(1920,1080)之间缺少逗号,会触发参数传递错误;- 变量
count未定义,执行cv2.imwrite时会抛出未定义变量的异常; cv2.waitKey的条件写法错误,cv2.waitKey(1) and 0xFF == ord('q')逻辑颠倒,正确判断退出的写法应为cv2.waitKey(1) == ord('q');- 参数
False表示输出灰度视频,但你处理的frame是彩色图,会导致视频写入失败。
数组存储崩溃原因:
单帧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
相关产品推荐
相关产品推荐

