Git Product home page Git Product logo

cameracalibration's Introduction

Camera Calibration

集合了相机标定相关的多个脚本工具,便于完成完整的车载环视相机标定流程
各代码文件均可单独使用,此外也提供了外部接口以供调用

    License

DEMO

DEMO

Quick Start

克隆该仓库,运行main.py查看简单示例结果
确保已经安装好opencv(>=3.4.2) 以及numpy(>=1.19.2)

git clone https://github.com/dyfcalid/CameraCalibration.git
cd ./CameraCalibration
python main.py

File Tree

项目结构预览

│  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                    // 数据文件夹

Camera Intrinsic Calibration

相机内参标定

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)              # 初始化内参标定器

示例结果:
inCalib_result.jpg
inCalib_image.jpg

Camera Extrinsic Calibration

相机外参标定

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()                            # 初始化外参标定器

示例结果:
exCalib_result.jpg

Surround Camera Bird Eye View

环视相机鸟瞰拼接图生成

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()                                # 初始化环视鸟瞰生成器

示例结果:

camera.jpg
bev.jpg

Other Tools

collect.py可以开启相机完成图像或视频的数据采集
undistort.py可以批量完成图像的去畸变处理
decomposeH.py可以由单应性矩阵H和相机内参K得到旋转矩阵R和平移矩阵T (有多个结果需要筛选)
timeAlign.py可以将以时间戳命名的图片按时间对准,得到对应的列表
img2vid.py可以将图片转化为视频

License

GPL-3.0 License

Copyright (c) 2021 ZZH

cameracalibration's People

Contributors

dyfcalid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cameracalibration's Issues

如何不借助无人机图片进行车载环视相机的外参标定

您好:
非常感谢开源一整套内外参标定程序。

关于外参标定,我的理解是当前车载相机和无人机进行图片进行匹配。
如何不借助无人机图片,如何进行车载环视相机前后左右四个相机的外参标定并生成BEV 视角的图片呢?

谢谢!

size单位

你好,内参标定参数列表里,size的单位是不是应该是cm,我看标定板的棋盘格应该是10cm大小的

实时鸟瞰图拼接

您好,我目前想要做实时的鸟瞰图拼接,就像您的demo一样,这个该怎么做呢?readme里好像没有这方面的说明。

pointPolygonTest报错

lQDPJxR7_qYQNaHNAYnNA7ewr4PUyxGK1h4GGpOrXElUAA_951_393
你好,请问我在运行demo的时候出现了图中的报错,同时我也输出一下几个变量,感觉变量类型没有问题,但是报错信息却显示是第二个变量的数据类型有问题,请问是什么原因

求单应矩阵

came_extrinsic
| h | w | z | pitch | yaw | roll

came_intrinsic
-- | -- | -- | -- | -- | -- | -- | --
  | p0 | p1 | p2 | p3 | cx | cy | fx | fy

请问下已知相机的内外参了,怎么求到鸟瞰图的变换举证,现在没有无人机这种对地拍摄图

实时拼接鸟瞰图报错

您好,我在进行实时拼接鸟瞰图的时候,经常报如图所示的错,我在网上查了一下说是数据路径有问题,但我不是一开始运行就有问题,而是成功运行之后,不定时的会出现如图的问题。所以应该不是路径问题。我是每15帧抓取摄像头拍摄的画面,更新四个视角的图片。
affb60791b706791eaaf5ea5135ecf0

cv2.findChessboardCorners() 无法检测出角点

您好,首先非常感谢你的repo,非常不错。
我的问题是,无法检测棋盘格的角点,不知道为什么。我是在做一个相机仿真的应用,已经仿真渲染出来了棋盘格的图片了,计划在这个仿真的图片上进行相机校准,但是不知道为什么,就是无法识别仿真的棋盘格的角点。我也猜想是不是仿真图片的颜色不对导致的,这方面会不会呢?比如棋盘格黑色和白色的差别不是那么大,所以中间处理的时候会有问题?不知道您有没有遇到过这种情况,无法检测角点。
这时已掌握用的渲染的图片:
0_ProjectorImg2

关于鸟瞰图拼接

我使用示例的图片进行拼接,调整了输出图片的尺寸希望获得更大范围的鸟瞰图,但获得的图片却很怪,这是什么原因?
surround

校正后的图片部分像素不见

def _get_camera_mat_dst(self, camera_mat):
    camera_mat_dst = camera_mat.copy()
    camera_mat_dst[0][0] *= args.FOCAL_SCALE
    camera_mat_dst[1][1] *= args.FOCAL_SCALE
    camera_mat_dst[0][2] = args.FRAME_WIDTH / 2 * args.SIZE_SCALE
    camera_mat_dst[1][2] = args.FRAME_HEIGHT / 2 * args.SIZE_SCALE
    return camera_mat_dst

请问这部分为什么改变焦距与光轴获得新的内参矩阵,我没调用这个函数,直接用原内参,就少了部分像素。
然后我新加了cv2.getOptimalNewCameraMatrix这个获取新的内参矩阵,设置α值
newCameraMatrix, roi = cv2.getOptimalNewCameraMatrix(camera_mat,
dist_coeff,
(int(args.width), int(args.height)),
0.13)
这个函数与博主的函数是同一个原理吗?

内参标定的模式选择

您好,请问再标定内参时选择鱼眼相机或普通相机,这个模式该依据什么选择,我用的森云60、90、120度的相机,120的选普通模式没法完成标定,选择鱼眼则可以。而60度的两种模式都能标定,但鱼眼模式的重投影误差要小些,这时又该如何选择模式呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.