3

OpenCVとPythonでパースペクティブワープを使用して画像を修正しようとしています。ワープが必要な平面を基準にしたカメラの向き(X、Y、Zの角度)を知っています。既知の点に基づいてホモグラフィ行列を計算するのが最も簡単な方法であることを私は知っていますが、その情報が利用できないときに同じことをしようとしています。私が使用しているコードは、回転行列を作成してから、並進行列と固有行列を組み合わせます。現在、コードはz軸への操作でのみ機能します。x軸とy軸を操作すると、画像に奇妙な歪みが生じます。私は次の投稿の下部にある答えに基づいてコードを作成しています:既知のカメラの向きに基づくOpenCVでのパースペクティブワーピング

添付されているのは、元の画像と標準的なホモグラフィ法によるワープ画像です。

元の画像パースペクティブワープ

from numpy import *
import cv

x = float(0)
y = float(5)
z = float(0)
f = 1

im = cv.LoadImage("Homography_test.jpg")
cv.NamedWindow("Distorted")
cv.NamedWindow("undistorted")

h, w = cv.GetSize(im)

x1 = x * (pi / 180)
y1 = y * (pi / 180)
z1 = z * (pi / 180)

# Create a rotation matrix
R_array = array([[x1], [y1], [z1]])
R_Vec = cv.fromarray(R_array)
R = cv.CreateMat(3, 3, cv.CV_64FC1)

cv.Rodrigues2(R_Vec, R)

#Create and combine with translation matrix
Trans_Mat = array([[[1], [0], [-w/2]],
                    [[0], [1], [-h/2]],
                    [[0], [0], [1]]])

Trans_Mat2 = cv.fromarray(Trans_Mat)
R_T_Mat = dot(R, Trans_Mat2)

#Create and combine with camera matrix
Intrinsic_Mat = array([[[f], [0], [w/2]],
                       [[0], [f], [h/2]],
                       [[0], [0], [1]]])

Int_Mat = cv.fromarray(Intrinsic_Mat)
H = dot(Int_Mat, R_T_Mat)
H2 = cv.fromarray(H)

persp = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_8U, 3)
cv.WarpPerspective(im, persp, H2)

cv.ShowImage("Distorted", im)
cv.ShowImage("undistorted", persp)

cv.WaitKey(0)
cv.DestroyWindow("Distorted")
cv.DestroyWindow("undistorted")
4

1 に答える 1

2

あなたは私の解決策からステップ4を見逃しているようです。それは、私が以前行っていた線である「画像をz軸の下に移動する」というものでした。

//4
trans(2,2) += image.rows;

image.rowsを任意に選択しました。これにより、例で使用した回転に優れたスケール感が得られました。z座標が1に固定されているわけではないので、xとyを中心に回転すると、画像がカメラに非常に近くなるため、これがxとyを中心に回転するときの歪みの原因になると思います。遠近法の歪みは大きいです。z軸に沿った平行移動が大きいほど、歪みは小さくなります。画像がz軸を下に移動するときに画像を縮小したくない場合は、焦点距離も長くしてください。私の例では、焦点距離をimage.rowsに設定していることに気付くかもしれません。

于 2013-01-17T21:35:13.867 に答える