1. ホーム
  2. c++

[解決済み] warpPerspectiveとperspectiveTransformの違いは何ですか?

2022-02-15 18:19:43

質問

4組の点を使って透視変換行列を求めました。次に warpPerspective を変換して、その行列を A を行列に B . 点 a をマット A から取得し,新しい点 a の位置をマット B で取得したいのですが. warpPerspective はそれができず、一方 perspectiveTransform ができる。

ここで知りたいのは perspectiveTransform を使用した場合の行列Bの位置と同じになります。 warpPerspective .

では、その違いは何かというと warpPerspectiveperspectiveTransform ?

Mat trans = getPerspectiveTransform(dst, gpsPoints);
warpPerspective(A, B, trans, image.size());
Point2f a = Point2f(..., ...);         //were known
vector<Point2f> obj(1);
obj[0] = a;
vector<Point2f> b; 
perspectiveTransform(obj, b, trans);//if the new point in B is c, is c equals to b?

解決方法は?

warpPerspective は画像に対して機能します。つまり、warpPerspectiveは画像Aをワープして、その結果をH(HomographyまたはwarpMatrix)を使ってBに入れることができるので、以下のような構造体になっているのです。

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

srcMat ワープさせたい。 dst その結果が格納される場所。

perspectiveTransform は点の集合に対して動作します。これは,H (Homography または warpMatrix) を点の集合 (これは vector のように)、その結果を別の vector . その結果は、最初の vector は、次のような構造になっています。

void perspectiveTransform(InputArray src, OutputArray dst, InputArray m)

ここで src は入力点である。 dst は、入力点をワープさせた結果である。

結論 :

数学的に どちらもHを使って点の集合を歪ませるという同じことをしているのです。

技術的には , warpPerspective の座標上で行う。 Mat を作成し、その画素値(色)を新しい画素に移動します。 perspectiveTransform の場合、その点の新しい座標を計算し、それを新しい vector .