変換行列を元に、画像を変形する #contents *void warpPerspective(InputArray before, OutputArray after, InputArray matrix, Size dsize, int flags, int borderMode, const Scalar& borderValue); [#l9bf0984] -beforeをMatrix(ホモグラフィ)に基づいて変換 **引数 [#lea61f4b] -before:Mat型の画像。座標変換前の画像 -after:Mat型の画像。座標変換後の画像 -matrix:Mat型の変換行列(ホモグラフィ) -dsize:Size型の出力画像のサイズ -flag:int型で変換方法のフラグ。詳細は後述。省略した場合はINTER_LINEAR -borderMode:int型の、境界の対処方法。省略した場合はBORDER_CONSTANT -borderValue:Scalar型の値。WARP_FILL_OUTLIERSを指定した場合、この色で空いた部分を塗りつぶす **返り値 [#l3c56b7c] -void型なのでなし *void warpAffine(InputArray before, OutputArray after, InputArray matrix, Size dsize, int flags, int borderMode, const Scalar& borderValue); [#u1a16464] -beforeをMatrix(アフィン行列)に基いて変換 **引数 [#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を指定した場合、この色で空いた部分を塗りつぶす **返り値 [#h0aa8836] -void型なのでなし *解説 [#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]]準拠