OpenCV Python cv2.perspectiveTransform

Actualmente estoy tratando de estabilizar el video usando OpenCV y Python. Utilizo la siguiente función para calcular la rotación:

def accumulate_rotation(src, theta_x, theta_y, theta_z, timestamps, prev, current, f, gyro_delay=None, gyro_drift=None, shutter_duration=None): if prev == current: return src pts = [] pts_transformed = [] for x in range(10): current_row = [] current_row_transformed = [] pixel_x = x * (src.shape[1] / 10) for y in range(10): pixel_y = y * (src.shape[0] / 10) current_row.append([pixel_x, pixel_y]) if shutter_duration: y_timestamp = current + shutter_duration * (pixel_y - src.shape[0] / 2) else: y_timestamp = current transform = getAccumulatedRotation(src.shape[1], src.shape[0], theta_x, theta_y, theta_z, timestamps, prev, current, f, gyro_delay, gyro_drift) output = cv2.perspectiveTransform(np.array([[pixel_x, pixel_y]], dtype="float32"), transform) current_row_transformed.append(output) pts.append(current_row) pts_transformed.append(current_row_transformed) o = utilities.meshwarp(src, pts_transformed) return o 

Obtengo el siguiente error cuando llega a output = cv2.perspectiveTransform(np.array([[pixel_x, pixel_y]], dtype="float32"), transform) :

cv2.error: /Users/travis/build/skvark/opencv-python/opencv/modules/core/src/matmul.cpp:2271: error: (-215) scn + 1 == m.cols in function perspectiveTransform

Cualquier ayuda o sugerencia sería realmente apreciada.

Esta implementación realmente necesita ser cambiada en una versión futura.

De los documentos de OpenCV para perspectiveTransform() :

src – entrada de matriz de punto flotante de dos canales (…)

El énfasis inclinado añadido por mí.

 >>> A = np.array([[0, 0]], dtype=np.float32) >>> A.shape (1, 2) 

Entonces vemos desde aquí que A es solo una matriz de un solo canal, es decir, bidimensional. Una fila, dos cols. En su lugar, necesita una imagen de dos canales , es decir, una matriz tridimensional donde la longitud de la tercera dimensión es 2 o 3, dependiendo de si está enviando puntos 2D o 3D.

En pocas palabras, necesita agregar un conjunto más de corchetes para hacer que el conjunto de puntos que está enviando sea tridimensional, donde los valores de x están en el primer canal, y los valores de y están en el segundo canal.

 >>> A = np.array([[[0, 0]]], dtype=np.float32) >>> A.shape (1, 1, 2) 

No es intuitivo, y aunque está documentado, no es muy explícito en ese punto. Eso es todo lo que necesitas. He respondido una pregunta idéntica antes , pero para la función cv2.transform() .