Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - Perspective transform for OpenCV from a rotation angle

I'm working on depth map with OpenCV. I can obtain it but it is reconstructed from the left camera origin and there is a little tilt of this latter and as you can see on the figure, the depth is "shifted" (the depth should be close and no horizontal gradient):

enter image description here

I would like to express it as with a zero angle, i try with the warp perspective function as you can see below but i obtain a null field...

P = np.dot(cam,np.dot(Transl,np.dot(Rot,A1)))

dst = cv2.warpPerspective(depth, P, (2048, 2048))

with :

#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))

EDIT LATER :

You can download the 32MB field dataset here: https://filex.ec-lille.fr/get?k=cCBoyoV4tbmkzSV5bi6. Then, load and view the image with:

from matplotlib import pyplot as plt
import numpy as np

img = np.load('testZ0.npy')
plt.imshow(img)
plt.show()
like image 801
user3601754 Avatar asked Jan 02 '17 13:01

user3601754


People also ask

How many points needed for perspective transform?

Since the Homography matrix has 8 degrees of freedom, we need at least four pairs of corresponding points to solve for the values of the Homography matrix. We can then combine the relationships between all four points like below. Equation 7: Relationship between n pairs of matching points.

What is perspective transform in Python?

In Perspective Transformation, we can change the perspective of a given image or video for getting better insights into the required information. In Perspective Transformation, we need to provide the points on the image from which want to gather information by changing the perspective.


1 Answers

I have got a rough solution in place. You can modify it later.

I used the mouse handling operations available in OpenCV to crop the region of interest in the given heatmap.

(Did I just say I used a mouse to crop the region?) Yes, I did. To learn more about mouse functions in OpenCV SEE THIS. Besides, there are many other SO questions that can help you in this regard.:)

Using those functions I was able to obtain the following:

enter image description here

Now to your question of removing the tilt. I used the homography principal by taking the corner points of the image above and using it on a 'white' image of a definite size. I used the cv2.findHomography() function for this.

Now using the cv2.warpPerspective() function in OpenCV, I was able to obtain the following:

enter image description here

Now you can the required scale to this image as you wanted.

CODE:

I have also attached some snippets of code for your perusal:

#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

Next I obtained the corner points pts_src on the tilted image below :

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

I wanted the points above to be mapped to the points 'pts_dst' given below :

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

Now I used the principal of homography:

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

Finally I mapped the original image to the white image using perspective transform.

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

Hope this helps! I also got to learn a great deal from this question.

Note: The points fed to the 'cv2.findHomography()' must be in float. For more info on Homography , visit THIS PAGE

like image 71
Jeru Luke Avatar answered Oct 19 '22 16:10

Jeru Luke