博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python+opencv相机标定
阅读量:4450 次
发布时间:2019-06-07

本文共 4043 字,大约阅读时间需要 13 分钟。

一、制作标定板

  将下图打印:

  

                         图一

   将打印出的纸固定放到一个平板上,使用同一相机从不同的位置,不同的角度,拍摄标定板的多张照片(10-20张最佳),将照片放到文件夹中:

    

 

 

二、提取标定板的世界坐标

  需要注意标定板的大小是标定板在水平和竖直方向上内角点的个数。内角点指的是,标定板上不挨着边界的角点(如图一标定板大小为6×9)。

三、张正友标定相机

  (一)张正友标定相机原理

    1.求得相机内参数:

      用于标定的棋盘格是特制的,其角点坐标已知。标定棋盘格是三维场景中的一个平面∏,棋盘格在成像平面为π(知道了∏与π的对应点坐标之后,可求解两个平面1对应的单应矩阵H)。

      根据相机成像模型,P为标定的棋盘坐标,p为其像素点坐标。则,通过对应的点坐标求解H后,可用于求K,R,T。

    2.设棋盘格所在平面为世界坐标系上XOY平面,则棋盘格上任一角点P世界坐标系为(X,Y,0)。

    

    3、内参约束条件

      

      

      

      

四、实验结果

  (一)角点检测

        

(二)相机参数:

   

其中:

ret: 48.043364303359844

内参数矩阵mtx:

[[2.89394836e+03 0.00000000e+00 1.18203203e+02]

[0.00000000e+00 7.97606845e+03 4.35321306e+02]
[0.00000000e+00 0.00000000e+00 1.00000000e+00]]

 

畸变系数dist:

[[-1.65763847e+02 8.93185546e+03 -2.72751174e+00 2.50930783e+00 9.38314320e+04]]

14张图的旋转向量rvecs分别是:

[array([[ 2.07541837],[-0.50479028],[-2.49085509]]),

array([[-1.16763908],[-1.12637317],[-1.07159956]]),

array([[ 1.19233488],[ 1.20624967],[-1.08566803]]),

array([[-1.16244554],[-1.13982256],[-1.06232949]]),

array([[-1.09733234],[-1.17285271],[-1.01093628]]),

array([[ 1.23539076],[ 1.16691521],[-1.11707143]]),

array([[-1.16607369],[-1.14036633],[-1.06258838]]),

array([[-1.23689999],[-1.08911596],[-1.1949959 ]]),

array([[-1.0598044 ],[-1.18432565],[-0.92552792]]),

array([[-1.28920578],[-1.03930212],[-1.2359854 ]]),

array([[ 1.21956501],[ 1.17686431],[-1.10965745]]),

array([[ 1.19665548],[ 1.20211216],[-1.08712586]]),

array([[-1.14009498],[-1.1404223 ],[-1.0457488 ]]),

array([[-1.72584463],[-0.30218636],[-2.16269854]])]

 

14张图的平移向量tvecs分别是:

[array([[ 2.58103626],[ -1.449794 ],[153.26014997]]),

array([[-1.39291898],[-1.93347226],[58.34618242]]),

array([[-1.18779854],[-1.88277967],[62.72913595]]),

array([[-1.1216013 ],[-2.25848093],[62.93996114]]),

array([[ 0.10165107],[-2.50680014],[74.40682257]]),

array([[-1.28469761],[-2.49801729],[81.14504656]]),

array([[-1.10391052],[-2.04871883],[63.69652216]]),

array([[ 0.27557857],[-2.51892743],[88.71794513]]),

array([[-0.92126877],[-3.07010974],[82.83508132]]),

array([[ 0.28318588],[-2.15120651],[88.45919501]]),

array([[-1.03690781],[-2.36490656],[81.60288684]]),

array([[-1.13388547],[-2.10610231],[66.81208467]]),

array([[-0.46224606],[-2.18458233],[68.05082571]]),

array([[ 4.31072343],[ -5.89752854],[300.37214262]])]

(三)手机型号

  iPhone6s

  

五、代码

1 import cv2 2 import numpy as np 3 import glob 4  5 # 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001 6 criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001) 7  8 # 获取标定板角点的位置 9 objp = np.zeros((6 * 9, 3), np.float32)10 objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)  # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y11 12 obj_points = []  # 存储3D点13 img_points = []  # 存储2D点14 15 images = glob.glob("D:/there/pictures/*.jpg")16 for fname in images:17     img = cv2.imread(fname)18     cv2.imshow('img',img)19     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)20 21     size = gray.shape[::-1]22     ret, corners = cv2.findChessboardCorners(gray, (6, 9), None)23     print(ret)24 25     if ret:26 27         obj_points.append(objp)28 29         corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria)  # 在原角点的基础上寻找亚像素角点30         #print(corners2)31         if [corners2]:32             img_points.append(corners2)33         else:34             img_points.append(corners)35 36         cv2.drawChessboardCorners(img, (8, 6), corners, ret)  # 记住,OpenCV的绘制函数一般无返回值37         cv2.imshow('img', img)38         cv2.waitKey(2000)39 40 print(len(img_points))41 cv2.destroyAllWindows()42 43 # 标定44 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)45 46 print("ret:", ret)47 print("mtx:\n", mtx) # 内参数矩阵48 print("dist:\n", dist)  # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)49 print("rvecs:\n", rvecs)  # 旋转向量  # 外参数50 print("tvecs:\n", tvecs ) # 平移向量  # 外参数51 52 print("-----------------------------------------------------")
View Code

 

六、参考文献

相机标定求解相机内参数 

张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)

转载于:https://www.cnblogs.com/wenbozhu/p/10697374.html

你可能感兴趣的文章
java运行时内存分类
查看>>
为什么说 Git 比 SVN 更好
查看>>
图的应用:哈密尔顿路径
查看>>
js计算日期相减天数
查看>>
jquery 判断元素是否隐藏
查看>>
wcf契约版本处理与异常处理(随记)
查看>>
1.基础数据类型的初识 字符串 bool 整型 if else elif
查看>>
Mybatis源码分析: MapperMethod功能讲解(1)
查看>>
Error: Cannot retrieve repository metadata (repomd.xml) for repository: addons.
查看>>
jqGrid的subGrid子表格
查看>>
插件库
查看>>
桶排序
查看>>
the least common multiplier
查看>>
Metro 风格的浏览和无插件的 HTML5
查看>>
LifecycleControl.cs
查看>>
函数式思维: 利用 Either 和 Option 进行函数式错误处理 类型安全的函数式异常...
查看>>
ICEfaces 3.2.0.BETA1 发布
查看>>
div 旋转
查看>>
【设计模式】4、原型模式
查看>>
进入meta模式关闭背光灯
查看>>