python双目测距代码
时间: 2023-07-10 07:35:59 浏览: 131
以下是使用 Python 和 OpenCV 实现双目测距的示例代码:
```python
import cv2
import numpy as np
# 左右相机的摄像机内参矩阵和畸变系数
K1 = np.array([[426.178, 0, 309.621], [0, 426.109, 236.785], [0, 0, 1]])
D1 = np.array([[-0.008, 0.086, 0.002, -0.000, 0.000]])
K2 = np.array([[429.553, 0, 303.304], [0, 429.558, 235.312], [0, 0, 1]])
D2 = np.array([[-0.025, 0.296, 0.002, -0.002, 0.000]])
# 左右相机的旋转和平移向量
R = np.array([[0.9999, 0.0003, -0.0107], [-0.0002, 1.0000, -0.0021], [0.0107, 0.0021, 0.9999]])
T = np.array([[-82.4845], [-0.3272], [0.9937]])
# 读取左右相机的图像
imgL = cv2.imread('left.jpg')
imgR = cv2.imread('right.jpg')
# 图像去畸变
imgL = cv2.undistort(imgL, K1, D1)
imgR = cv2.undistort(imgR, K2, D2)
# 立体校正
R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(K1, D1, K2, D2, imgL.shape[1::-1], R, T, flags=cv2.CALIB_ZERO_DISPARITY, alpha=0.9)
mapLx, mapLy = cv2.initUndistortRectifyMap(K1, D1, R1, P1, imgL.shape[1::-1], cv2.CV_32FC1)
mapRx, mapRy = cv2.initUndistortRectifyMap(K2, D2, R2, P2, imgR.shape[1::-1], cv2.CV_32FC1)
imgL = cv2.remap(imgL, mapLx, mapLy, cv2.INTER_LINEAR)
imgR = cv2.remap(imgR, mapRx, mapRy, cv2.INTER_LINEAR)
# 计算视差图
stereo = cv2.StereoSGBM_create(numDisparities=16*5, blockSize=11)
disp = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
# 计算深度图
depth = cv2.reprojectImageTo3D(disp, Q)
depth = depth[:, :, 2]
# 可视化深度图
cv2.imshow('depth', depth / 100)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
需要注意的是,上述代码中的相机参数和图像路径应根据实际情况进行修改。同时,双目测距的精度也会受到多个因素的影响,如相机的畸变、图像的模糊度、匹配算法的参数等等,因此在实际应用中需要进行充分的实验和测试,以保证测距的准确性和稳定性。
阅读全文