cv2.stereoRectifyUncalibrated: ошибка: (-215: подтверждение не выполнено) src.size == dst.size && src.channels () == dst.channels () в функции 'cvConvertScale' - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь использовать StereRectifyUncalibrated в OpenCV 4.1.1. Код выглядит следующим образом.

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 Ответ

2 голосов
/ 22 октября 2019

Краткий ответ:

Вам просто не хватает очков.

Длинный ответ:

Поскольку у вас есть только 7 баллов, функция findFundamentalMat не возвращаетодиночная матрица 3х3, но 3 матрицы 3х3.

Исключение фактически генерируется в stereoRectifyUncalibrated, когда функция пытается преобразовать F в матрицу 3x3, но завершается неудачно, потому что src.size == dst.size не соответствует действительности.

Теперь, почему обнаружил findFundamentalMatвернул 3 матрицы?

В документации количество точек должно быть:

CV_FM_7POINT для 7-точечного алгоритма. N = 7
CV_FM_8POINT для 8-точечного алгоритма. N≥8
CV_FM_RANSAC для алгоритма RANSAC. N≥8
CV_FM_LMEDS для алгоритма LMedS. N≥8

По умолчанию установлено значение CV_FM_RANSAC, и я предполагаю, что код молча переключился на метод CV_FM_7POINT (только возможный случай с 7 точками)

Об этом методе приведена документация findFundamentalMatговорит:

Функция вычисляет фундаментальную матрицу, используя один из четырех методов, перечисленных выше, и возвращает найденную фундаментальную матрицу. Обычно только одна матрица найдена. Но в случае 7-точечного алгоритма функция может возвращать до 3 решений (матрица 9 × 3, в которой последовательно хранятся все 3 матрицы).

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...