5

私は助けが必要です 、

サーバーからホモグラフィを受け取っているので、このホモグラフィをアプリの座標系に正規化したいのですが、座標でオブジェクトを表現しようとすると、サーバー アプリは次の 4 つのポイントを生成します。

受信 [96.629539、217.31934; 97.289948、167.21941; 145.69249、168.28044; 145.69638、219.84604]

私のアプリは次の 4 つのポイントを生成します。

ローカル [126.0098、55.600437; 262.39163、53.98035; 259.41382、195.34763; 121.48138、184.95235]

このポイントをグラフィック、R(受信)、P(ローカル)で表します

ここに画像の説明を入力

生成された正方形が回転およびスケーリングされているように見えるので、アプリのホモグラフィと同じホモグラフィを使用できるようにするために、この回転スケールをサーバー ホモグラフィに適用する方法があるかどうかを知りたいと思います。

ありがとう、もっと情報が必要です、私に聞いてください。


最後に、サーバーからポイントを取得し、findhomography を使用して逆ホモグラフィを取得するのと同じくらい簡単な、他の近似を使用します。

ホモグラフィ=findHomography(srcPoints, dstPoints, match_mask, RANSAC, 10);

ありがとう!!!

4

2 に答える 2

4

私はこれを理解したと思います。以下は、2 つのホモグラフィーのもう少し正確なプロットです。青が「受信」ホモグラフィで、赤が「ローカル」ホモグラフィです。

ここに画像の説明を入力

OpenCV 関数getAffineTransformを使用して、3 つのポイント ペアを関連付けるアフィン変換を計算できます (ポイント ペアの順序が間違っていたため、ポイント ペアを再編成する必要がありました)。次のようにこれを numpy で実行しました。

r = array([[97.289948, 167.21941], [96.629539, 217.31934], [145.69638, 219.84604]], np.float32)
l = array([[126.0098, 55.600437], [121.48138, 184.95235], [259.41382, 195.34763]], np.float32)
A = cv2.getAffineTransform(r, l)

これにより、次のアフィン関係が得られます。

array([[  2.81385763e+00,  -5.32961421e-02,  -1.38838108e+02],
       [  7.88519054e-02,   2.58291747e+00,  -3.83984986e+02]])

これを適用して、次のように機能することを確認できるかどうかを確認しましたrl

# split affine warp into rotation, scale, and/or shear + translation matrix
T = mat(A[:, 2]).T
matrix([[-138.83810801],
        [-383.98498637]])

A = mat(A[:, 0:2])
matrix([[ 2.81385763, -0.05329614],
        [ 0.07885191,  2.58291747]])

# apply warp to r to get l
r = mat(r).T
A*r + T
# gives
matrix([[ 126.00980377,  121.48137665,  259.41381836],
        [  55.60043716,  184.9523468 ,  195.34762573]])
# which equals
l = mat(l).T
matrix([[ 126.00980377,  121.48137665,  259.41381836],
        [  55.60043716,  184.9523468 ,  195.34762573]], dtype=float32)

Markus Jarderotまた、OpenCV 関数getPerspectiveTransformを使用して、示されているように透視変換を生成できることにも注意してください。

それが役立つことを願っています!

于 2012-05-23T15:30:55.367 に答える
2

ポイントと変換を Maple にプラグインすると、非常に迅速に結果を得ることができます。

> with(LinearAlgebra);

> # The server coordinates
  pa := [[96.629539, 217.31934], [97.289948, 167.21941], [145.69249, 168.28044],
         [145.69638, 219.84604]]:

> # The local coordiantes
  pb := [[126.0098, 55.600437], [262.39163, 53.98035], [259.41382, 195.34763],
         [121.48138, 184.95235]]:

> # The placeholder variables for the transformation (last one is '1', because it
  # is scale-invariant)
  T := [seq]([seq](`if`(i = 3 and j = 3, 1, t[i, j]), j = 1 .. 3), i = 1 .. 3):
  V := convert(map(op, T)[1 .. -2], set):

> # Transformation function (Matrix multiplication + divide with 3rd coordinate)
  trans := (p, T) -> [
      (T[1, 1]*p[1]+T[1, 2]*p[2]+T[1, 3])/(T[3, 1]*p[1]+T[3, 2]*p[2]+T[3, 3]),
      (T[2, 1]*p[1]+T[2, 2]*p[2]+T[2, 3])/(T[3, 1]*p[1]+T[3, 2]*p[2]+T[3, 3])
  ]:

> # Transform pa, and construct the equation system
  pat := map(trans, pa, T):
  eqs := {op}(zip((p1, p2) -> op(zip(`=`, p1, p2)), pat, pb)):

> # Solve for the transform variables
  sol := solve(eqs, V):

> # Populate the transform
  eval(T, sol);

出力:

[[  .1076044020,   -3.957029830,    1074.517140  ],
 [ 4.795375318,      .3064507355,   -430.7044862 ],
 [ 0.3875626264e-3, 0.3441632491e-2,   1         ]]

これを使用するには、それを server-points as で乗算しますT * <x, y, 1>


void ServerToLocal(double serverX, double serverY, double *localX, double *localY)
{
    double w;
    w = 0.3875626264e-3 * serverX + 0.3441632491e-2 * serverY + 1.0;
    *localX = (.1076044020 * serverX - 3.957029830 * serverY + 1074.517140) / w;
    *localY = (4.795375318 * serverX + .3064507355 * serverY - 430.7044862) / w;
}

別の方法は、 http://alumni.media.mit.edu/~cwren/interpolator/で読むことができます。

妥当な線形代数ライブラリがあれば、これは C で書くことができます。

于 2012-05-23T16:28:50.860 に答える