0

我正在尝试在 OpenCV 4.1.1 中使用 stereoRectifyUncalibrated。代码如下。

points1 = np.array([[2566, 542], [2567, 848], [2569, 947],
               [3154, 452], [3158, 934], 
               [4061, 332], [4069, 576]])

points2 = np.array([[277, 471], [290, 774], [296, 868],
                [794, 393], [816, 830], 
                [1472, 310], [1480, 510]
])

F, mask = cv2.findFundamentalMat(points1, points2)
ret, H1, H2 = cv2.stereoRectifyUncalibrated(points1, points2, F, imgSize=(4112, 1200))

它会产生如下错误。

error                                     Traceback (most recent call last)
---> 11 ret, H1, H2 = cv2.stereoRectifyUncalibrated(points1, points2, F, imgSize=(4112, 1200))
error: OpenCV(4.1.1) /home/hao/workspace/opencv/modules/core/src/convert_c.cpp:112: error: (-215:Assertion failed) src.size == dst.size && src.channels() == dst.channels() in function 'cvConvertScale'

正如文档所说“points2 第二张图像中的对应点。支持与 findFundamentalMat 中相同的格式。” (https://docs.opencv.org/4.1.1/d9/d0c/group__calib3d.html#gaadc5b14471ddc004939471339294f052)。我不知道是怎么回事。提前致谢!

4

1 回答 1

2

简短的回答:

你根本没有足够的积分。

长答案:

由于您只有 7 个点,因此函数 findFundamentalMat 不会返回单个 3x3 矩阵,而是返回 3 个 3x3 矩阵。

当函数尝试将 F 转换为 3x3 矩阵时,stereoRectifyUncalibrated 实际上会引发异常,但由于 src.size == dst.size 不正确而失败。

现在为什么 findFundamentalMat 返回了 3 个矩阵?

在文档中,点数应为:

CV_FM_7POINT 用于 7 点算法。
对于 8 点算法,N=7 CV_FM_8POINT。N≥8
CV_FM_RANSAC 用于 RANSAC 算法。N≥8
CV_FM_LMEDS 用于 LmedS 算法。N≥8

默认值为 CV_FM_RANSAC,我猜代码默默地切换到方法 CV_FM_7POINT(只有 7 分的可能情况)

关于这个方法,findFundamentalMat 的文档说:

该函数使用上面列出的四种方法之一计算基本矩阵,并返回找到的基本矩阵。通常只找到一个矩阵。但在 7 点算法的情况下,该函数最多可能返回 3 个解(按顺序存储所有 3 个矩阵的 9×3 矩阵)。

希望这可以帮助!

于 2019-10-22T12:49:41.793 回答