我正在遵循OpenCV相机校准教程https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html来运行相机校准
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
接下来,我要重建一些特征点的3D位置。特征点在图像空间中定义。这是我计划要做的事情:
h, w = my image dimension
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
new_points= cv2.undistortPoints(my_feature_points, mtx, dist, P=newcameramtx)
非常感谢你。
最佳答案
看一下文档的this version,我发现它更易于阅读。关键方程式是这个:
一旦您的图像未失真,该方程式即适用。具有fx,fy,cx和cy的矩阵是您的相机矩阵,通常称为M。
该方程式告诉您如何从左侧的2D像素位置(x,y)转到世界上的3D位置(右侧的[X,Y,Z])。
First, I do not know how to reconstruct the 3D coordinate
为此,我们可以应用等式。给定一个像素位置和一个范围(以w插入),我们有:
我们可以这样在代码中执行以下操作:
pixels = [x, y, range]
XYZ = np.mult( np.linalg.inv(mtx), pixels)
我不确定您是否要调用getOptimalNewCameraMatrix,因为这会裁剪出可能无效的像素。我暂时将其跳过,直到您对系统有了更好的了解。 ROI告诉您未失真的图像在哪里不会有任何空白像素。
我真的推荐这本书《学习OpenCV》(或新版本3);它帮了我很大的忙。从真正沮丧的阅读文档(假设有很多先验知识)开始,到真正理解正在发生的事情,这使我陷入了困境。
关于opencv - 使用OpenCV重建3D对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61978785/