集合了相机标定相关的多个脚本工具,便于完成完整的车载环视相机标定流程
各代码文件均可单独使用,此外也提供了外部接口以供调用
克隆该仓库,运行main.py查看简单示例结果
确保已经安装好opencv(>=3.4.2) 以及numpy(>=1.19.2)
git clone https://github.com/dyfcalid/CameraCalibration.git
cd ./CameraCalibration
python main.py
项目结构预览
│ main.py // 主程序
│
├─ExtrinsicCalibration
│ │ extrinsicCalib.ipynb // 外参标定代码(含注释)
│ │ extrinsicCalib.py // 外参标定python代码
│ │ README.md // 外参标定文档
│ │ __init__.py // init文件,API说明
│ │
│ └─data // 外参标定数据文件夹
│
├─IntrinsicCalibration
│ │ intrinsicCalib.ipynb // 内参标定代码(含注释)
│ │ intrinsicCalib.py // 内参标定python代码
│ │ README.md // 内参标定文档
│ │ __init__.py // init文件,API说明
│ │
│ └─data // 内参标定数据文件夹
│
├─SurroundBirdEyeView
│ │ surroundBEV.ipynb // 环视鸟瞰代码(含注释)
│ │ surroundBEV.py // 环视鸟瞰python代码
│ │ README.md // 环视鸟瞰文档
│ │ __init__.py // init文件,API说明
│ │
│ └─data // 环视鸟瞰参数文件夹
│ ├─front // 存放前相机K、D、H参数文件
│ ├─back // 存放后相机K、D、H参数文件
│ ├─left // 存放左相机K、D、H参数文件
│ └─right // 存放右相机K、D、H参数文件
│
└─Tools // 一些相关的标定工具
│ collect.py // 图像采集
│ undistort.py // 图像去畸变
└─data // 数据文件夹
相机内参标定
intrinsicCalib.py
查看文档
包括相机的在线标定和离线标定,包含鱼眼相机和普通相机模型,
并支持相机、视频、图像三种输入,生成相机内参和畸变向量
- 可以直接运行python文件,并通过argparse输入更多参数,argparse参数表详见文档
python intrinsicCalib.py
- 此外,提供
InCalibrator
类供调用,使用说明如下,具体示例见main.py
from intrinsicCalib import InCalibrator
calibrator = InCalibrator(camera_type) # 初始化内参标定器
for img in images:
result = calibrator(img) # 每次读入一张原始图片 更新标定结果
undist_img = calibrator.undistort(raw_frame) # 使用undistort方法得到去畸变图像
或者调用CalibMode
类,使用预设好的标定模式,各模式详见文档
from intrinsicCalib import InCalibrator, CalibMode
calibrator = InCalibrator(camera_type) # 初始化内参标定器
calib = CalibMode(calibrator, input_type, mode) # 选择标定模式
result = calib() # 开始标定
可以直接修改原文件中的各参数,或使用get_args()
方法获取参数并修改
args = InCalibrator.get_args() # 获取args参数
args.INPUT_PATH = './IntrinsicCalibration/data/' # 修改args参数
calibrator = InCalibrator(camera_type) # 初始化内参标定器
相机外参标定
extrinsicCalib.py
查看文档
完成相机的外参标定,实现任意两个视图(包含相同标定板)的转换,生成单应性变换矩阵
如:基于无人机相机和车载环视相机同时拍摄地面的标定板,进行车载相机的外参标定,
生成车载相机至无人机相机的单应性变换矩阵,实现鸟瞰图的转换(即将车载相机视角转换至无人机视角)
- 可以直接运行python文件,并通过argparse输入更多参数,argparse参数表详见文档
python extrinsicCalib.py
- 此外,提供
ExCalibrator
类供调用,使用说明如下,具体示例见main.py
from extrinsicCalib import ExCalibrator
exCalib = ExCalibrator() # 初始化外参标定器
homography = exCalib(src_raw, dst_raw) # 输入对应的两张去畸变图像 得到单应性矩阵
src_warp = exCalib.warp() # 使用warp方法得到原始图像的变换结果
可以直接修改原文件中的各参数,或使用get_args()
方法获取参数并修改
args = ExCalibrator.get_args() # 获取args参数
args.INPUT_PATH = './ExtrinsicCalibration/data/' # 修改args参数
exCalib = ExCalibrator() # 初始化外参标定器
环视相机鸟瞰拼接图生成
surroundBEV.py
查看文档
输入前后左右四张原始相机图像,生成鸟瞰图
包括直接拼接和融合拼接,并可以进行亮度平衡和白平衡
- 可以直接运行python文件,并通过argparse输入更多参数,argparse参数表详见文档
python surroundBEV.py
- 此外,提供
BevGenerator
类供调用,使用说明如下,具体示例见main.py
from surroundBEV import BevGenerator
bev = BevGenerator() # 初始化环视鸟瞰生成器
surround = bev(front,back,left,right) # 输入前后左右四张原始相机图像 得到拼接后的鸟瞰图
上面生成的是直接拼接的结果,能够保证实时性,此外也可以使用融合和平衡,但速度较慢,如
bev = BevGenerator(blend=True, balance=True) # 使用图像融合以及平衡
surround = bev(front,back,left,right,car) # 可以加入车辆图片
可以直接修改原文件中的各参数,或使用get_args()
方法获取参数并修改
args = BevGenerator.get_args() # 获取环视鸟瞰args参数
args.CAR_WIDTH = 200
args.CAR_HEIGHT = 350 # 修改为新的参数
bev = BevGenerator() # 初始化环视鸟瞰生成器
示例结果:
用collect.py
可以开启相机完成图像或视频的数据采集
用undistort.py
可以批量完成图像的去畸变处理
用decomposeH.py
可以由单应性矩阵H和相机内参K得到旋转矩阵R和平移矩阵T (有多个结果需要筛选)
用timeAlign.py
可以将以时间戳命名的图片按时间对准,得到对应的列表
用img2vid.py
可以将图片转化为视频
Copyright (c) 2021 ZZH