手机相机的标定 ——单目相机三维建模(1)

要进行单目相机的深度估计 需要先对相机进行相机的标定获得内外参数

0.相机标定是确定相机的内部参数和外部参数的过程,包括确定相机的焦距、光心坐标、畸变系数、相机在世界坐标系中的旋转和平移等参数。

相机标定的作用如下:

1. 三维重建:通过相机标定,可以将图像中的二维点对应到三维空间中的实际点,从而进行三维重建。标定参数可以用于将图像坐标转换为世界坐标,从而实现三维点云的生成。

2. 姿态估计:通过相机标定,可以获得相机在世界坐标系中的旋转和平移参数。这些参数可以用于估计相机在不同姿态下的位置和朝向,从而实现姿态估计。

3. 畸变矫正:相机镜头的畸变会导致图像中的直线变形和形状失真。通过相机标定,可以获得畸变系数,进而对图像进行畸变矫正,使得图像中的直线保持直线,形状更加准确。

4. 视场调节:标定参数中的视场调节参数矩阵可以用于调整图像的视场大小。在相机标定后,可以根据需要调整视场大小,从而实现对图像的裁剪和缩放。

综上所述,相机的标定为单目相机三维建模提供了基础的几何参数,使得图像中的二维信息能够与实际的三维空间相对应,从而实现了三维重建、姿态估计和畸变矫正等应用。

1.参考了大佬的代码

(7)点云数据处理学习——单摄像头深度估计_摄像头获取点云数据-CSDN博客

直接下载的棋盘格pdf

https://pan.baidu.com/s/1Y79x9o9siHOZ5gQXUBdwjA 提取码:nxy7

2.根据自己的路径运行代码

import cv2
import numpy as np
import glob

savepath = 'E:/img/img00xj/'
# 找棋盘格角点
# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)  # 阈值

# 棋盘格模板规格
w = 8  # 9 - 1
h = 6  # 6  - 1

# 实际打印方格尺寸
real_size = 30  # mm
# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w * h, 3), np.float32)
objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)
objp = objp * real_size  # 30 mm

# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = []  # 在世界坐标系中的三维点
imgpoints = []  # 在图像平面的二维点
# 加载pic文件夹下所有的jpg图像
images = glob.glob(savepath + '*.jpg')  # 拍摄的十几张棋盘图片所在目录

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w, h), None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        # 在原角点的基础上寻找亚像素角点
        cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        # 追加进入世界三维点和平面二维点中
        objpoints.append(objp)
        imgpoints.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w, h), corners, ret)
        cv2.namedWindow('findCorners', cv2.WINDOW_NORMAL)
        cv2.resizeWindow('findCorners', 640, 480)
        cv2.imshow('findCorners', img)
        cv2.waitKey(200)
cv2.destroyAllWindows()

## 标定
print('正在计算')
# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

print("ret:", ret)
print("mtx:\n", mtx)  # 内参数矩阵
print("dist畸变值:\n", dist)  # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs旋转(向量)外参:\n", rvecs)  # 旋转向量  # 外参数
print("tvecs平移(向量)外参:\n", tvecs)  # 平移向量  # 外参数
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, gray.shape[::-1], 0, gray.shape[::-1])
print('newcameramtx视场调节参数矩阵', newcameramtx)

print('保存摄像头参数:视场调节参数矩阵,重要!!')
cv_file = cv2.FileStorage('cameraIntrinsic.xml', cv2.FILE_STORAGE_WRITE)
cv_file.write('intrinsic', newcameramtx)
cv_file.release()

# 使用标定参数进行畸变矫正
for fname in images:
    img = cv2.imread(fname)
    h, w = img.shape[:2]
    dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
    cv2.imshow('Undistorted Image', dst)
    cv2.waitKey(200)
cv2.destroyAllWindows()

3.运行结果

ret: 7.9194946779862825
mtx:
 [[3.53194003e+03 0.00000000e+00 1.81421928e+03]
 [0.00000000e+00 3.55130260e+03 1.50503635e+03]
 [0.00000000e+00 0.00000000e+00 1.00000000e+00]]
dist畸变值:
 [[ 0.08326691 -1.66389884 -0.01349785  0.00436373  4.34625061]]
rvecs旋转(向量)外参:
 (array([[-0.41245757],
       [-0.46992303],
       [-1.46973774]]), array([[ 0.1156888 ],
       [-0.44008065],
       [-1.46608857]]), array([[-0.35775858],
       [ 0.21834266],
       [ 1.49402068]]), array([[0.24087109],
       [0.20492268],
       [1.53299076]]), array([[-0.41245757],
       [-0.46992303],
       [-1.46973774]]), array([[ 0.1156888 ],
       [-0.44008065],
       [-1.46608857]]), array([[-0.35775858],
       [ 0.21834266],
       [ 1.49402068]]), array([[0.24087109],
       [0.20492268],
       [1.53299076]]))
tvecs平移(向量)外参:
 (array([[-120.82248779],
       [  56.67316571],
       [ 292.4395498 ]]), array([[-65.01617223],
       [ 85.96632583],
       [362.54815002]]), array([[  44.97289764],
       [-163.57882158],
       [ 412.10740185]]), array([[  2.54795884],
       [-93.82990154],
       [368.88312962]]), array([[-120.82248779],
       [  56.67316571],
       [ 292.4395498 ]]), array([[-65.01617223],
       [ 85.96632583],
       [362.54815002]]), array([[  44.97289764],
       [-163.57882158],
       [ 412.10740185]]), array([[  2.54795884],
       [-93.82990154],
       [368.88312962]]))
newcameramtx视场调节参数矩阵 [[5.68238379e+03 0.00000000e+00 1.51479573e+03]
 [0.00000000e+00 5.21232861e+03 2.06020205e+03]
 [0.00000000e+00 0.00000000e+00 1.00000000e+00]]
保存摄像头参数:视场调节参数矩阵,重要!!

4.每一个参数表达的意思

 

在标定完成后,输出了一些参数值:

- `ret`:标定的误差,表示标定的准确度,数值越小越好。
- `mtx`:内参数矩阵,包含相机的焦距和光心的坐标。
- `dist`:畸变系数,包含径向畸变和切向畸变的参数。
- `rvecs`:旋转向量,表示相机在世界坐标系中的旋转。
- `tvecs`:平移向量,表示相机在世界坐标系中的平移。
- `newcameramtx`:视场调节参数矩阵,用于畸变矫正时调整图像的视场。

这些参数对于后续的相机校正和畸变矫正非常重要。可以使用这些参数来进行相机姿态估计、三维重建等操作。

如果你想了解更多关于相机标定和畸变矫正的细节,请参考OpenCV官方文档:[Camera Calibration and 3D Reconstruction](https://docs.opencv.org/4.5.2/dc/dbb/tutorial_py_calibration.html)。

这次图片比较少只拍了6张   估计20张左右效果会更好

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV是一个流行的开源计算机视觉库,它提供了许多算法和函数,用于处理和分析图像和视频。单目相机三维点云重建是利用单个摄像机捕获图像,并在去除重复特征点后,使用三角化技术重建相应的三维点云模型。 在OpenCV中实现单目相机三维点云重建可以分为以下三个步骤: 1. 特征点提取:利用OpenCV中提供的特征点检测算法,如SIFT、SURF、ORB等,检测图像中的关键点,并提取它们的描述子。 2. 特征匹配:利用OpenCV中提供的特征匹配算法,如Brute-Force、FLANN等,将两幅图像中的关键点进行匹配,找出它们的对应关系。 3. 三角化:利用OpenCV中提供的三角化函数,如triangulatePoints(),将以相机坐标系为基准的两组匹配点对应的二维坐标以及相机内参,通过三角化计算出对应的三维坐标。 通过以上步骤的处理,我们可以得到相机捕获的场景中点的三维坐标,从而实现单目相机三维点云的重建。值得注意的是,在实际应用中,还需要对数据进行滤波、后处理等,以提高重建结果的精度及其可用性。 ### 回答2: OpenCV是一个开源的计算机视觉库,可以通过使用该库来进行单目相机三维点云重建。这个过程中需要使用计算机视觉技术来获取图像中的三维信息。 在单目相机三维点云重建中,首先需要进行相机标定标定相机的内外参数可以通过多种方式实现,比如使用标定板、棋盘等进行标定标定完成后,需要通过相机拍摄图片获取相机的外参,即摄像机位置和朝向。 在获取相机拍摄的图片后,需要进行图像处理。首先对图片进行校正,使其符合实际拍摄场景的比例和形状。然后使用图像处理算法,如SIFT、SURF等算法进行图像匹配。这些算法可以在不同的图像之间进行匹配,从而确定它们之间的位置和角度。 在确定相机的内部和外部参数后,可以使用三角化方法实现三维点云重建。通过使用匹配的图像点对和相机的内部和外部参数,可以将这些点投影到三维空间中,并计算它们的相对位置。最终可以得到一个点云数据,其中每个点都表示一个真实世界中的三维点。 单目相机三维点云重建是一个非常有用的技术,可以用于测量实际场景中物体的空间位置和形状。它可以应用于机器人、计算机辅助设计、电影视觉特效以及许多其他领域。通过使用OpenCV库可以轻松实现单目相机三维点云重建,提高工作效率和准确性。 ### 回答3: OpenCV是一种流行的计算机视觉库,可以在单目相机图像中实现三维点云重建。但是,单个图像提供了有限的信息,因此必须使用多个图像来重建三维点云。一种广泛采用的方法是使用结构光法进行三维重建,它涉及使用多个图像以及灯光和相机投影的几何形状。在此过程中,设置计算机视觉算法来提取所需的参数,例如摄像机的内部参数、外部参数和畸变参数。 在OpenCV中,可以使用Sift或Surf等特征检测器和匹配器来匹配多个图像。然后通过对齐多个图像,使用三角测量算法重建三维点云。三角测量算法涉及计算相机到图像上特征点的距离以推断对应的三维坐标。这些计算可以在一个透视变换算法中实现。 要正确进行三维点云重建,必须考虑许多因素,例如相机的内部和外部参数、环境光、摄像机姿势和畸变校正。与这些问题相关的算法在OpenCV中都是可用的,因此它是一种强大而广泛采用的工具,可用于单目相机三维点云重建。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值