利用消失点和消失线进行相机标定

相机标定就是求出相机模型的内参和外参。

小孔相机模型:
https://www.cnblogs.com/cold-city/p/10010422.html

消失点:在现实世界中平行的两条线,在图像中相交的点。

消失线:由水平(或竖直)方向上的消失点组成的线。

u84sGBi.png

利用消失点进行相机标定。

获取内参参数u0,v0,f:

消失点的重要性质:

消失点与光心的连线,平行于形成该消失点平面的平行线平行。

D5imQsi.png

所以在空间中互相垂直的平行线,对应的消失点与相机光心的连线互相垂直。

g9huviE.png

pi是消失点对应的像素坐标系,K是内参矩阵,R是旋转矩阵,Xi是消失点对应的世界坐标系。

求解方程:

8BGCkeY.png

对应求三个参数需要三个消失点联立成三个方程进行求解。

求对应的旋转矩阵R=[R1,R2,R3],把右侧消失点与光心的连线作为X轴,对应的世界坐标系为[1,0,0],把左侧消失点与光心的连线作为Z轴,对应的世界坐标系为[0,0,1],把竖直方向的消失点与光心的连线作为Y轴,对应的世界坐标系为[0,1,0],求解方程为:

JN45Qsn.png

VPRight=K[R1,R2,R3][1,0,0]T

VPLeft=K[R1,R2,R3][0,0,1]T

VPTop=K[R1,R2,R3][0,1,0]T

AELjTy1.png

转载于:https://www.cnblogs.com/cold-city/p/10006685.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
相机标定是指确定相机的内部参数(如焦距、主位置等)和外部参数(如旋转矩阵、平移向量等),以便在三维空间中精确地测量物体的位置和大小。利用棋盘格进行相机标定是一种常用的方法。 下面是Python中使用OpenCV进行棋盘格标定的步骤: 1. 采集棋盘格图像 首先在棋盘格上贴上黑白相间的方块,然后使用相机拍摄这个棋盘格的多个角度的图像。注意拍摄时棋盘格应该保持平整,光线应该充足并且均匀。 2. 检测棋盘格角 使用OpenCV中的cv2.findChessboardCorners()函数来检测棋盘格角。该函数会返回一个布尔值和一个角数组。如果找到了角,则布尔值为True,否则为False。角数组包含了所有检测到的角的坐标。 3. 标定相机 将检测到的角坐标传递给cv2.calibrateCamera()函数进行相机标定。该函数会返回相机的内部参数(如相机矩阵、畸变系数等)和外部参数(如旋转矩阵、平移向量等)。 4. 优化标定结果 使用cv2.undistort()函数将图像进行校正,以获得更好的结果。 下面是完整的Python代码示例: ```python import numpy as np import cv2 # 定义棋盘格大小 chessboard_size = (9, 6) # 准备棋盘格图像 objp = np.zeros((np.prod(chessboard_size), 3), np.float32) objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2) obj_points = [] img_points = [] # 读取棋盘格图像 images = glob.glob('calibration_images/*.jpg') # 遍历所有图像 for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测棋盘格角 ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None) # 如果找到了角 if ret == True: obj_points.append(objp) img_points.append(corners) # 在图像中绘制角 cv2.drawChessboardCorners(img, chessboard_size, corners, ret) # 显示当前图像 cv2.imshow('img', img) cv2.waitKey(500) # 标定相机 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None) # 优化标定结果 img = cv2.imread('calibration_images/1.jpg') h, w = img.shape[:2] new_mtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) # 显示校正后的图像 dst = cv2.undistort(img, mtx, dist, None, new_mtx) cv2.imshow('dst', dst) cv2.waitKey(0) # 保存标定结果 np.savez('calibration.npz', ret=ret, mtx=mtx, dist=dist, rvecs=rvecs, tvecs=tvecs) ``` 该代码将棋盘格图像存放在calibration_images文件夹中。在运行脚本之后,程序会依次显示每个棋盘格图像,并在图像中绘制出检测到的角。最后,程序会将标定结果保存在calibration.npz文件中,并显示校正后的第一张图像。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值