在 OpenCV 中使用 findEssentialMat 时相机姿势不正确

问题描述

我正在 OpenCV 中使用 findEssentialMat 解决相机姿态估计问题。具体给定一组已知姿势的室内场景图像,我需要估计来自同一空间的某个查询图像的姿势。

我已经使用 OpenCV 和 Python 中的基本矩阵从最佳匹配图像中实现了查询图像的姿态估计。我还对对应点进行了失真处理,因为场景图像和查询图像可以由具有不同内在特性的相机捕获。

问题是查询图像的合成姿态与地面实况相差很大,基本矩阵似乎不准确,因为匹配图像非常接近并且相机位移应该非常小。这是我的代码

dist_coeffs = None                                                                                                                                 
# undistort points
pts1 = cv2.undistortPoints(np.expand_dims(pts1,axis=1),cameraMatrix=K_q,distCoeffs=dist_coeffs,R=None,P=np.identity(3))                                                                                                                                                                      
pts2 = cv2.undistortPoints(np.expand_dims(pts2,cameraMatrix=K_v,P=np.identity(3))
thresh = 1.0                                                                                                                                                   
E,mask = cv2.findEssentialMat(pts1,pts2,cameraMatrix=np.identity(3),method=cv2.RANSAC,prob=F_disT,threshold=thresh)
        
_,R_m,t_m,mask = cv2.recoverPose(E,pts1,cameraMatrix=np.identity(3))

根据official documentation,如果points1和points2是来自不同相机内在矩阵的相机的特征点,两个相机使用undistortPoints()和P = cv::NoArray()将图像点转换为归一化的图像坐标,这对身份相机内在矩阵有效。传递这些坐标时,传递此参数的单位矩阵。 以下是基本矩阵和恢复姿势的示例:

Essential matrix                                                                                                                                                        
[[ 0.23120721 -0.35422666  0.45764383]                                                                                                                                   
[ 0.27209477 -0.18381956 -0.52687146]                                                                                                                                   
[-0.32365465  0.34509926  0.04862367]]                                                                                                                                 
Recovering pose                                                                                                                                                         
t_m                                                                                                                                                                     
[[0.47250148]                                                                                                                                                            
[0.47870924]                                                                                                                                                            
[0.73998636]]                                                                                                                                                          
R_m                                                                                                                                                                     
[[ 0.84963004 -0.11140984 -0.51547711]                                                                                                                                   
[-0.10791722  0.92002069 -0.37671715]                                                                                                                                   
[ 0.5162196   0.37569906  0.76965417]]

我的实现是否正确?我是否正确使用了 undistortPoints 和 findEssentialMat 方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)