このサブセクションで述べる関数は,2次元画像の様々な幾何学変換を行います.つまり,画像の内容は変更せずにピクセルグリッドだけを変形し,変形したグリッドを出力画像にマッピングします.実際には,サンプリングによる余計な値や不定な値を排除するために,出力画像から入力画像という逆方向へのマッピングが行われます.つまり,出力画像の各ピクセル
に対して,入力画像中の対応する「ドナー」ピクセルの座標を求め,そのピクセル値をコピーします:

ユーザが正順のマッピング:
を指定した場合,OpenCV の関数は最初に,対応する逆マッピング:
を求めてから上述の式を利用します.
幾何学変換の実際の実装では,最も汎用的な remap() から,最も単純で高速な resize() まで,上述の式を用いて2つの主な問題を解く必要があります:
に対して,
または
のどちらか,あるいは両方が画像の外側にはみ出してしまう可能性があります.この場合,何らかの外挿手法が必要になります.OpenCVでは,フィルタリング関数の場合と同じく,いくつかの外挿手法が提供されています.さらに別の手法も追加されており,その
BORDER_TRANSPARENT
は,出力画像中の対応するピクセルが全く変更されないことを意味します.
と
は,浮動小数点数(つまり,
は,アフィン変換,透視変換,または半径方向のレンズ歪み係数など)です.よって,小数点座標上に存在するピクセル値が必要になります.最も単純なケースでは,この座標は単に最も近い整数値の座標に丸められ,そこのピクセル値が利用されます.これは,最近傍補間と呼ばれます.しかし,より洗練された
補間手法
を用いることで,より良い結果が得られます.この場合,求められたピクセル
近傍に対して多項式関数をフィッティングし,
における多項式の値を,補間されたピクセル値として利用します.OpenCVでは,複数の補間手法から選択することができます.詳しくは
resize()
を参照してください.画像変換マップを,ある表現から別の表現へ変換します.
| パラメタ: |
|
|---|
この関数は,
remap()
用のマップの組を,ある表現から別の表現へ変換します.以下のオプション(
(map1.type(), map2.type())
(dstmap1.type(), dstmap2.type())
)がサポートされます:
. これは,最も頻繁に利用される変換処理です.元の浮動小数点型マップ(
remap()
を参照してください)は,よりコンパクトで非常に高速な浮動小数点型の表現に変換されます.1番目の出力配列は丸められた座標値を表し,2番目の出力配列(ただし,
nninterpolation=false
の場合のみ作られます)は,補間テーブルのインデックスを表します.
. 上述の場合と同じですが,元のマップは1つの2チャンネル行列に格納されます.参考: remap() , undisort() , initUndistortRectifyMap()
3組の対応点からアフィン変換を求めます.
| パラメタ: |
|
|---|
この関数は,アフィン変換を表す
の行列を求めます:

ここで

となります.
参考: warpAffine() , transform()
4組の対応点から透視変換を求めます.
| パラメタ: |
|
|---|
この関数は,透視変換を表す
の行列を求めます:

ここで

となります
参考: findHomography() , warpPerspective() , perspectiveTransform()
画像から,矩形領域のピクセル値をサブピクセル精度で取得します.
| パラメタ: |
|
|---|
関数 getRectSubPix は, src からピクセルを抽出します:

ここで,非整数の座標におけるピクセル値は,バイリニア補間を用いて取得されます.また,マルチチャンネル画像の各チャンネルは,それぞれ個別に処理されます.矩形領域の中心は,必ず画像内部になければいけませんが,矩形領域の一部が画像外部にはみ出していても構いません.その場合は,画像外にある領域のピクセル値を取得するために,複製境界モード( borderInterpolate() を参照してください)が利用されます.
参考: warpAffine() , warpPerspective()
2次元回転を表すアフィン変換を求めます.
| パラメタ: |
|
|---|
この関数は,以下の行列を求める:

ここで

となります.
この変換は,回転中心をそれ自身にマップします.そうしたくない場合は,シフトによる調整を行う必要があります.
参考: getAffineTransform() , warpAffine() , transform()
アフィン変換の逆変換を求めます.
| パラメタ: |
|
|---|
この関数は,
の行列
M
で表されたアフィン変換の逆変換を求めます:

その結果は,
M
と同じ型の
の行列になります.
画像に対して,汎用的な幾何学変換を適用します.
| パラメタ: |
|
|---|
関数 remap は,指定されたマップを用いて入力画像を変換します:

非整数の座標値を持つピクセルの値は,有効な補間手法の1つを用いて求められます.
と
は,それぞれ個別の浮動小数点型マップ
と
としてエンコードされるか,または
のインタリーブされた1つの浮動小数点型マップ
,あるいは
convertMaps()
を利用して作成された固定小数点型マップとしてエンコードされます.マップが浮動小数点表現から固定小数点表現に変換されるとすれば,その理由は幾何学変換処理が大幅に高速化される(約2倍)からです.変換された場合,
は
(cvFloor(x), cvFloor(y))
というペアを表し,
は補間係数テーブルのインデックスを表します.
この関数は,置換モードでは動作しません.
画像のサイズを変更します.
| パラメタ: |
|
|---|
関数 resize は,画像 src を指定されたサイズに縮小,あるいは拡大します. dst の型やサイズは考慮されないことに注意してください.その代わり,型やサイズは src , dsize , fx そして fy から求められます.あらかじめ用意しておいた dst とぴったり同じになるように src のサイズを変更したい場合,次のような関数呼び出しができます:
// dsize=dst.size(); を明示的に指定します. fx と fy はここから計算されます.
resize(src, dst, dst.size(), 0, 0, interpolation);
各方向に二分の一に縮小したい場合は,次のような関数呼び出しができます:
// fx とfy を定して,関数に出力画像サイズを計算させます.
resize(src, dst, Size(), 0.5, 0.5, interpolation);
参考: warpAffine() , warpPerspective() , remap() .
画像のアフィン変換を行います.
| パラメタ: |
|
|---|
関数 warpAffine は,指定された行列を用いて入力画像を変換します:

ここでは,フラグ WARP_INVERSE_MAP が設定されています.そうでない場合は,まず invertAffineTransform() によって逆変換が求められ,それが上式の M の代わりに利用されます. この関数は,置換モードでは動作しません.
参考: warpPerspective() , resize() , remap() , getRectSubPix() , transform()
画像の透視変換を行います.
| パラメタ: |
|
|---|
関数 warpPerspective は,指定された行列を用いて入力画像を変換します:

ここでは,フラグ WARP_INVERSE_MAP が設定されています.そうでない場合は,まず invert() によって逆変換が求められ,それが上式の M の代わりに利用されます. この関数は,置換モードでは動作しない.
参考: warpAffine() , resize() , remap() , getRectSubPix() , perspectiveTransform()