cv2.stereoRectifyUncalibrated:错误:(-215:断言失败)函数'cvConvertScale'中的src.size == dst.size && src.channels()== dst.channels()

时间:2019-10-11 10:10:18

标签: opencv

我正在尝试在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)。我不知道是怎么回事。预先感谢!

1 个答案:

答案 0 :(得分:2)

简短回答:

您根本没有足够的积分。

长答案:

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

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

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

在文档中,点数应为:

  

CV_FM_7POINT用于7点算法。 N = 7
  CV_FM_8POINT用于8点算法。 N≥8
  CV_FM_RANSAC用于RANSAC算法。 N≥8
  LMedS算法的CV_FM_LMEDS。 N≥8

默认值为CV_FM_RANSAC,我想代码会悄悄地切换到CV_FM_7POINT方法(只有7点的情况)。

关于此方法,findFundamentalMat的文档说:

  

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

希望这会有所帮助!