函数 cv2.calibrateCamera PYTHON 中类型 Point3f 的问题

Posted

技术标签:

【中文标题】函数 cv2.calibrateCamera PYTHON 中类型 Point3f 的问题【英文标题】:Problem with type Point3f in function cv2.calibrateCamera PYTHON 【发布时间】: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 相关的问题。

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

【问题讨论】:

【参考方案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)

【讨论】:

只有当所有对象的点数相同时才有效

以上是关于函数 cv2.calibrateCamera PYTHON 中类型 Point3f 的问题的主要内容,如果未能解决你的问题,请参考以下文章

python 获取另一个py文件 中函数的返回值

python如何调用另一个py文件的所有函数

我想调用 first.py 中可用的代码,然后将其包装在函数中。然后在 second.py 中导入该函数并调用

从文件 b.py 中的函数附加到文件 a.py 后访问变量

python如何在某.py文件中调用其他.py内的函数

Python函数导入在Django中不起作用