用OpenCV重建三维物体
我正在按照OpenCV相机校准教程运行相机校准用OpenCV重建三维物体,opencv,camera,calibration,Opencv,Camera,Calibration,我正在按照OpenCV相机校准教程运行相机校准 ret、mtx、dist、rvecs、tvecs=cv2.calibleCamera(objpoints、imgpoints、gray.shape[:-1],无,无) 接下来我要做的是重建一些特征点的三维位置。特征点在图像空间中定义。以下是我的计划: 找到新的相机矩阵: h,w=我的图像尺寸 newcameramtx,roi=cv2.GetOptimizeNewCameraMatrix(mtx,dist,(w,h),1,(w,h)) 取消对要素
ret、mtx、dist、rvecs、tvecs=cv2.calibleCamera(objpoints、imgpoints、gray.shape[:-1],无,无)
接下来我要做的是重建一些特征点的三维位置。特征点在图像空间中定义。以下是我的计划:
h,w=我的图像尺寸
newcameramtx,roi=cv2.GetOptimizeNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
new_points=cv2.不失真点(我的功能点,mtx,dist,P=newcameramtx)
pixels = [x, y, range]
XYZ = np.mult( np.linalg.inv(mtx), pixels)
我不确定你是否想打电话,因为这会裁剪出可能无效的像素。在你对系统有更好的了解之前,我会暂时跳过这一步。ROI告诉你未失真的图像在哪里不会有任何空白像素
我真的很推荐学习OpenCV(或新版本3)这本书;它帮了我很大的忙。我从阅读文档(假设有很多先验知识)变得非常沮丧,到真正理解正在发生的事情。看看这些文档,我发现它们更容易阅读。关键的等式是:
一旦你的图像没有失真,这个方程就适用了。带有fx、fy、cx和cy的矩阵就是你的相机矩阵,通常称为M
这个方程告诉你如何从左边的2D像素位置(x,y)到世界上的3D位置(右边的[x,y,Z])
首先,我不知道如何重建三维坐标
为此,我们可以应用方程。给定像素位置和范围(插入为w),我们有:
我们可以在代码中这样做:
pixels = [x, y, range]
XYZ = np.mult( np.linalg.inv(mtx), pixels)
我不确定你是否想打电话,因为这会裁剪出可能无效的像素。在你对系统有更好的了解之前,我会暂时跳过这一步。ROI告诉你未失真的图像在哪里不会有任何空白像素
我真的很推荐学习OpenCV(或新版本3)这本书;它帮了我很大的忙。它让我从阅读文档(假定有很多先验知识)的沮丧中解脱出来要真正理解发生了什么。您的问题格式不正确,请以可读的方式提出您的问题格式不正确,请以可读的方式提出谢谢您的帖子。1)我需要致电getOptimalNewCameraMatrix,因为newcameramtx需要取消我的功能点。2)我如何获得“范围”?另外,我认为像素=[xZ,yZ,Z]范围就是“为给定的Z重建特征点的三维坐标”中的Z。2D图像不能告诉你任何给定点的范围——你需要一个立体装置或类似的装置。像素=[x,y,range],这些x和y值是图像上的整数坐标。正如我提到的,如果我使用你提出的公式,结果是不正确的。如果我设置像素=[xZ,yZ,Z],但是,结果是正确的参见此处的工作示例谢谢您的帖子。1)我需要调用GetOptimizeNewCameraMatrix,因为newcameramtx需要取消对我的特征点的扭曲。2)我如何获得“范围”?另外,我认为像素=[xZ,yZ,Z]范围是“重建给定Z的特征点的三维坐标”中的Z“2D图像不能告诉你任何给定点的范围——你需要一个立体装置或类似的东西。在像素=[x,y,range]中,这些x和y值是图像上的整数坐标。正如我提到的,如果我使用你提出的公式,结果是不正确的。但是,如果我设置像素=[xZ,yZ,Z],结果是正确的,请参见这里的工作示例