problemas para hacer que cv.transforme para trabajar

Me gustaría usar la misma matriz afín M en algunos puntos individuales (x, y) que uso en las imágenes con cv2.warpAffine. Parece que cv2.transform es el camino a seguir. Cuando bash enviar una matriz Nx2 de puntos, me vuelvo negado (

src = np.array([ [x1,y1],[x2,y2],[x3,y3],[x4,y4]], dtype = "float32") print('source shape '+str(src.shape)) dst=cv2.transform(src,M) cv2.error: /home/jeremy/sw/opencv-3.1.0/modules/core/src/matmul.cpp:1947: error: (-215) scn == m.cols || scn + 1 == m.cols in function transform 

Puedo obtener la transformación que quiero usando aritmética numpy:

  dst = np.dot(src,M[:,0:2]) +M[:,2] print('dest:{}'.format(dst)) 

Pero me gustaría entender qué está pasando. Los documentos dicen que cv2.transform desea un número de canales igual al número de columnas en M, pero no tengo claro cuáles serían los canales, tal vez un canal ‘x’ y un canal ‘y’, pero entonces el tercero sería ¿Y qué significarían las diferentes filas?

OpenCV en Python a menudo quiere puntos en la forma

 np.array([ [[x1, y1]], ..., [[xn, yn]] ]) 

Esto no está claro en la documentación de cv2.transform() pero está más claro en la documentación de otras funciones que usan puntos, como cv2.perspectiveTransform() donde mencionan que las coordenadas están en canales separados:

src – entrada de matriz de punto flotante de dos o tres canales

Las transformaciones también se pueden usar en 3D (usando una matriz de transformación de perspectiva 4x4 ), lo que explicaría la capacidad de usar arreglos de dos o tres canales en cv2.transform() .