opencv - 使用OpenCV重建3D对象

标签 opencv camera calibration

我正在遵循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)
    
  • 重建给定Z的特征点的3D坐标。这里有两个问题。首先,我不知道如何重建3D坐标。 2.执行此操作时,应使用原始摄像机矩阵“mtx”还是新摄像机矩阵“newcameramtx”。而“roi”呢?我应该在哪里申请?

  • 非常感谢你。

    最佳答案

    看一下文档的this version,我发现它更易于阅读。关键方程式是这个:

    camera equation

    一旦您的图像未失真,该方程式即适用。具有fx,fy,cx和cy的矩阵是您的相机矩阵,通常称为M。

    该方程式告诉您如何从左侧的2D像素位置(x,y)转到世界上的3D位置(右侧的[X,Y,Z])。

    First, I do not know how to reconstruct the 3D coordinate



    为此,我们可以应用等式。给定一个像素位置和一个范围(以w插入),我们有:

    inv M

    我们可以这样在代码中执行以下操作:
    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/

    相关文章:

    ios - Codenameone 编译错误尝试为 IOS 编译(调试)并出现相机错误

    ios - iPhone 相机访问权限?

    python - 使用Python消除视频中的冗余帧

    opencv - 为什么 dpkg 和 pkg-config 中 OpenCV 版本不同

    c# - 从指针创建 Mat,调整它的大小并将指针返回到新的 mat

    java - 如何使用额外选项(如全景)实现相机功能?

    python - 如何更改此 python 行以使其读取其最新时间戳的图像而不说明特定的图像名称?

    opencv - 使用opencv进行多摄像机校准:两个摄像机彼此相对

    opencv - cvUndistort2() 和 cvRemap() 崩溃

    python - Cv2 findChessboardCorners 无法找到角点