我正在尝试从视差图中检索3D坐标。我已经获得了一系列积分,但我不确定他们是否可以信任。我使用了OpenCV的常用命令,如下所示。立体摄像机的固有参数已经由一个单独的工具处理,该工具也可以对输入图像进行校正。
import numpy as np
import cv2
from matplotlib import pyplot as plt
imgL = cv2.imread('C:/Internship/left010.flt.pgm',0)
imgR = cv2.imread('C:/Internship/right010.flt.pgm',0)
#Calculate disparity
stereo = cv2.StereoSGBM(minDisparity = 0, numDisparities = 160, SADWindowSize = 11, disp12MaxDiff = 1, uniquenessRatio = 20, speckleWindowSize = 100, speckleRange = 2)
disparity = stereo.compute(imgL,imgR)/16
#Calculate Q matrix
cx = 630.0493
cy = 472.6702
fx = 1887.663
fy = 1880.201
cameraMatrix1 = np.mat([[fx, 0, 0],[0, fy, 0],[cx, cy, 1]])
cameraMatrix2 = np.mat([[fx, 0, 0],[0, fy, 0],[cx, cy, 1]])
distCoeffs1 = np.array([0,0,0,0,0])
distCoeffs2 = np.array([0,0,0,0,0])
R = np.mat([[0.9743, 0.0335, -0.2227],[-0.0379, 0.9991, -0.0155], [0.2220, 0.0236, 0.9747]])#Rotation Matrix
T = np.array([ 0.2042, -0.0019, 0.0313]) #Translation Vector
R1 = np.mat(np.empty((3,3)))
R2 = np.float32(np.empty((3,3)))
P1 = np.float32(np.empty((3,4)))
P2 = np.float32(np.empty((3,4)))
Q = np.float32(np.empty((4,4)))
cv2.stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, (w,h), R, T, R1, R2, P1, P2, Q, cv2.CALIB_ZERO_DISPARITY, -1, (0,0))
#Calculate3Dpoints
points = cv2.reprojectImageTo3D(disparity, Q)
查看图片
我怀疑的原因是我在"点"矩阵。例如,Z值的范围为[-388.438,-194.219,..., - 2.443,388.438,inf]。我不确定这是否是因为视差图中的缺陷像素。 我试图通过使用x和y坐标创建一个掩码切片原始图像的一部分,它确实给了我一些输出,请看下面:
z = points[:,:,2]
val, count = np.unique(z, return_counts = True)
rec = np.logical_and(z>-300, z< -5)
mask = np.invert(rec)
imgL[mask] = 0
plt.imshow(imgL,'gray')
plt.show()
输出图像是我想如果任何图像在某个随机点被索引,那么就会有一些输出图像。所以基本上,我想检查3D点的有效性,我不知道如何。请帮我核实一下。如果需要任何进一步的信息,请现在就告诉我。