#python #arrays #opencv #numpy
#python #массивы #opencv #numpy
Вопрос:
У меня возникли проблемы с использованием функции computeCorrespondEpilines () в OpenCV-Python. Согласно документации, матрица точек описывается как:
«Входные точки. Матрица N x 1 или 1 x N типа CV_32FC2 или вектор< Point2f>»
Однако я не уверен, что это означает в Python. Я пытался использовать список кортежей, но это не был массив Numpy, поэтому я попробовал использовать массив кортежей Numpy, но он автоматически преобразуется в матрицу Nx2. Я также попробовал использовать Numpy структурированный массив в виде списка кортежей, но затем функция epilines сообщает «тип данных точек = 20 не поддерживается», что буквально дает 0 результатов в Google.
Кто-нибудь знает, какая правильная форма / тип матрицы точек необходим для этой функции?
Ответ №1:
Кажется, есть подвох. Тип CV_32FC2
на самом деле является типом, который содержит два канала (значения). То же самое относится и к вектору.
Итак, на самом деле кажется, что функция ожидает 3D-данные с формой (N, 1, 2) или (1, N, 2). Если у вас есть матрица N x 2 M
, то вы можете использовать это:
MM = M.reshape((1,-1,2))
Это должно дать подходящий массив MM
с формой (1, N, 2). Если это не сработает, попробуйте:
MM = M.reshape((-1,1,2))
что дает массив (N, 1, 2).
Кроме того, cv2
могут быть очень придирчивы к типу данных, поэтому вы можете попытаться привести свои точки к правильному типу:
MM = M.reshape((-1,1,2)).astype('float32')
также.
Комментарии:
1. Спасибо, я пробовал оба способа, но я все еще получаю ошибку «формат точечной матрицы не поддерживается». Но спасибо за объяснение типа данных, теперь я лучше понимаю!