为了验证用于估计相机姿态[R | t]的两 View SFM方法的结果,我使用了用于校准的棋盘图案,尤其是OpenCV中的“calibrateCamera”函数返回每种图案的旋转和平移 vector 。因此,假设前两个模式之间的相对姿势很容易计算。
但是我没有得到正确的相机姿势,我一直在努力地解决问题,但是没有白费。
非常感谢您为解决我的问题所做的贡献。
我的代码说明:
FundMat, mask = cv2.findFundamentalMat(imgpoints1, imgpoints2, cv2.FM_LMEDS)
# is the fundamental matrix is really a fundamental Matrix. xFx'=0 ??
# verfication of fundamental matrix
for i in range(len(imgpoints1)):
X = np.array([imgpoints1[i][0],imgpoints1[i][1],1])
X_prime = np.array([imgpoints2[i][0],imgpoints2[i][1],1])
err = np.dot(np.dot(X_prime.T,FundMat),X)
if mask[i] == True:
print(err)
# E = [t]R = (K_-T)_-1 * F * K = K_T*F*K
term1 = np.dot(np.transpose(mtx), FundMat) # newcameramtx , mtx
E = np.dot(term1, mtx) # newcameramtx , mtx
# verfication of Essential matrix
for i in range(len(imgpoints1)):
X_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints1[i][0],imgpoints1[i][1],1]).T)
X_prime_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints2[i][0],imgpoints2[i][1],1]).T)
err_Ess = np.dot(np.dot(X_prime_norm.T,E),X_norm)
if mask[i] == True:
print(err_Ess)
# SVD of E
U,S,V_T = np.linalg.svd(E)
# computation of Rotation and Translation without enforcement
W = np.array([[0,-1,0],[1,0,0],[0,0,1]])
Rot1 = np.dot(np.dot(U, W), V_T)
Rot2 = np.dot(np.dot(U, W.T), V_T)
最佳答案
您的问题是您正在使用棋盘上的点:无法从共面点估计基本矩阵。解决此问题的一种方法是使用通用方法(如SIFT或SURF)匹配场景点。另一种方法是直接使用5点算法估算基本矩阵,因为基本矩阵可以从共面点计算得出。
另外,请记住,您只能根据Essential矩阵按比例计算摄像机的姿态。换句话说,您的翻译最终将成为单位 vector 。计算比例因子以获得实际翻译长度的一种方法是使用棋盘。
关于python - 两 View SFM中相机姿势不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38600871/