Python – Transformación de perspectiva para OpenCV desde un ángulo de rotación

Estoy trabajando en el depth map with OpenCV . Puedo obtenerlo, pero se reconstruye desde el origen de la cámara izquierda y hay una pequeña inclinación de este último y, como se puede ver en la figura, la profundidad se “cambia” (la profundidad debe estar cerca y no debe haber un gradiente horizontal):

introduzca la descripción de la imagen aquí

Me gustaría expresslo como con un ángulo de cero, bash con la función de perspectiva de deformación como se puede ver a continuación, pero obtengo un campo nulo …

 P = np.dot(cam,np.dot(Transl,np.dot(Rot,A1))) dst = cv2.warpPerspective(depth, P, (2048, 2048)) 

con :

 #Projection 2D -> 3D matrix A1 = np.zeros((4,3)) A1[0,0] = 1 A1[0,2] = -1024 A1[1,1] = 1 A1[1,2] = -1024 A1[3,2] = 1 #Rotation matrice around the Y axis theta = np.deg2rad(5) Rot = np.zeros((4,4)) Rot[0,0] = np.cos(theta) Rot[0,2] = -np.sin(theta) Rot[1,1] = 1 Rot[2,0] = np.sin(theta) Rot[2,2] = np.cos(theta) Rot[3,3] = 1 #Translation matrix on the X axis dist = 0 Transl = np.zeros((4,4)) Transl[0,0] = 1 Transl[0,2] = dist Transl[1,1] = 1 Transl[2,2] = 1 Transl[3,3] = 1 #Camera Intrisecs matrix 3D -> 2D cam = np.concatenate((C1,np.zeros((3,1))),axis=1) cam[2,2] = 1 P = np.dot(cam,np.dot(Transl,np.dot(Rot,A1))) dst = cv2.warpPerspective(Z0_0, P, (2048*3, 2048*3)) 

EDITAR DESPUÉS:

    Puede descargar el conjunto de datos de campo de 32 MB aquí: https://filex.ec-lille.fr/get?k=cCBoyoV4tbmkzSV5bi6 . Luego, cargue y vea la imagen con:

     from matplotlib import pyplot as plt import numpy as np img = np.load('testZ0.npy') plt.imshow(img) plt.show() 

    Tengo una solución aproximada en su lugar. Puedes modificarlo más tarde.

    Utilicé las operaciones de manejo del mouse disponibles en OpenCV para recortar la región de interés en el mapa de calor dado.

    (¿Acabo de decir que usé un ratón para recortar la región?) Sí, lo hice. Para obtener más información sobre las funciones del mouse en OpenCV VEA ESTO . Además, hay muchas otras preguntas de SO que pueden ayudarte en este sentido. 🙂

    Usando esas funciones pude obtener lo siguiente:

    introduzca la descripción de la imagen aquí

    Ahora a tu pregunta de quitar la inclinación. Usé el principio de homografía tomando los puntos de la esquina de la imagen de arriba y usándolos en una imagen “blanca” de un tamaño definido. cv2.findHomography() función cv2.findHomography() para esto.

    Ahora, utilizando la función cv2.warpPerspective() en OpenCV, pude obtener lo siguiente:

    introduzca la descripción de la imagen aquí

    Ahora puede ajustar la escala requerida a esta imagen como desee.

    CÓDIGO:

    También he adjuntado algunos fragmentos de código para su lectura:

     #First I created an image of white color of a definite size back = np.ones((435, 379, 3)) # size back[:] = (255, 255, 255) # white color 

    A continuación obtuve los puntos de esquina pts_src en la imagen inclinada a continuación:

     pts_src = np.array([[25.0, 2.0],[403.0,22.0],[375.0,436.0],[6.0,433.0]]) 

    Quería que los puntos anteriores se asignaran a los puntos ‘pts_dst’ que se indican a continuación:

     pts_dst = np.array([[2.0, 2.0], [379.0, 2.0], [379.0, 435.0],[2.0, 435.0]]) 

    Ahora utilicé el principio de homografía:

     h, status = cv2.findHomography(pts_src, pts_dst) 

    Finalmente, asigné la imagen original a la imagen en blanco usando la transformación de perspectiva.

     fin = cv2.warpPerspective(img, h, (back.shape[1],back.shape[0])) # img -> original tilted image. # back -> image of white color. 

    ¡Espero que esto ayude! También aprendí mucho de esta pregunta.

    Nota: Los puntos alimentados a ‘cv2.findHomography ()’ deben estar en float . Para obtener más información sobre la homografía, visite esta página