cvWarpPerspectiveで画像を変換 #contents *void cvFindHomography( const CvMat* src_points, const CvMat* dst_points, CvMat* homography ); [#k45858bc] src_pointsをdst_pointsに変換するホモグラフィhomographyを計算する. **引数 [#p38c0b97] -src_points:CvMat*型の変換前の座標 -dst_points:CvMat*型の変換後の座標 -homography:CvMat*型のhomography **返り値 [#u32972d5] -void型なのでなし *void cvWarpPerspective(const IplImage* before, IplImage* after, const CvMat* homography, int flag, CvScalar fillval); [#qa77189e] beforeをhomographyに基づいて変換 **引数 [#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] -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)) *サンプルコード [#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]]