cvWarpPerspectiveで画像を変換
変換行列を元に、画像を変形する

#contents

*void cvFindHomography( const CvMat* src_points, const CvMat* dst_points, CvMat* homography ); [#k45858bc]
*void warpPerspective(InputArray before, OutputArray after, InputArray matrix, Size dsize, int flags, int borderMode, const Scalar& borderValue); [#l9bf0984]
-beforeをMatrix(ホモグラフィ)に基づいて変換

src_pointsをdst_pointsに変換するホモグラフィhomographyを計算する.
**引数 [#lea61f4b]
-before:Mat型の画像。座標変換前の画像
-after:Mat型の画像。座標変換後の画像
-matrix:Mat型の変換行列(ホモグラフィ)
-dsize:Size型の出力画像のサイズ
-flag:int型で変換方法のフラグ。詳細は後述。省略した場合はINTER_LINEAR
-borderMode:int型の、境界の対処方法。省略した場合はBORDER_CONSTANT
-borderValue:Scalar型の値。WARP_FILL_OUTLIERSを指定した場合、この色で空いた部分を塗りつぶす

**引数 [#p38c0b97]
-src_points:CvMat*型の変換前の座標
-dst_points:CvMat*型の変換後の座標
-homography:CvMat*型のhomography

**返り値 [#u32972d5]
**返り値 [#l3c56b7c]
-void型なのでなし

*void cvWarpPerspective(const IplImage* before, IplImage* after, const CvMat* homography, int flag, CvScalar fillval); [#qa77189e]
*void warpAffine(InputArray before, OutputArray after, InputArray matrix, Size dsize, int flags, int borderMode, const Scalar& borderValue); [#u1a16464]
-beforeをMatrix(アフィン行列)に基いて変換

beforeをhomographyに基づいて変換
**引数 [#y086ff55]
-基本的にwarpPerspectiveと同じ
-before:Mat型の画像。座標変換前の画像
-after:Mat型の画像。座標変換後の画像
-matrix:Mat型の変換行列。2x3(2 rows , 3 columns)の変換行列
-dsize:Size型の出力画像のサイズ
-flag:int型で変換方法のフラグ。詳細は後述。省略した場合はINTER_LINEAR
-borderMode:int型の、境界の対処方法。省略した場合はBORDER_CONSTANT
-borderValue:Scalar型の値。WARP_FILL_OUTLIERSを指定した場合、この色で空いた部分を塗りつぶす

**引数 [#gdcd4c3e]
-before:IplImage*型の画像.CvMat*型も可.座標変換前の画像
-after:IplImage*型の画像.CvMat*型も可.座標変換後の画像
-homography:CvMat*型のホモグラフィ
-flag:int型で変換方法のフラグ.下記の組み合わせ
--CV_INTER_LINEAR:共1次内挿
--CV_INTER_CUBIC:共3次内挿
--CV_WARP_INVERSE_MAP:逆内挿
--CV_WARP_FILL_OUTLIERS:指定色で外部を塗りつぶす
-fillval:cvScalar型の値.CV_WARP_FILL_OUTLIERSを指定した場合,この色で空いた部分を塗りつぶす.

**返り値 [#p4138794]
**返り値 [#h0aa8836]
-void型なのでなし

*解説 [#cd085ec9]
-src_pointsとdst_pointsには2次元座標を格納する.
--src_pointsは&mimetex(\(\array{2,cc$X_1&Y_1\\ \vdots&\vdots\\X_N&Y_N\));, dst_pointsは&mimetex(\(\array{2,cc$x_1&y_1\\ \vdots&\vdots\\x_N&y_N\));
--座標は縦横逆にしてもOK
--斉次座標でもOK
-homographyは線型連立方程式を解いて再投影誤差が小さくなるようなhomographyを求める.
-cvWarpPerspectiveはhomographyに基づき,透視変換を行う
--変換前の座標を&mimetex( \(x, y, 1\)^\top );,変換後の座標を&mimetex(\(x\prime, y\prime, 1\)^\top);とすると,次式に様な変換を行う.
--&mimetex( s\(\array{3,c$x\prime\\y\prime\\1}\) = \(\array{3,ccc$h_{11}&h_{12}&h_{13}\\h_{21}&h_{22}&h_{23}\\h_{31}&h_{32}&h_{33}}\)\(\array{3,c$x\\y\\1}\) = \mathbb{h}\(\array{3,c$x\\y\\1}\));
--フラグにCV_WARP_INVERSE_MAPを利用した場合,次式の様に逆変換を行う.
--&mimetex( s\(\array{3,c$x\\y\\1}\)  = \(\array{3,ccc$h_{11}&h_{12}&h_{13}\\h_{21}&h_{22}&h_{23}\\h_{31}&h_{32}&h_{33}}\)\(\array{3,c$x\prime\\y\prime\\1}\)= \mathbb{H}\(\array{3,c$x\prime\\y\prime\\1}\));
-flagのデフォルト値はCV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS
--CV_INTER_LINEARかCV_INTER_CUBICで内挿法を指定する
--CV_INTER_NNとCV_INTER_AREAを指定しても無視される
--CV_WARP_FILL_OUTLIERS,CV_WARP_INVERSE_MAPは加算で指定する.
-fillvalのデフォルトは黒(cvScalarAll(0))
*解説 [#l9e56163]
-flag、borderMode、borderValueの引数については下記の通り
**引数flagについて [#w524a10c]
-flagのデフォルト値はINTER_LINEAR。取れる値は以下の通り
--INTER_NEAREST:最近傍補間(0)
--INTER_LINEAR:線型補間(1)
--INTER_CUBIC:バイキュービック補間(2)
--INTER_LANCZOS4:Lanczos補間(4)
--WARP_FILL_OUTLIERS:指定色で外部を塗りつぶす。(8)
--WARP_INVERSE_MAP:逆変換による補間(16)
--INTER_AREAを指定すると、INTER_LINEARに置き換えられる。
**引数borderModeについて [#pa7fbed4]
-borderModeのデフォルト値はBORDER_CONSTANT。取れる値は以下の通り
--BORDER_CONSTANT    = 0,
--BORDER_REPLICATE   = 1,
--BORDER_REFLECT     = 2,
--BORDER_WRAP        = 3,
--BORDER_REFLECT_101 = 4,
--BORDER_TRANSPARENT = 5,
--BORDER_REFLECT101  = BORDER_REFLECT_101,
--BORDER_DEFAULT     = BORDER_REFLECT_101,
**引数borderValueについて [#kf2c9bff]
-borderValueのデフォルトは黒(Scalar())
**変換方法について [#e865bc2c]
-ホモグラフィを用いて変換する場合はwarpPerspectiveを、アフィン行列を用いて変換する場合はwarpAffineを使用する
-warpPerspectiveは以下の数式に基づいて変換を行う
--&mimetex(\left(\begin{array}{c} x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right) = s\left(\begin{array}{ccc} M_{11} & M_{12} &  M_{13} \\ M _{21} &  M _{22} &  M _{23} \\ M _{31} &  M _{32} &  1 \end{array}\right)\left(\begin{array}{c} x \\ y \\ 1 \end{array}\right));
--書き換えると、ヘッダ/ドキュメントにある様な、下記の式になる
--&mimetex(\left(\begin{array}{c} x^{\prime} \\ y^{\prime} \end{array}\right) =  \left(\begin{array}{c} \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + 1} \\ \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + 1} \end{array} \right));
-warpAffineは以下の数式に基づいて変換を行う
--&mimetex(\left(\begin{array}{c} x^{\prime} \\ y^{\prime} \end{array}\right) = \left(\begin{array}{ccc} M _{11} & M _{12} &  M _{13} \\ M _{21} &  M _{22} &  M _{23} \end{array}\right)\left(\begin{array}{c} x \\ y \end{array}\right));
--書き換えると、ヘッダ/ドキュメントにある様な、下記の式になる
--&mimetex(\left(\begin{array}{c} x^{\prime} \\ y^{\prime} \end{array}\right) = \left(\begin{array}{c} M _{11} x +  M _{12} y +  M _{13} \\ M _{21} x +  M _{22} y +  M _{23}\end{array}\right));


*サンプルコード [#pde0c698]

 // ホモグラフィによる変換
 // 変数宣言
 IplImage *image, *converted;
 CvMat *homography;
 homography = cvCreateMat(3, 3, CV_32F);                    // 領域確保
 cvFindHomography(src_points, dst_points, homography);      // ホモグラフィ計算
 image = cvLoadImage("input.bmp", CV_LOAD_IMAGE_UNCHANGED); // 画像のロード
 converted = cvCreateImage(cvGetSize(image), image->depth, image->nChannels);
                                                            // 画像の領域確保
 cvWarpPerspective(image, converted, homography,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(255));
                                                            // ホモグラフィに基づき変換

*実体ファイル [#ffff384b]
-cv/include/cv.h
-cv/src/cvcalibration.cpp (cvFindHomography)
-cv/src/cvimgwarp.cpp (cvWarpPerspective)

ジャンル[[:OpenCV]][[:OpenCV 1.0]]準拠



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS