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

如何加载标定矩阵至实时视频流,生成校正后的输出视频?

实时鱼眼视频校正实现方案

可行性说明

完全可以通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:18:36