如何在OpenCV中录制1080p视频同时显示720p画面?
实现录制1080p视频同时显示720p画面的方案
要实现录制1080p视频到文件,同时向用户展示1280×720画面,只需在显示环节对处理后的1080p帧单独做缩放处理,录制流程保持不变即可。
修改要点
- 保留原视频录制逻辑:确保
out.write()写入的是处理后的1080p原始帧 - 在显示前添加帧缩放操作:使用
cv2.resize()将帧缩放到1280×720后再展示
修改后的完整代码
import cv2 import numpy as np # 假设你已定义CFEVideoConf和image_resize函数 cap = cv2.VideoCapture('rtsp://secret:secret@192.168.1.64/1') filename = user_id +'.mp4' # 支持.avi/.mp4格式 frames_per_seconds = 25 # 电影标准帧率 config = CFEVideoConf(cap, filepath = filename, res='1080p') out = cv2.VideoWriter(filename, config.video_type, frames_per_seconds, config.dims) print(config.dims) img_path = 'ap_logo.png' logo = cv2.imread(img_path, -1) watermark = image_resize(logo, height=50) watermark = cv2.cvtColor(watermark, cv2.COLOR_BGR2BGRA) while(True): ret, frame = cap.read() if not ret: break # 读取帧失败直接退出循环 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA) frame = cv2.flip(frame, 1) frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE) frame_h, frame_w, frame_c = frame.shape # 叠加带Alpha通道的水印 overlay = np.zeros((frame_h, frame_w, 4), dtype='uint8') watermark_h, watermark_w, watermark_c = watermark.shape for i in range(0, watermark_h): for j in range(0, watermark_w): if watermark[i, j][3] != 0: h_offset = frame_h - watermark_h w_offset = frame_w - watermark_w overlay[h_offset + i, w_offset + j] = watermark[i, j] cv2.addWeighted(overlay, 0.25, frame, 1.0, 0, frame) # 转换回BGR格式用于录制和显示 frame_bgr = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) # 录制1080p原始帧 out.write(frame_bgr) # 缩放帧到1280×720用于屏幕显示 display_frame = cv2.resize(frame_bgr, (1280, 720), interpolation=cv2.INTER_AREA) cv2.imshow('Frame', display_frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放所有资源 cap.release() out.release() cv2.destroyAllWindows()
关键细节说明
cv2.resize()的第二个参数为**(宽度, 高度)**,严格对应需求的1280×720- 使用
cv2.INTER_AREA插值方法,适合高分辨率转低分辨率,能保证画面清晰度 - 拆分录制与显示的帧处理逻辑,避免缩放后的低分辨率帧被写入文件,确保录制质量
内容的提问来源于stack exchange,提问作者Bireysel Finans
相关产品推荐
相关产品推荐

