OpenCV-Python: какова правильная форма точек для нахождения эпиполярных линий?

#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. Спасибо, я пробовал оба способа, но я все еще получаю ошибку «формат точечной матрицы не поддерживается». Но спасибо за объяснение типа данных, теперь я лучше понимаю!