【问题标题】:Problem with type Point3f in function cv2.calibrateCamera PYTHON函数 cv2.calibrateCamera PYTHON 中类型 Point3f 的问题
【发布时间】:2022-01-20 05:16:45
【问题描述】:

大家早上好!

我在使用 opencv 函数 calibrateCamera 时遇到了以下错误:

OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\calib3d\src\calibration.cpp:3350: error: (-210:Unsupported format or combination of formats) objectPoints should contain vector函数'cv::collectCalibrationData'中Point3f类型点的向量

我试图找到解决方案,但除了类型问题或长度问题外,在任何地方都找不到任何东西。 我对 objPoints 和 imgPoints 都使用了 float 32 类型的 np.array:

objpoints = np.array(objpoints,dtype = np.float32) imgpoints = np.array(imgpoints,dtype = np.float32) ret,mtx,dist,rvecs,tvecs = cv2.calibrateCamera(objpoints,imgpoints,imsize,无,无)

变量资源管理器为使用的变量提供以下值:

在:对象点 出去: 数组([[ 0. , 246.5, 0. ], [ 14.5, 246.5, 0. ], [ 43.5, 246.5, 0. ], ..., [174. , 0. , 0. ], [319. , 0. , 0. ], [333.5, 0. , 0. ]], dtype=float32) 在:imgpoints 出去: 数组([[1310., 1032.], [1258., 1032.], [1154., 1032.], [1206., 1032.], ..., [739., 134.], [686., 133.], [162., 132.], [110., 132.]], dtype=float32) 在: 尺寸 输出:(1080、1440) 在:len(imgpoints) 输出:440 在:len(objpoints) 输出:440

我还尝试在 calibrateCamera 函数中切换 objpoints 和 imgpoints,但这会导致相同的错误消息。当我阅读了很多 C++ 中这个函数的解决方案时,我想指出这是一个与 Python 相关的问题。

我希望有人可以帮助我!提前致谢!

【问题讨论】:

    标签: python numpy opencv camera-calibration aruco


    【解决方案1】:

    这个函数可以接受多个视图(比如N),每个可能显示一个不同的对象。

    “点向量的向量”意味着每个“点向量”可以有一个不同的长度,因为可能该对象与在其他视图中看到的对象不同。

    可以传递一个外部维度为(N, ...) 的数组,如果您的所有视图都显示相同的对象(数组的长度相同),但您应该在一般情况下传递一个数组列表,这样每个数组都可以有自己合适的大小。

    objApoints = np.array(objApoints, dtype=np.float32)
    img1points = np.array(img1points, dtype=np.float32)
    
    # have another picture? img2points...
    # it may show the same object (objApoints) or a different object (objBpoints)
    
    objpointslist = [objApoints]
    imgpointslist = [img1points]
    
    cv2.calibrateCamera(objpointslist, imgpointslist, ...)
    

    【讨论】:

    • 感谢您的评论!我按照你的建议对我的 4 个校准图像进行了操作,现在它可以正常工作了!很高兴看到社区的支持!
    【解决方案2】:

    ImagePoints 和 objectPoints 应包含点向量的向量。这意味着您应该有多个图像的图像和对象点。在您的情况下,我看到只有一个图像有图像和对象点。在这种情况下,您可以做的是使用 np.newaxis ,如下所示。但是为了使校准做得更好,请尝试多张图像。

    objpoints = np.array(objpoints, dtype = np.float32)[np.newaxis]
    imgpoints = np.array(imgpoints, dtype = np.float32)[np.newaxis]
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, imsize, None, None )
    

    【讨论】:

    • 只有当所有对象的点数相同时才有效
    • 感谢您指出有多张图片。我自己也在考虑如何包含其他图像。现在我根据上面提到的 Christoph Rackwitz 的建议进行了更改。
    【解决方案3】:

    已解决: 我必须先将 objpoints 和 imgpoints 放在一个列表中,然后再从它们创建一个 numpy 数组:

    objpoints = np.array([objpoints], dtype = np.float32)
    imgpoints = np.array([imgpoints], dtype = np.float32)
    

    代替:

    objpoints = np.array(objpoints, dtype = np.float32)
    imgpoints = np.array(imgpoints, dtype = np.float32)
    

    【讨论】:

    • 只有当所有对象的点数相同时才有效
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2021-06-25
    • 2015-06-20
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2017-08-02
    相关资源
    最近更新 更多