五金制品东莞网站建设技术支持,微信公众号可以做网站嘛,如何修改网站后台登陆入口路劲,邯郸之窗官网文章目录 角点检测查看角点标定 opencv中内置了张正友的棋盘格标定法#xff0c;通过一些姿态各异的棋盘格图像#xff0c;就能标定相机的内外参数。 角点检测 
第一步是角点检测#xff0c;首先需要读取棋盘格图像 
import numpy as np
import cv2
import ospath  imgs   #… 文章目录 角点检测查看角点标定  opencv中内置了张正友的棋盘格标定法通过一些姿态各异的棋盘格图像就能标定相机的内外参数。 角点检测 
第一步是角点检测首先需要读取棋盘格图像 
import numpy as np
import cv2
import ospath  imgs   # 图像文件夹相对路径
fs  os.listdir(path)
grays  []
for f in fs:fName  os.path.join(path, f)img  cv2.imread(fName)gray  cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 图像转灰度grays.append(gray)其中grays中便是所有棋盘格灰度图像接下来就要找到这些棋盘格的角点位置主要用到函数findChessboardCorners其输入参数为棋盘格图像、角点个数以及标志位。 
w, h  11, 8        # 交点横纵个数# 亚像素点的检测条件
criteria  (cv2.TERM_CRITERIA_EPS  cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
pImgs  []
for g in grays: # cs即位初步检测的角点ret, cs  cv2.findChessboardCorners(g, (w, h), None) # 亚像素角点检测pImg  cv2.cornerSubPix(g, cs.astype(np.float32), (5, 5), (-1,   -1), criteria)pImgs.append(np.squeeze(pImg))其中pImg用于存放像素坐标中的二维点。 
查看角点 
为了验证角点检测是否合理可以将其画出来用opencv自带的工具就像下面这样就可以 
cv2.drawChessboardCorners(grays[0], (w, h), pImgs[0], None)
cv2.imshow(findCorners, grays[0])
cv2.waitKey(1000)但窗口缩放比较麻烦所以更推荐用经典的matplotlib来画图 
import matplotlib.pyplot as pltpts  pImgs[0].squeeze().reshape(-1,2).T
plt.imshow(grays[0])
plt.scatter(pts[0], pts[1], marker*, cred)
plt.show()效果如下 标定 
函数calibrateCamera可用于图像标定只需将现实世界的点和相机坐标系中的角点的一一对应关系输入便能得到相应的相机矩阵。其中现实世界中哦的三维点一般成为对象点由于棋盘格中每个方块都是等距的故可直接建立为类似(1,0,0), (2,0,0)...即可 
objp  np.zeros((6*7,3), np.float32)
objp[:,:2]  np.mgrid[0:7,0:6].T.reshape(-1,2)pObj  np.zeros((w*h, 3), np.float32)
pObj[:,:2]  np.mgrid[0:w, 0:h].T.reshape(-1,2)
pObjs  [pObj for _ in range(len(pImgs))]至此万事俱备只需调用 
size  grays[0].shape[::-1]     # 图像尺寸
ret, mtx, dist, rvecs, tvecs  cv2.calibrateCamera(pObjs, pImgs, size, None, None)其中rec为成功标志为True时表示标定成功。 
mtx为内参矩阵差不多是 [ f x 0 c x 0 f y c y 0 0 1 ]  [ 5572.47 0 1314.18 0 5573.04 1008.16 0 0 1 ] \begin{bmatrix}f_x0c_x\\0f_yc_y\\001\end{bmatrix} \begin{bmatrix} 5572.4701314.18\\05573.041008.16\\001 \end{bmatrix}    fx000fy0cxcy1      5572.470005573.0401314.181008.161    
dist为畸变参数最多有8个分别表示k1,k2,p1,p2,k3,k4,k5,k6本次标定得到的结果为 print(dist)
[[-8.36577030e-02 -1.68977185e-01 -1.12233478e-03  9.45685802e-04-2.04246147e01]]这些畸变参数的物理意义如下 x ′  x z , y ′  y z , r  x ′ 2  y ′ 2 K  1  k 1 r 2  k 2 r 4  k 3 r 6 1  k 4 r 2  k 5 r 4  k 6 r 6 x ′ ′  K x ′  2 p 1 x ′ y ′  p 2 ( r 2  2 x ′ 2 ) u  f x x ′ ′  c x v  f y y ′ ′  c y \begin{aligned} x\frac{x}{z},\quad y\frac{y}{z},\quad r\sqrt{x^2y^2}\\ K  \frac{1k_1r^2k2_r^4k_3r^6}{1k_4r^2k_5r^4k_6r^6}\\ x  Kx2p_1xyp_2(r^22x^2)\\ uf_xxc_x\\ vf_yyc_y\\ \end{aligned} x′Kx′′uvzx,y′zy,rx′2y′2   1k4r2k5r4k6r61k1r2k2r4k3r6Kx′2p1x′y′p2(r22x′2)fxx′′cxfyy′′cy 
rvecs和tvecs分别表示每个标定板对应的旋转和平移向量。