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 相机标定的更多相关文章

  1. Camera Calibration 相机标定:Opencv应用方法

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49427383 Opencv中Camer ...

  2. Camera Calibration 相机标定:原理简介(五)

    5 基于2D标定物的标定方法 基于2D标定物的标定方法,原理与基于3D标定物相同,只是通过相机对一个平面进行成像,就可得到相机的标定参数,由于标定物为平面,本身所具有的约束条机,相对后者标定更为简单. ...

  3. Camera Calibration 相机标定:原理简介(一)

    1 相机标定常见方法 广义来说,相机标定不单包括成像过程的几何关系标定,还包括辐射关系的标定,本文只探讨几何关系.相机标定是3D计算机视觉(Computer Vision)里从2D图像中提取量测信息的 ...

  4. Camera Calibration 相机标定:原理简介(四)

    4 基于3D标定物的标定方法 使用基于3D标定物进行相机标定,是一种传统且常见的相机标定法.3D标定物在不同应用场景下不尽相同,摄影测量学中,使用的3D标定物种类最为繁杂,如图-1的室内控制场,由多条 ...

  5. Camera Calibration 相机标定:原理简介(二)

    2 针孔相机模型 常见的相机标定中,使用的相机多为针孔相机(Pinhole camera),也就是大家熟知的小孔成像理论.将其中涉及的坐标系之间的相互转换抽离出来,即为针孔相机模型的核心. 上图所示的 ...

  6. Camera Calibration 相机标定:原理简介(三)

    3 绝对圆锥曲线 在进一步了解相机标定前,有必要了解绝对圆锥曲线(Absolute Conic)这一概念. 对于一个3D空间的点x,其投影空间的坐标为:x~=[x1,x2,x3,x4]T.我们定义无穷 ...

  7. 【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤

    相机标定(Camera calibration)原理.步骤 author@jason_ql(lql0716)  http://blog.csdn.net/lql0716 在图像测量过程以及机器视觉应用 ...

  8. 相机标定(Camera calibration)

    简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...

  9. 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》

    简介 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P 的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Sprin ...

随机推荐

  1. NumPy之:结构化数组详解

    目录 简介 结构化数组中的字段field 结构化数据类型 创建结构化数据类型 从元组创建 从逗号分割的dtype创建 从字典创建 操作结构化数据类型 Offsets 和Alignment Field ...

  2. 『政善治』Postman工具 — 1、Postman介绍与安装

    目录 一.Postman介绍 二.Postman下载与安装 1.Postman下载 2.Postman安装 3.为什么要注册Postman账号 一.Postman介绍 Postman是一款非常流行的H ...

  3. lumen Rest API 起步

    lumen Rest API 起步 修改项目文件 .env DB_DATABASE=<数据库名> DB_USERNAME=<数据库用户名> DB_PASSWORD=<数据 ...

  4. IE 兼容问题笔记

    IE 兼容问题笔记 解决IE11兼容HTML5 设置 document.body的一些用法以及js中的常见问题 flex布局浏览器兼容处理 ie8, ie9 css3 media媒体查询器用法总结 c ...

  5. SSL证书及HTTPS服务器

    1. 域名 在万网购买,略 2. 云服务器 阿里云购买,略 3. 安装lnmp 使用lnmp.org程序,略 4. 申请证书 阿里云-管理控制台-安全(云盾)-证书服务-购买证书证书类型: 免费型DV ...

  6. hdu4604 不错的子序列问题

    题意:       给你一个栈,里面有n个数,和一个双头队列(空的),每次从栈里拿出一个数据,有三种选择,可以选择丢弃这个数字,也可以放到队头或者队尾,最后问你这个队列你面的最长连续非下降序列的长度. ...

  7. SMTP、POP3和IMAP邮件协议

    目录 SMTP POP IMAP 总结 DNS记录中的MX记录 今天入职第一天,公司让配置个人的内网.外网邮箱,这可把我给搞晕了,本来以前就对邮箱这块不是很了解,平时也不怎么用邮箱,顶多有个QQ邮箱而 ...

  8. Java中的反射机制Reflection

    目录 什么是反射? 获取.class字节码文件对象 获取该.class字节码文件对象的详细信息 通过反射机制执行函数 反射链 反射机制是java的一个非常重要的机制,一些著名的应用框架都使用了此机制, ...

  9. hdu3415单调队列

    题意:       给你一个数字组成的环,要求在里面找到一个最大的子序列,使得和最大,要求: (1)子序列长度不能超过k (2)如果子序列和相同要起点最小的 (3)如果起点相同要长度最小的 思路:   ...

  10. Getting Started and Beyond|云原生应用负载均衡选型指南

    作者 冉昕,腾讯云服务网格TCM产品经理,现负责云原生流量接入网关与应用通信可观测性等产品特性策划与设计工作. 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理 ...