我正在尝试在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)。我不知道是怎么回事。预先感谢!
答案 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个矩阵)。
希望这会有所帮助!