Ошибка OpenCV: утверждение не удалось в undistort.cpp в строке 293
Нашел решение по адресу https://github.com/opencv/opencv/issues/4943
Ошибка OpenCV:
Ошибка подтверждения (CV_IS_MAT(_src) && CV_IS_MAT(_dst) && (_src->rows == 1 || _src->cols == 1) && (_dst->rows == 1 || _dst->cols == 1) && _src->cols + _src-> строки - 1 == _dst-> строки + _dst->cols - 1 && (CV_MAT_TYPE(_src-> тип) == CV_32FC2 || CV_MAT_TYPE(_src-> тип) == CV_64FC2) && (CV_MAT_TYPE(_dst-> тип) == CV_32FC2 || CV_MAT_TYPE(_dst-> тип) == CV_64FC2)) в cvUndistortPoints, файл /home/javvaji/opencv-3.2.0/modules/imgproc/src/undistort. линия 293
retval, rvec, tvec = cv2.solvePnP(cam.object_points, cam.image_points, cam.camera_matrix, cam.dist_coefficients, None, None, False, cv2.SOLVEPNP_P3P)
Я использую функцию solvePnP с флагом SOLVEPNP_P3P. Это дает ошибку утверждения. Тот же код solvePnP прекрасно работает с флагом SOLVEPNP_ITERATIVE. С флагом P3P он внутренне вызывает функцию undistortPoints, которая выдает ошибку.
Ссылка кода кода решения: https://github.com/opencv/opencv/blob...
Как решить это?
1 ответ
Incomplete Docs - solvePnP в Python (проблема является открытой проблемой в репозитории opencv github) https://github.com/opencv/opencv/issues/4943
Куски кускового массива не будут работать в качестве входных данных, потому что для решения convertPnP требуются смежные массивы (что подтверждается утверждением с помощью cv::Mat::checkVector() вокруг строки 55 модулей /calib3d/src/solvepnp.cpp версии 2.4.9)
Алгоритм P3P требует, чтобы точки изображения находились в массиве формы (N,1,2) из-за его вызова cv:: undistortPoints (около строки 75 модулей /calib3d/src/solvepnp.cpp версии 2.4.9), который требует 2-х канальная информация.
Таким образом, учитывая некоторые данные D = np.array(...) где D.shape = (N,M), чтобы использовать его подмножество, например, imagePoints, нужно эффективно скопировать его в новый массив: imagePoints = np.ascontiguousarray(D[:,:2]).reshape((N,1,2))