计算机视觉第五次实验——相机标定盘格标定法

计算机视觉第五次实验——相机标定盘格标定法

标题一,背景

一个是由于每个镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变;
另一个是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构出三维场景。具体来说:当我们用摄像机拍照时,从照片里得到一些空间信息(比如距离,尺寸等),是要利用二维图像得到三维信息。我们拍照的时候把空间物体信息通过摄像机变成了二维图像,这个过程本来是不可逆的。但如果我们可以找到一个摄像机的数学模型,就可以 :从二维图像+模型逆推得到原来三维信息。标定就是在找这个模型。

二、相机标定可以做什么?

1、相机在出厂之前都需要进行相机标定,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变;在这里插入图片描述
2、根据相机成像的几何模型,将世界坐标系中的3D物体映射到2D成像平面上;
3、求解多个相机对之间的映射关系

三、基本原理

1、四个坐标系:
2、世界坐标系(world coordinate system):用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置而被引入。单位为m。

相机坐标系(camera coordinate system):在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为m。

图像坐标系(image coordinate system):为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。 单位为m。

像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为个(像素数目)。

img

3、从世界坐标系到相机坐标系 3D->3D

img

其中,R为旋转矩阵,t为平移向量,因为假定在世界坐标系中物点所在平面过世界坐标系原点且与Zw轴垂直(也即棋盘平面与Xw-Yw平面重合,目的在于方便后续计算),所以zw=0,可直接转换成式1的形式。其中变换矩阵

即为前文提到的外参矩阵,之所称之为外参矩阵可以理解为只与相机外部参数有关,且外参矩阵随刚体位置的变化而变化。
4、从相机坐标系到理想图像坐标系(不考虑畸变) 3D->2D

img

img

这一过程进行了从三维坐标到二维坐标的转换,也即投影透视过程(用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图,也就是使我们人眼看到景物近大远小的一种成像方式)。

5.从理想图像坐标系到实际图像坐标系(考虑畸变):

透镜的畸变主要分为径向畸变和切向畸变(还有薄透镜畸变等等,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变)。

径向畸变是由于透镜形状的制造工艺导致。且越向透镜边缘移动径向畸变越严重。实际情况中我们常用r=0处的泰勒级数展开的前几项来近似描述径向畸变。矫正径向畸变前后的坐标关系为:

•xcorrected = x(1+k1r2+k2r4+k3r6)

•ycorrected = y(1+k1r2+k2r4+k3r6)

由此可知对于径向畸变,我们有3个畸变参数需要求解。

切向畸变是由于透镜和CMOS或者CCD的安装位置误差导致。切向畸变需要两个额外的畸变参数来描述,矫正前后的坐标关系为:

•xcorrected = x + [ 2p1y + p2 (r2 + 2x2) ]

•ycorrected = y + [ 2p2x + p1 (r2 + 2y2) ]

由此可知对于切向畸变,我们有2个畸变参数需要求解。

综上,我们一共需要5个畸变参数(k1、k2、k3、p1和p2 )来描述透镜畸变。

注意:

6.从实际图像坐标系到像素坐标系:

由于定义的像素坐标系原点与图像坐标系原点不重合,假设像素坐标系原点在图像坐标系下的坐标为(u0,v0),每个像素点在图像坐标系x轴、y轴方向的尺寸为:dx、dy,且像点在实际图像坐标系下的坐标为(xc,yc),于是可得到像点在像素坐标系下的坐标为:

img

化为齐次坐标表示形式可得:

img

若暂不考虑透镜畸变,则将式2与式5的转换矩阵相乘即为内参矩阵M:

img

之所以称之为内参矩阵可以理解为矩阵内各值只与相机内部参数有关,且不随物体位置变化而变化。

最后用一幅图来总结从世界坐标系到像素坐标系(不考虑畸变)的转换关系:

img

四、实验要求

1.打印一张棋盘格A4纸张(黑白间距知),并贴在一个平板上

2.针对棋盘格拍摄若干张图片(一般0-20张)

3.在图片中检测特征点(Harris角点)

4.根据角点位置信息及图像中的坐标,求角

Homographic矩阵

5.利用解析解估算方法计算出5个内部参数,以及

6个外部参数

6.根据极大似然估计策略,设计优化目标并实现

参数的refinement

五、代码及实现

实现相机标定的方法有MATLAB(matlab calibration toolbox-Matlab标定工具箱使用(单目标定和双目标定)和OpenCV标定函数 cv::calibrateCamera(…);此次实验我两个都试了一次

3.1数据集

在这里插入图片描述

3.2代码
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris

"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""

# 读入图像
im = array(Image.open('C:/c').convert('L'))

# 检测harris角点
harrisim = harris.compute_harris_response(im)

# Harris响应函数
harrisim1 = 255 - harrisim

figure()
gray()

#画出Harris响应图
subplot(141)
imshow(harrisim1)
print harrisim1.shape
axis('off')
axis('equal')

threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
    filtered_coords = harris.get_harris_points(harrisim, 6, thres)
    subplot(1, 4, i+2)
    imshow(im)
    print im.shape
    plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    axis('off')

#原书采用的PCV中PCV harris模块
#harris.plot_harris_points(im, filtered_coords)

# plot only 200 strongest
# harris.plot_harris_points(im, filtered_coords[:200])

show()
3.2.1图片中检测特征点(Harris角点)
3.2.2相机标定
import cv2
import glob
import numpy as np


criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)


objp = np.zeros((4* 4, 3), np.float32)
objp[:, :2] = np.mgrid[0:4, 0:4].T.reshape(-1, 2)

objpoints = []  # 3d point in real world space
imgpoints = []  # 2d points in image plane.

images = glob.glob("C:/Users/59287/Desktop/chess/1.jpg")
print('...loading')
for fname in images:
    print('processing img:{fname}')

    img = cv2.imread(fname)  # source image

    # img = cv2.resize(img,None,fx=0.5, fy=0.5, interpolation = cv2.INTER_CUBIC)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # cv2.imshow('img',gray)
    # cv2.waitKey(1000)

    ret, corners = cv2.findChessboardCorners(gray, (4, 4), None)

    if ret == True:
        objpoints.append(objp)

        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        imgpoints.append(corners2)

        img = cv2.drawChessboardCorners(img, (4, 4), corners2, ret)
        cv2.namedWindow('img', 0)
        cv2.resizeWindow('img', 500, 500)
        cv2.imshow('img', img)
        cv2.waitKey(500)
        cv2.destroyAllWindows()

img = cv2.imread("C:/Users/59287/Desktop/chess/1.jpg")
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)


# img = cv2.resize(img,None,fx=0.5, fy=0.5, interpolation = cv2.INTER_CUBIC)
h, w = img.shape[:2]

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))

dst = cv2.undistort(img, mtx, dist, None, newcameramtx)


x, y, w, h = roi
cv2.imwrite('calibresult.png', dst)


print ("newcameramtx:\n", newcameramtx)
print ("dist:\n", dist)

tot_error = 0
for i in range(len(objpoints)):
    imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
    tot_error += error

print ("total error: ", tot_error / len(objpoints))
print("ret:", ret)
print("mtx:\n", mtx)
print("dist:\n", dist)
print("rvecs:\n", rvecs)
print("tvecs:\n", tvecs )
3.3实验环境

win10,64位,python2.7,编译器:PyCharm
MATLAB
在这里插入图片描述
手机型号:小米9

3.4结果

type objpoints:—3D点
type img:–2D点
dist:畸变系数
newcameramtx:旋转(向量)外参
dist:平移(向量)外参
total error:误差
外部参数(旋转向量:外参就是相机相对于世界坐标系的旋转和平移变换关系
在这里插入图片描述
外部参数(平移向量):在这里插入图片描述
在这里插入图片描述
角点检测
在这里插入图片描述
标定结果:
在这里插入图片描述
从图中可以看出重投影误差为0.74,大于0.5结果不太理想,初步估计可能是因为拍摄的时候太亮,打印下来的纸在裁剪有点弯曲然后造成边缘的不齐整,而且粘贴在墙上的时候纸张不平整。
在这里插入图片描述
实验结果的小米9后置摄像头的参数矩阵为
在这里插入图片描述

六、实验问题

6.1错误

在这里插入图片描述
因为我的棋盘格是55,在实验过程中我把角点算错,应该是44,改正后可以正常运行

6.2 待解决问题(解决后更新)

在这里插入图片描述
图片中检测特征点(Harris角点)时一直出现这个问题,查网络上的解决方案还是不行。

七、参考资料

Intel’s OpenCV library: http://www.intel.com/research/mr/research/opencv/

Matlab version by Jean-Yves Bouget:http://www.vision.caltech.edu/bouguetj/calibdoc/index.html

Zhengyou Zhang’s web site: http://research.microsoft.com/-zhang/Calib/

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值