要进行单目相机的深度估计 需要先对相机进行相机的标定获得内外参数
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张左右效果会更好