Tôi đang cố lấy bản đồ độ sâu bằng một phương pháp chưa được hiệu chỉnh. Tôi có thể có được ma trận cơ bản bằng cách tìm các điểm tương ứng với SIFT và sau đó sử dụng cv2.findFundamentalMat
. Sau đó, tôi sử dụng cv2.stereoRectifyUncalibrated
để lấy ma trận đồng nhất cho mỗi hình ảnh. Cuối cùng, tôi sử dụng cv2.warpPerspective
để điều chỉnh và tính toán sự chênh lệch, nhưng điều này không tạo ra một bản đồ độ sâu tốt. Các giá trị này rất cao vì vậy tôi đang tự hỏi liệu tôi có phải sử dụng warpPerspective
hay không hoặc liệu tôi có phải tính toán một ma trận xoay từ các ma trận đồng nhất mà tôi đã có stereoRectifyUncalibrated
.
Tôi không chắc về ma trận xạ ảnh với trường hợp của ma trận đồng nhất thu được với stereoRectifyUncalibrated
để chỉnh lưu.
Một phần của mã:
#Obtainment of the correspondent point with SIFT
sift = cv2.SIFT()
###find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(dst1,None)
kp2, des2 = sift.detectAndCompute(dst2,None)
###FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
good = []
pts1 = []
pts2 = []
###ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance < 0.8*n.distance:
good.append(m)
pts2.append(kp2[m.trainIdx].pt)
pts1.append(kp1[m.queryIdx].pt)
pts1 = np.array(pts1)
pts2 = np.array(pts2)
#Computation of the fundamental matrix
F,mask= cv2.findFundamentalMat(pts1,pts2,cv2.FM_LMEDS)
# Obtainment of the rectification matrix and use of the warpPerspective to transform them...
pts1 = pts1[:,:][mask.ravel()==1]
pts2 = pts2[:,:][mask.ravel()==1]
pts1 = np.int32(pts1)
pts2 = np.int32(pts2)
p1fNew = pts1.reshape((pts1.shape[0] * 2, 1))
p2fNew = pts2.reshape((pts2.shape[0] * 2, 1))
retBool ,rectmat1, rectmat2 = cv2.stereoRectifyUncalibrated(p1fNew,p2fNew,F,(2048,2048))
dst11 = cv2.warpPerspective(dst1,rectmat1,(2048,2048))
dst22 = cv2.warpPerspective(dst2,rectmat2,(2048,2048))
#calculation of the disparity
stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET,ndisparities=16*10, SADWindowSize=9)
disp = stereo.compute(dst22.astype(uint8), dst11.astype(uint8)).astype(np.float32)
plt.imshow(disp);plt.colorbar();plt.clim(0,400)#;plt.show()
plt.savefig("0gauche.png")
#plot depth by using disparity focal length `C1[0,0]` from stereo calibration and `T[0]` the distance between cameras
plt.imshow(C1[0,0]*T[0]/(disp),cmap='hot');plt.clim(-0,500);plt.colorbar();plt.show()
Dưới đây là các hình ảnh đã được chỉnh sửa bằng phương pháp chưa hiệu chỉnh (và warpPerspective
):
Dưới đây là những hình ảnh đã được hiệu chỉnh với phương pháp đã được hiệu chỉnh:
Tôi không biết làm thế nào sự khác biệt là rất quan trọng giữa hai loại hình ảnh. Và đối với phương pháp đã hiệu chỉnh, nó dường như không được căn chỉnh.
Bản đồ chênh lệch sử dụng phương pháp chưa hiệu chỉnh:
Độ sâu được tính với: C1[0,0]*T[0]/(disp)
với T từ stereoCalibrate
. Các giá trị rất cao.
------------ CHỈNH SỬA SAU ------------
Tôi đã cố gắng "gắn" ma trận tái tạo ( [Devernay97] , [Garcia01] ) với ma trận đồng nhất thu được với "stereoRectifyUncalibrated", nhưng kết quả vẫn không tốt. Tôi đang làm điều này một cách chính xác?
Y=np.arange(0,2048)
X=np.arange(0,2048)
(XX_field,YY_field)=np.meshgrid(X,Y)
#I mount the X, Y and disparity in a same 3D array
stock = np.concatenate((np.expand_dims(XX_field,2),np.expand_dims(YY_field,2)),axis=2)
XY_disp = np.concatenate((stock,np.expand_dims(disp,2)),axis=2)
XY_disp_reshape = XY_disp.reshape(XY_disp.shape[0]*XY_disp.shape[1],3)
Ts = np.hstack((np.zeros((3,3)),T_0)) #i use only the translations obtained with the rectified calibration...Is it correct?
# I establish the projective matrix with the homography matrix
P11 = np.dot(rectmat1,C1)
P1 = np.vstack((np.hstack((P11,np.zeros((3,1)))),np.zeros((1,4))))
P1[3,3] = 1
# P1 = np.dot(C1,np.hstack((np.identity(3),np.zeros((3,1)))))
P22 = np.dot(np.dot(rectmat2,C2),Ts)
P2 = np.vstack((P22,np.zeros((1,4))))
P2[3,3] = 1
lambda_t = cv2.norm(P1[0,:].T)/cv2.norm(P2[0,:].T)
#I define the reconstruction matrix
Q = np.zeros((4,4))
Q[0,:] = P1[0,:].T
Q[1,:] = P1[1,:].T
Q[2,:] = lambda_t*P2[1,:].T - P1[1,:].T
Q[3,:] = P1[2,:].T
#I do the calculation to get my 3D coordinates
test = []
for i in range(0,XY_disp_reshape.shape[0]):
a = np.dot(inv(Q),np.expand_dims(np.concatenate((XY_disp_reshape[i,:],np.ones((1))),axis=0),axis=1))
test.append(a)
test = np.asarray(test)
XYZ = test[:,:,0].reshape(XY_disp.shape[0],XY_disp.shape[1],4)