如何解决将2D图像点转换为Z!= 0
以下代码将检测到的2D图像点转换为3D世界中定义的平面网格上3D位置。 这意味着Z = 0,并且考虑到外部和本征是已知的,我们可以计算检测到的2D图像点的相应3D_point:
import cv2
import numpy as np
#load extrinsics & intrinsics
with np.load('parameters_cam1.npz') as X:
mtx,dist = [X[i] for i in ('mtx','dist','rvecs','tvecs')]
with np.load('extrincic.npz') as X:
rvecs1,tvecs1 = [X[i] for i in('rvecs1','tvecs1')]
#prepare rotation matrix
R_mtx,jac=cv2.Rodrigues(rvecs1)
#prepare projection matrix
Extrincic=cv2.hconcat([R_mtx,tvecs1])
Projection_mtx=mtx.dot(Extrincic)
#delete the third column since Z=0
Projection_mtx = np.delete(Projection_mtx,2,1)
#finding the inverse of the matrix
Inv_Projection = np.linalg.inv(Projection_mtx)
#detected image point (extracted from a que)
img_point=np.array([pts1_blue[0]])
#adding dimension 1 in order for the math to be correct (homogeneous coordinates)
img_point=np.vstack((img_point,np.array(1)))
#calculating the 3D point which located on the 3D plane
3D_point=Inv_Projection.dot(img_point)
#show results
print('3D_pt_method1\n',3D_point)
#output
3D_pt_method1
[[0.01881387]
[0.0259416 ]
[0.04150276]]
通过归一化点(除以第三个值),结果是
`X_World=0.45331611680765327 # 45.3 cm from defined world point cm which is correct
Y_world=0.6250572251098481 # 62.5 cm which is also correct
通过评估结果,结果证明它们是正确的。
我现在无法获取3D世界点的Z坐标,因为深度信息丢失从3d变为2d。以下等式还执行了2D点到3D世界上的反投影,并且可以在所有文献中找到,其结果是一个等式,代表了3D_世界点必须位于其上的线
我将公式3.15放入了代码中,但是没有设置Z = 0,这意味着我不像以前的方法那样删除投影矩阵的第三列(就像写的一样) ),请执行以下操作:
#inverting the rotation matrix
INV_R=np.linalg.inv(R_mtx)
#inverting the camera matrix
INV_k=np.linalg.inv(mtx)
#multiplying the tow matrices
kinv_Rinv=INV_k.dot(INV_R)
#calcuating the 3D_point X which expressed in eq.3.15
3D_point=kinv_Rinv.dot(img_point)+tvecs1
#print the results
print('3D_pt_method2\n',3D_point)
结果是
3D_pt_method2 #how should one understand these coordinates ?
[[-9.12505825]
[-5.57152147]
[40.12264881]]
我的问题是,我应该如何理解或解释该结果?因为与之前的方法Z = 0相比,它没有任何意义。 3D 3x1结果向量似乎直觉到它的值仅代表检测到的image_point的3D X,Y和Z。但是,如果将X和Y与先前的方法进行比较,那将是不正确的!
那么3D_pt_method1和3D_pt_method2之间的区别是什么?
希望我能表达自己的看法,并非常感谢帮助我了解两种实现方式之间的区别!
注意:代表我定义的世界平面的网格,可以在下图中看到,其中每两个黄色点之间的距离为40厘米
预先感谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。