Camera Calibration 相机标定
Camera Calibration 相机标定
一、相机标定方法
在opencv中提供了一组函数用于实现相机的标定,标定返回的值包括:相机内参矩阵(fx fy xc yc)、相机外参矩阵(R t)以及畸变矩阵。
标定的步骤如下:
1. 准备棋盘格,棋盘格图片可以自行打印,以下使用10*7方格的棋盘格,交点则为9*6,棋盘格的大小1mm,即 gridsize=1
2. 拍照,拍照的原则是多角度,根据理论至少要两种角度的拍照,实际中通常会拍20张左右;
3. 使用opencv提供的角点检测函数findChessboardCorners找到棋盘格中的角点,并将每幅图片的角点值存放到list中,同时将棋盘格的角点的三维坐标存放到另一个list。
4. 使用calibrateCamera函数获取内存矩阵、畸变矩阵、旋转矩阵以及转移矩阵。
5.使用undistort函数将畸变的图像进行校正并查看校正后的图片效果。
6. 代码如下(opencv_3.4.3):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import cv2
#图片角点个数
objp_dict = {
1: (9, 5),
2: (9, 6),
3: (9, 6),
4: (9, 6),
5: (9, 6),
6: (9, 6),
7: (9, 6),
8: (9, 6),
9: (9, 6),
10: (9, 6),
11: (9, 6),
12: (9, 6),
13: (9, 6),
14: (9, 6),
15: (9, 6),
16: (9, 6),
18: (9, 6),
17: (9, 6),
19: (9, 6),
20: (9, 6),
}
objp_list = []
corners_list = []
for k in objp_dict:
nx, ny = objp_dict[k]
# Prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) gridsize=1(mm)
objp = np.zeros((nx*ny,3), np.float32)
#生成角点的三维坐标
objp[:,:2] = np.mgrid[0:nx, 0:ny].T.reshape(-1,2)
# Make a list of calibration images
fname = 'camera_cal/calibration%s.jpg' % str(k)
img = cv2.imread(fname)
# Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Find the chessboard corners
ret, corners = cv2.findChessboardCorners(gray, (nx, ny), None)
# If found, save & draw corners
if ret == True:
# Save object points and corresponding corners
objp_list.append(objp)
corners_list.append(corners)
# Draw and display the corners
#cv2.drawChessboardCorners(img, (nx, ny), corners, ret)
#plt.imshow(img)
#plt.show()
#print('Found corners for %s' % fname)
else:
print('Warning: ret = %s for %s' % (ret, fname))
img = cv2.imread('camera_cal/calibration1.jpg')
img_size = (img.shape[1], img.shape[0])
'''
mtx : 内参矩阵
dist: 畸变矩阵
rvecs : 旋转矩阵
tvecs : 转移矩阵
'''
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objp_list, corners_list, img_size,None,None)
#将原始图片转换成未发生畸变的图片
dst = cv2.undistort(img, mtx, dist, None, mtx)
com_img = np.hstack((img, dst))
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', com_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、 什么是相机标定(What is Camera Calibration?)
找到影响图像成像过程的内部相机参数:
图像中心(不是width/2, height/2)
焦距长度
行像素和列像素的比例因子
扭曲factor
镜片扭曲
三、动机
Camera Calibration 用于
重构真实世界模型:Virtual L.A. project
与世界交互:e.g.机器人
如上图所示,估计红色与蓝色两个点的几何投影
四、 图像的行列比例(Scaling of Rows and Columns in Image)
相机像素不是完全符合正方形
相机输出可能模糊为近似值(NTSC)
图像可能从数据卡上获得 ·A/D转换器采样NTSC信号
相机->NTSC信号->转换为数字信号->显示器上显示
五、 混合透镜成像(Compound Lens Imaging)
单透镜系统在其周围部分会造成图像扭曲(image distort)
混合透镜可以用于减少彩色效应和针垫效应
普通摄像机的相机图像平面
对同样的摄像机(pinhole camera),相机图像平面(camera image plane)不同
六、相机标定目标
将所拍摄图像在三维坐标系中找到对应位置
Camera Calibration 相机标定的更多相关文章
- Camera Calibration 相机标定:Opencv应用方法
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49427383 Opencv中Camer ...
- Camera Calibration 相机标定:原理简介(五)
5 基于2D标定物的标定方法 基于2D标定物的标定方法,原理与基于3D标定物相同,只是通过相机对一个平面进行成像,就可得到相机的标定参数,由于标定物为平面,本身所具有的约束条机,相对后者标定更为简单. ...
- Camera Calibration 相机标定:原理简介(一)
1 相机标定常见方法 广义来说,相机标定不单包括成像过程的几何关系标定,还包括辐射关系的标定,本文只探讨几何关系.相机标定是3D计算机视觉(Computer Vision)里从2D图像中提取量测信息的 ...
- Camera Calibration 相机标定:原理简介(四)
4 基于3D标定物的标定方法 使用基于3D标定物进行相机标定,是一种传统且常见的相机标定法.3D标定物在不同应用场景下不尽相同,摄影测量学中,使用的3D标定物种类最为繁杂,如图-1的室内控制场,由多条 ...
- Camera Calibration 相机标定:原理简介(二)
2 针孔相机模型 常见的相机标定中,使用的相机多为针孔相机(Pinhole camera),也就是大家熟知的小孔成像理论.将其中涉及的坐标系之间的相互转换抽离出来,即为针孔相机模型的核心. 上图所示的 ...
- Camera Calibration 相机标定:原理简介(三)
3 绝对圆锥曲线 在进一步了解相机标定前,有必要了解绝对圆锥曲线(Absolute Conic)这一概念. 对于一个3D空间的点x,其投影空间的坐标为:x~=[x1,x2,x3,x4]T.我们定义无穷 ...
- 【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤
相机标定(Camera calibration)原理.步骤 author@jason_ql(lql0716) http://blog.csdn.net/lql0716 在图像测量过程以及机器视觉应用 ...
- 相机标定(Camera calibration)
简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...
- 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》
简介 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P 的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Sprin ...
随机推荐
- php异常及错误信息捕获并记录日志实现方法全解析
php异常处理 什么是异常? PHP 5 提供了一种新的面向对象的错误处理方法.异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况称为异常. 当异常被触发时,通常会发生: 当前代码 ...
- 关于Oracle 数据库使用dba_tables或者all_tables或者user_tables统计数据时,与直接查询表统计时数据不一致的记录
1. 今天写代码发现这个问题,这里记录一下, 不一致的原因是因为 dba_tables .all_tables.user_tables 不是实时的反应表的数据的,所以需要在查询统计之前对表进行手动分 ...
- sqlserver2018 报错恢复
报错: Description: SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确(应为: 0xb2b1af16,但实际为: 0xac9393a2).在文件 'C:\Progr ...
- Elasticsearch exception [type=mapper_parsing_exception, reason=No type specified for field [X]
可能原因是实体类属性没有指定映射类型 创建mapping时需要指定field的type,如果不指定则报错 错误 //这是一个类中的字段 @Field(store = false) private St ...
- SpringBoot配置切换
切换需求 有时候在本地测试是使用8080端口,可是上线使用的又是80端口. 此时就可以通过多配置文件实现多配置支持与灵活切换. 多配置文件 3个配置文件: 核心配置文件:application.pro ...
- ppt技巧一四步法调整PPT
声明:本文所有截图来源于网易云课堂--<和秋叶一起学PPT>,仅作为个人复习之用,特此声明! 常见配色方案 可以从模板或公司logo取色 图片的选择要高清.风格.主题一致
- 多种方法实现实现全排列 + sort调用标准函数库函数的简述
全排列:所有不同顺序的元素组组成的一个集合.这里使用使用递归实现全排列. 使用递归算算法呢,首先我们先找一下结束的条件:我们要对一组元素(这里使用数字举例)实现全排列,临界条件就是递归到只有一个元素的 ...
- 11.qml-通过方法来加载组件、字符串方式加载组件
在上章,我们学习了10.qml-组件.Loader.Component介绍. 本章我们继续来学习组件的其它创建方式. 1.调用Function来加载和移除组件 之前我们是使用Loader对象来实现加载 ...
- 内网渗透-横向移动($IPC&at&schtasks)
内网渗透-横向移动 #建立ipc连接并将后门添加至计划任务 前置条件:获取到某域主机权限->得到明文或者hash,通过信息收集到的用户列表当做用户名字典->用得到的密码明文当做密码字典 本 ...
- log日志重复输出问题(没弄明白原因)
在别的模块调用定义好的函数 输出的日志出现第一次输出输出一条,第二次输出输出两条...的情况 最后在定义函数处remove了句柄 引用了https://blog.csdn.net/huilan_sam ...