ここ数週間、私はイメージを修正する方法を学ぼうと試みましたが、ここの人々の助けを借りて、それをよりよく理解することができました. 約 1 週間前に、修正したいテスト例をセットアップしました (上の画像を参照)。これは、関数 T = cv2.getPerspectiveTransform(UV_cp, XYZ_gcp) を使用して正常に機能しました(元: http://sitedezign.net/original.jpgおよび修正: http://sitedezign.net/rectified.jpg ) 。ここで、T はホモグラフィになります。 .
現実世界の写真でこれを実行しようとしたとき、現実世界の座標が完全に平面上にないため失敗しました (ただし、空間内の X、Y、および Z 座標で測定された約 10 の制御点)。そのため、solvePnP を使用して、使用できるホモグラフィを作成できることを願っています。
テスト例でこれを試しましたが、期待した結果が得られませんでした。画像は修正されておらず、solvePnP を使用して計算されたホモグラフィーは、getPerspectiveTransform で計算されたホモグラフィーと等しくありません。
私のコード:
# Set UV (image) and XYZ (real life)
UV_cp = np.array([[1300.0, 2544.0], # left down
[1607.0, 1000.0], # left up
[3681.0, 2516.0], # right down
[3320.0, 983.0]], np.float32) # right up
# Z is on 0 plane, so Z=0.0
XYZ_gcp = np.array([[0.0, 400.0, 0.0],
[0.0, 0.0, 0.0],
[300.0, 400.0, 0.0],
[300.0, 0.0, 0.0]], np.float32)
rvec, tvec = cv2.solvePnP(XYZ_gcp, UV_cp, K, D)
rotM_cam = cv2.Rodrigues(rvec)[0]
# calculate camera position (= translation), in mm from 0,0,0 point
cameraPosition = -np.matrix(rotM_cam).T * np.matrix(tvec)
# 3x3 Identity matrix
I = np.identity(3)
# [I|-C]
I1_extended = np.hstack((I,-cameraPosition))
# P = K*R*I
P_cam = K.dot(rotM_cam).dot(I1_extended)
# create P2 = image from above: R = 0,0,0, translation = x, y, z = 0,0,-1000 (mm)
R_rec = matr.getR(0.0,0.0,0.0)
newZ = -1000.0
new_cameraPosition = np.array([[0.0],[0.0],[newZ]])
I2_extended = np.hstack((I,new_cameraPosition))
P_rec = K.dot(R_rec).dot(I2_extended)
# correct Homography T from getPerspectiveTransform:
T = np.array([[4.70332834e-01, 9.35182514e-02, -4.24671558e+02],
[9.62104844e-03, 9.69462117e-01, -4.92461571e+02],
[3.54859924e-06, 6.80081146e-04, 1.00000000e+00]])
# Homography Matrix = H = P_rect * pinv(P) => P2 * pinv(P1)
H = P_rec.dot(np.linalg.pinv(P_cam))
結果は歪んだ画像で、上に示したもの (修正されたもの) とはかけ離れています。また、正しいはずのホモグラフィ T (getPerspectiveTransform から) は、solvePnP (H) からの結果を使用して計算されたホモグラフィに近くありません。
H from solvePnP:
[[ 1.01865631e+00 2.68683332e-01 -2.04519580e+03]
[ -3.24304366e-02 6.82672680e-01 -1.15688010e+03]
[ 2.03399902e-05 1.24191993e-04 -5.41378561e-01]]
H from getPerspectiveTransform:
[[ 4.70332834e-01 9.35182514e-02 -4.24671558e+02]
[ 9.62104844e-03 9.69462117e-01 -4.92461571e+02]
[ 3.54859924e-06 6.80081146e-04 1.00000000e+00]]
誰が何がうまくいかないのか考えていますか?
PS: K マトリックスと歪み係数を決定するコード (値は、Adobe Camera Raw に従って焦点距離 33mm で私のカメラ Pentax K-5 から取得されます):
# Focal length, sensor size (mm and px)
f = 33.0 # mm
pix_width = 4928.0 # sensor size has 4928px in width
pix_height = 3624.0 # sensor size has 4928px in width
sensor_width = 23.7 # mm
sensor_height = 15.7 # mm
# set center pixel
u0 = int(pix_width / 2.0)
v0 = int(pix_height / 2.0)
# determine values of camera-matrix
mu = pix_width / sensor_width # px/mm
alpha_u = f * mu # px
mv = pix_height / sensor_height # px/mm
alpha_v = f * mv # px
# Distortion coefs
D = np.array([[0.0, 0.0, 0.0, 0.0]])
# Camera matrix
K = np.array([[alpha_u, 0.0, u0],
[0.0, alpha_v, v0],
[0.0, 0.0, 1.0]])