2017-01-02 159 views
9

我正在研究depth map with OpenCV。我可以获得它,但它是从左侧摄像机原点重建的,并且后者有一点倾斜,如图所示,深度“偏移”(深度应该接近且没有水平梯度):Python - 从旋转角度对OpenCV进行透视变换

enter image description here

我想表达它作为一个零角度,我尝试用经线角度的功能,你可以看到下面,但我得到零场...

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

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

有:

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

编辑后来:

您也可以下载32MB数据集场在这里:https://filex.ec-lille.fr/get?k=cCBoyoV4tbmkzSV5bi6。然后,加载并查看图像:

from matplotlib import pyplot as plt 
import numpy as np 

img = np.load('testZ0.npy') 
plt.imshow(img) 
plt.show() 
+0

为什么你删除了你的答案valentin? – user3601754

+0

[This answer](http://stackoverflow.com/q/33497736/1510289)可能对你有帮助。 –

+0

谢谢,我检查了;) – user3601754

回答

4

我已经得到了一个粗略的解决方案。您可以稍后修改它。

我使用OpenCV中的鼠标处理操作裁剪给定热图中的感兴趣区域。

(我只是说我用鼠标来裁剪区域?)是的,我做了。在OpenCV SEE THIS中了解更多关于鼠标功能的信息。此外,还有许多其他的做题,可以帮助你在这方面:)

使用我能这些功能,得到如下:

enter image description here

现在你移走倾斜的问题。我使用了单应矩阵,通过获取上面图像的角点并将其用于一个确定大小的“白色”图像。我使用了cv2.findHomography()函数。

现在使用的OpenCV的cv2.warpPerspective()功能,我能得到如下:

enter image description here

现在你可以将所需的规模,以这个形象,你想要的。

CODE:

我还附上一些代码片段,请过目:

#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 

接下来,我所获得的角点pts_src倾斜图像下面:

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

我想将上面的点映射到下面给出的点'pts_dst':

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

现在我使用单应性的主要:

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

最后,我使用透视变换映射到的原始图像的白色图像。

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

希望这会有所帮助!我也从这个问题中学到了很多东西。

注意:提供给'cv2.findHomography()'的点必须在float。 欲了解更多有关Homography的信息,请访问THIS PAGE