このサブセクションで述べる関数は,2次元画像の様々な幾何学変換を行います.つまり,画像の内容は変更せずにピクセルグリッドだけを変形し,変形したグリッドを出力画像にマッピングします.実際には,サンプリングによる余計な値や不定な値を排除するために,出力画像から入力画像という逆方向へのマッピングが行われます.つまり,出力画像の各ピクセル に対して,入力画像中の対応する「ドナー」ピクセルの座標を求め,そのピクセル値をコピーします:
ユーザが正順のマッピング: を指定した場合,OpenCV の関数は最初に,対応する逆マッピング: を求めてから上述の式を利用します.
幾何学変換の実際の実装では,最も汎用的な remap() から,最も単純で高速な resize() まで,上述の式を用いて2つの主な問題を解く必要があります:
2次元回転のアフィン変換行列を求めます.
パラメタ: |
|
---|
関数 cv2DRotationMatrix は,次のような変換行列を求めます:
ここで,
です. この変換は,回転中心をそれ自身に写像します.それを意図していない場合は,並進を調整しなければいけません.
3組の対応点を用いてアフィン変換行列を求めます.
パラメタ: |
|
---|
この関数は,次のようなアフィン変換行列を求めます:
ここで
です.
3組の対応点を用いて透視変換行列を求めます.
パラメタ: |
|
---|
この関数は,次のような透視変換行列を求めます:
ここで
です.
画像から,四角形領域のピクセル値をサブピクセル精度で取得します.
パラメタ: |
|
---|
この関数は,以下のようにして src からサブピクセル精度でピクセル値を取得し,それを dst に格納します:
ここで
であり,また
です.
非整数の座標におけるピクセル値は,バイリニア補間を用いて取得されます.画像外部にある領域のピクセル値を取得する場合は,複製境界モードを利用します.また,マルチチャンネル画像の各チャンネルは,それぞれ独立に処理されます.
画像から,矩形領域のピクセル値をサブピクセル精度で取得します.
パラメタ: |
|
---|
この関数は,以下のように, src からピクセル値を取得します:
ここで,非整数の座標におけるピクセル値は,バイリニア補間を用いて取得されます.また,マルチチャンネル画像の各チャンネルは,それぞれ独立に処理されます.矩形領域のの中心は,必ず画像内部になければいけませんが,矩形領域の一部が画像外部にはみ出していても構いません.その場合は,画像外部にある領域のピクセル値を取得するために,複製境界モードを利用します.
画像を対数極座標空間に写像します.
パラメタ: |
|
---|
この関数は,入力画像に対して次のような変換を行います:
順変換( CV_WARP_INVERSE_MAP が指定されていない場合 ):
逆変換( CV_WARP_INVERSE_MAP が指定されている場合 ):
ここで
です.
この関数は,人間の「中心」視を模倣したものであり,物体追跡などのための,高速なスケーリングと回転に不変なテンプレートマッチングに利用できます.また,この関数は,置換モードでは動作しないことに注意してください.
#include <cv.h>
#include <highgui.h>
int main(int argc, char** argv)
{
IplImage* src;
if( argc == 2 && (src=cvLoadImage(argv[1],1) != 0 )
{
IplImage* dst = cvCreateImage( cvSize(256,256), 8, 3 );
IplImage* src2 = cvCreateImage( cvGetSize(src), 8, 3 );
cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 40,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
cvLogPolar( dst, src2, cvPoint2D32f(src->width/2,src->height/2), 40,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP );
cvNamedWindow( "log-polar", 1 );
cvShowImage( "log-polar", dst );
cvNamedWindow( "inverse log-polar", 1 );
cvShowImage( "inverse log-polar", src2 );
cvWaitKey();
}
return 0;
}
このプログラムに, opencv/samples/c/fruits.jpg を渡した場合の結果を以下に示します.
画像の幾何学変換を行います.
パラメタ: |
|
---|
この関数は,指定された写像を用いて次のように入力画像を変換します:
他の幾何変換と同様,非整数の座標におけるピクセル値を求めるために,(ユーザが指定する)補間手法が用いられます.また,この関数は,置換モードでは動作しないことに注意してください.
画像をリサイズします.
パラメタ: |
|
---|
この関数は,画像 src を dst に正確に一致するようにリサイズします.また,ROIが設定されている場合には,それを考慮します.
画像のアフィン変換を行います.
パラメタ: |
|
---|
この関数は,指定された行列を用いて入力画像を以下のように変換します:
ここで
です.
この関数は, GetQuadrangleSubPix と似ていますが,完全に等価というわけではありません WarpAffine は,入力画像と出力画像が同じデータ型でなければならず,オーバーヘッドも大きいです(よって,小さい画像を変換するのには適していません).さらに,出力画像の一部を変更しないままにしておく事もできます.一方, GetQuadrangleSubPix は,8ビット画像から抽出した矩形領域のピクセル値を浮動小数点型のバッファに保存しますし,オーバーヘッドも小さいです.さらに,常に出力画像全体が変更され,すべてのピクセルが埋められます.また,この関数は,置換モードでは動作しないことに注意してください.
疎な点集合を変換する場合は,cxcore の関数 Transform を利用します.
画像の透視変換を行います.
パラメタ: |
|
---|
この関数は,指定された行列を用いて入力画像を以下のように変換します:
この関数は,置換モードでは動作しないことに注意してください.また,疎な点集合を変換する場合は,cxcore の関数 PerspectiveTransform を利用します.