如何加载标定矩阵至实时视频流,生成校正后的输出视频?
实时鱼眼视频校正实现方案
可行性说明
完全可以通过cv2.VideoCapture获取实时视频流,逐帧完成鱼眼畸变校正后,用cv2.VideoWriter输出校正后的视频文件。
标定矩阵加载方式
你在单张图像校正中用到的DIM(标定图像尺寸)、K(相机内参矩阵)、D(畸变系数)是相机的固有参数,直接复用即可——只要实时视频帧的宽高比和标定用图像一致,就无需重新计算这些参数。
修改后的实时视频校正代码
import cv2 import numpy as np # 替换为你相机标定得到的参数 DIM = (1920, 1080) # 示例尺寸,替换成你的标定图像尺寸 K = np.array([[1000.0, 0.0, 960.0], [0.0, 1000.0, 540.0], [0.0, 0.0, 1.0]]) # 替换成你的相机内参矩阵 D = np.array([[-0.1, 0.05, 0.0, 0.0]]) # 替换成你的畸变系数 def init_undistort_map(frame_shape, balance=0.0): """预计算畸变校正映射表,避免逐帧重复计算提升效率""" dim1 = frame_shape[:2][::-1] # 输入帧的尺寸(宽, 高) assert dim1[0]/dim1[1] == DIM[0]/DIM[1], "视频帧与标定图像的宽高比必须一致" # 缩放内参矩阵以匹配当前帧尺寸 scaled_K = K * dim1[0] / DIM[0] scaled_K[2][2] = 1.0 # 计算新的相机内参矩阵 new_K = cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(scaled_K, D, dim1, np.eye(3), balance=balance) # 生成畸变校正映射表 map1, map2 = cv2.fisheye.initUndistortRectifyMap(scaled_K, D, np.eye(3), new_K, dim1, cv2.CV_16SC2) return map1, map2 def process_video(input_source=0, output_path="undistorted_video.mp4", balance=0.0): # 初始化视频捕获:0代表默认摄像头,也可以替换为视频文件路径 cap = cv2.VideoCapture(input_source) if not cap.isOpened(): print("无法打开视频源") return # 获取视频基本参数 fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 初始化视频写入器:选择合适的编码格式,这里用MP4V fourcc = cv2.VideoWriter_fourcc(*'MP4V') out = cv2.VideoWriter(output_path, fourcc, fps, (width, height)) # 预计算畸变校正映射表(只计算一次,提升效率) map1, map2 = init_undistort_map((height, width), balance) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 对当前帧进行畸变校正 undistorted_frame = cv2.remap(frame, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) # 显示校正后的帧 cv2.imshow("实时校正视频", undistorted_frame) # 写入校正后的帧到输出视频 out.write(undistorted_frame) # 按q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() out.release() cv2.destroyAllWindows() if __name__ == '__main__': # 调用函数:默认使用摄像头,输出到undistorted_video.mp4,balance参数可调整裁剪程度 process_video(balance=0.2)
关键注意事项
- 预计算映射表:把
initUndistortRectifyMap的计算放在循环外,避免逐帧重复计算,大幅提升实时处理效率。 - 宽高比一致性:确保视频帧的宽高比和标定图像一致,否则会触发断言错误。
- 编码格式适配:不同平台的视频编码格式可能有差异,如果MP4V不生效,可以尝试其他编码(如'XVID')。
- balance参数:调整该参数可控制校正后图像的裁剪程度,值越大保留的边缘越多,但可能残留少量畸变。
内容的提问来源于stack exchange,提问作者Rune619
相关产品推荐
相关产品推荐

