OpenCV 3.1 cv2.stereoCalibrate TypeError:需要一个整数

Posted

技术标签:

【中文标题】OpenCV 3.1 cv2.stereoCalibrate TypeError:需要一个整数【英文标题】:OpenCV 3.1 cv2.stereoCalibrate TypeError: an integer is required 【发布时间】:2016-10-13 22:03:30 【问题描述】:

最近我设法编译了支持 cuda 的最新 opencv 3.1。 经过一番修补后,我将大部分 python 代码从 2.4.x 正确转换为 3.1.x,没有任何问题。

但是到了尝试 stereCalibrate 功能的时候,出现了错误:

Exception in thread Thread-5:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "./stereo_compute.py", line 245, in calibrate
    flags)
TypeError: an integer is required

这是我如何调用函数本身:

criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS,
    30, 1e-56)
flags = (cv2.CALIB_FIX_ASPECT_RATIO +
    cv2.CALIB_ZERO_TANGENT_DIST +
    cv2.CALIB_SAME_FOCAL_LENGTH)
(value,
self.np_calib_data['lmtx'], self.np_calib_data['ldist'],
self.np_calib_data['rmtx'], self.np_calib_data['rdist'],
self.np_calib_data['R'], self.np_calib_data['T'],
self.np_calib_data['E'], self.np_calib_data['F']
) = cv2.stereoCalibrate(
    object_points,
    l_image_points,
    r_image_points,
    (image_size[1], image_size[0],),
    self.np_calib_data['lmtx'],
    self.np_calib_data['ldist'],
    self.np_calib_data['rmtx'],
    self.np_calib_data['rdist'],
    self.np_calib_data['R'],
    self.np_calib_data['T'],
    self.np_calib_data['E'],
    self.np_calib_data['F'],
    flags,
    criteria)

一切都在一个线程中运行,这就是它在异常中提到的原因。

我无法获得正确的参数集。

此外,在具有相同数据集的 2.4.x 版本下,该调用对我有效。

请帮忙!

【问题讨论】:

如果我没记错的话,最后两个参数(标志和条件)是在 opencv 3.1 中交换的 我知道,已经交换了它们:3.0-beta doc 计算标志后的总和(标志值)是多少? 【参考方案1】:

我注意到,对于 OpenCV 的 Python 绑定,如果一个函数有一个具有默认值的参数,例如 None,您通常不能显式地使用这个参数及其默认值。这完全违反了正常的 Python 约定和预期的行为。

例如,函数cv2.goodFeaturesToTrack 有参数blockSize 和默认值None,所以你会期望调用

cv2.goodFeaturesToTrack(image=img, maxCorners=10, qualityLevel=0.1, minDistance=10, mask=None, blockSize=None)

将与

相同
cv2.goodFeaturesToTrack(image=img, maxCorners=10, qualityLevel=0.1, minDistance=10, mask=None)

但实际上,第一种使用这个函数的方式会导致

TypeError: an integer is required

因此,对于 OpenCV,您必须要么不提供和参数,要么提供正确的值(根据 Python 函数/方法签名,默认值可能不正确)。

您必须检查 C++ 源代码才能找到实际的默认值。

【讨论】:

以上是关于OpenCV 3.1 cv2.stereoCalibrate TypeError:需要一个整数的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3.1 - 找不到 opencv_contrib 库

使用 Eclipse 从 OpenCV-3.1 读取时出错

OpenCV3.0 3.1版本号的改进

VC 2008 Express下安装OpenCV2.3.1

Ubuntu 编译安装 OpenCV 3.1

OpenCV 3.1 警告和使用 Umat 时崩溃