gpt4 book ai didi

python - 使用视差图进行距离测量

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:33 25 4
gpt4 key购买 nike

我正在使用 OpenCP 和 Python 进行 3D 重建和距离测量。我为左摄像头生成视差图,然后使用此公式计算距离:

D=(f*b/disp)

其中f是焦距,b是两个摄像头之间的距离,disp是视差图的矩阵。

我的问题是:

我得到的数字,他们应该是图片中每个点的距离吗?

使用此方法我可以获得的最大距离是多少(例如,在我的项目中,我获得的最大距离是 110)?

img_L = cv2.pyrDown( cv2.imread(Li) )
img_R = cv2.pyrDown( cv2.imread(Ri) )
'''h, w = img_L.shape[:2]
diff=(6,6,6)
mask=np.zeros((h+2,w+2),np.uint8)
window_size = 3
min_disp = 16
num_disp = 112-min_disp
stereo = cv2.StereoSGBM(minDisparity = min_disp,
numDisparities = num_disp,
SADWindowSize = window_size,
uniquenessRatio = 10,
speckleWindowSize = 100,
speckleRange = 32,
disp12MaxDiff = 1,
P1 = 8*3*window_size**2,
P2 = 32*3*window_size**2,
fullDP = False
)
print "computing disparity..."
disp = stereo.compute(img_L, img_R).astype(np.float32) / 16.0

print "generating 3d point cloud..."
h, w = img_L.shape[:2]
f = 0.8*w # guess for focal length
points = cv2.reprojectImageTo3D(disp, Mat)
colors = cv2.cvtColor(img_L, cv2.COLOR_BGR2RGB)
mask = disp > disp.min()
cv2.imshow('left', img_L)
disparity=(disp-min_disp)/num_disp
cv2.imshow('disparity',disparity )
b=6.50
D=b*f/disp
cv2.waitKey()
cv.DestroyAllWindows()
return D

最佳答案

您使用此公式获得的值 D 是您为其提供视差的每个点的深度

深度距离 是两个略有不同的东西。如果您使用相机的标准坐标系(即沿光轴的 Z 轴,沿图像 X 和 Y 轴方向的 X 和 Y 轴),则 3D 点 M = (X, Y, Z ) 与光学中心的距离为 sqrt(X²+Y²+Z²),深度为 Z。公式中的D是深度,不是距离。

如果你想从深度值中检索 3D 点 M = (X, Y, Z),你需要知道相机矩阵 K:M = D * inv(K) * [u; v; 1],其中(u, v)为该点的图像坐标。

编辑:关于您的第二个问题,您可以使用此方法获得的最大深度与最小差异相关联(不是最大值,因为 disp 在分母)。由于视差估计是量化的(逐个像素地完成),因此您无法估计无限大的深度。

关于python - 使用视差图进行距离测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23581238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com