能否用OpenCV实现低分辨率目标跟踪与高分辨率视频录制?
实现方案:单1080p摄像头同时低分辨率跟踪+指定分辨率录制
完全可以通过OpenCV实现需求,无需额外依赖库,核心思路是捕获摄像头的1080p原始帧,对帧进行缩放得到不同分辨率的版本,分别用于MOSSE跟踪和视频录制。以下是具体步骤和代码示例:
核心逻辑
树莓派的摄像头通常无法同时输出多分辨率数据流,因此我们先捕获最高分辨率(1080p)的帧,再通过OpenCV的缩放函数生成跟踪用的低分辨率帧(640x480)和录制用的目标分辨率帧(720x480/1280x720),分别处理即可。
具体实现步骤
1. 初始化摄像头与参数
先将摄像头设置为1080p输出,同时定义跟踪、录制用的分辨率,初始化视频写入器和MOSSE跟踪器。
2. 帧处理循环
- 读取原始1080p帧
- 缩放为640x480帧,用于MOSSE跟踪
- 缩放为目标录制分辨率帧,写入视频文件
- (可选)将跟踪框映射回原始帧显示
3. 资源释放
循环结束后释放摄像头、视频写入器和窗口资源。
完整代码示例
import cv2 as cv # 初始化摄像头(树莓派上建议加CAP_V4L2参数以更好支持分辨率设置) cap = cv.VideoCapture(0, cv.CAP_V4L2) # 设置摄像头输出为1080p、30fps cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080) cap.set(cv.CAP_PROP_FPS, 30) # 定义分辨率参数 track_res = (640, 480) # 跟踪用低分辨率 # 录制用分辨率二选一 record_res = (1280, 720) # record_res = (720, 480) # 初始化视频写入器(MP4格式,25fps) fourcc = cv.VideoWriter_fourcc(*'mp4v') video_writer = cv.VideoWriter('recorded_video.mp4', fourcc, 25, record_res) # 初始化MOSSE跟踪器,先读取一帧并缩放后选择跟踪目标 ret, raw_frame = cap.read() track_frame_init = cv.resize(raw_frame, track_res, interpolation=cv.INTER_AREA) # 手动框选跟踪目标 bbox = cv.selectROI("选择跟踪目标", track_frame_init, False) tracker = cv.TrackerMOSSE_create() tracker.init(track_frame_init, bbox) while cap.isOpened(): ret, raw_frame = cap.read() if not ret: break # 生成跟踪用低分辨率帧并执行跟踪 track_frame = cv.resize(raw_frame, track_res, interpolation=cv.INTER_AREA) success, tracked_bbox = tracker.update(track_frame) # (可选)将跟踪框映射回原始帧并绘制 if success: x, y, w, h = [int(v) for v in tracked_bbox] # 计算缩放比例,将跟踪框坐标映射到原始1080p帧 scale_x = raw_frame.shape[1] / track_res[0] scale_y = raw_frame.shape[0] / track_res[1] orig_x, orig_y = int(x * scale_x), int(y * scale_y) orig_w, orig_h = int(w * scale_x), int(h * scale_y) cv.rectangle(raw_frame, (orig_x, orig_y), (orig_x+orig_w, orig_y+orig_h), (0,255,0), 2) # 生成录制用分辨率帧并写入视频 record_frame = cv.resize(raw_frame, record_res, interpolation=cv.INTER_AREA) video_writer.write(record_frame) # 显示实时画面(按q退出) cv.imshow("跟踪与录制", raw_frame) if cv.waitKey(1) & 0xFF == ord('q'): break # 释放所有资源 cap.release() video_writer.release() cv.destroyAllWindows()
性能优化建议(针对Pi3A+)
- 启用OpenCV硬件加速:编译OpenCV时开启树莓派的MMAL/V4L2硬件加速支持,可大幅提升帧捕获和缩放速度,确保帧率稳定在25fps以上。
- 简化处理流程:如果不需要显示原始帧,可跳过跟踪框映射步骤,减少计算量。
- 调整插值方法:缩小帧时使用
INTER_AREA插值(代码中已用),比其他插值方法更快且画质损失小。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

