2017-01-02 16 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)) 
LATER

EDIT:https://filex.ec-lille.fr/get?k=cCBoyoV4tbmkzSV5bi6

はあなたがここに32MBのフィールドのデータセットをダウンロードすることができます。次に、画像をロードして表示します:

from matplotlib import pyplot as plt 
import numpy as np 

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

なぜあなたはあなたの答えを削除しましたか? – user3601754

+0

[この回答](http://stackoverflow.com/q/33497736/1510289)があなたに役立つかもしれません。 –

+0

ありがとう私はそれをチェック;) – user3601754

答えて

4

私は場所におおよその解決策を持っています。後で変更することができます。

OpenCVで利用可能なマウス操作を使用して、特定のヒートマップの関心領域をトリミングしました。

(私は領域を切り抜くためにマウスを使用したと言いましたか?)はい、しました。 OpenCV SEE THISのマウス機能の詳細については、こちらをご覧ください。また、この点であなたを助けることができる他の多くのSOの質問があります:)次取得するために私ができたこれらの機能を使用して

:。

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である必要があります。 ホモグラフィの詳細については、THIS PAGE

関連する問題