OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
画像の幾何学的変換

目標

変換

スケーリング

スケーリングは単に画像のリサイズである。OpenCV にはこの目的のための関数 cv.resize() が用意されている。画像のサイズは手動で指定することも、スケーリング係数を指定することもできる。さまざまな補間方法が使用される。推奨される補間方法は、縮小には cv.INTER_AREA、拡大には cv.INTER_CUBIC (低速) と cv.INTER_LINEAR である。

次の関数を使用する: cv.resize (src, dst, dsize, fx = 0, fy = 0, interpolation = cv.INTER_LINEAR)

引数
src入力画像
dst出力画像。サイズは dsize(非ゼロの場合)、または src.size(), fx, fy から計算されたサイズを持つ。dst の型は src と同じである。
dsize出力画像のサイズ。ゼロの場合は次のように計算される。

\[𝚍𝚜𝚒𝚣𝚎 = 𝚂𝚒𝚣𝚎(𝚛𝚘𝚞𝚗𝚍(𝚏𝚡*𝚜𝚛𝚌.𝚌𝚘𝚕𝚜), 𝚛𝚘𝚞𝚗𝚍(𝚏𝚢*𝚜𝚛𝚌.𝚛𝚘𝚠𝚜))\]

dsize、または fx と fy の両方のいずれかが非ゼロでなければならない。
fx水平軸方向のスケール係数。0 の場合は次のように計算される。

\[(𝚍𝚘𝚞𝚋𝚕𝚎)𝚍𝚜𝚒𝚣𝚎.𝚠𝚒𝚍𝚝𝚑/𝚜𝚛𝚌.𝚌𝚘𝚕𝚜\]

fy垂直軸方向のスケール係数。0 の場合は次のように計算される。

\[(𝚍𝚘𝚞𝚋𝚕𝚎)𝚍𝚜𝚒𝚣𝚎.𝚑𝚎𝚒𝚐𝚑𝚝/𝚜𝚛𝚌.𝚛𝚘𝚠𝚜\]

interpolation補間方法 (cv.InterpolationFlags を参照)

試してみよう

平行移動

平行移動はオブジェクトの位置をずらすことである。(x,y) 方向のずれが分かっていて、それを \((t_x,t_y)\) とすると、次のように変換行列 \(\textbf{M}\) を作成できる:

\[M = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \end{bmatrix}\]

次の関数を使用する: cv.warpAffine (src, dst, M, dsize, flags = cv.INTER_LINEAR, borderMode = cv.BORDER_CONSTANT, borderValue = new cv.Scalar())

引数
src入力画像。
dstサイズ dsize を持ち、src と同じ型を持つ出力画像。
Mat2 × 3 の変換行列 (cv.CV_64FC1 型)。
dsize出力画像のサイズ。
flags補間方法の組み合わせ (cv.InterpolationFlags を参照) と、M が逆変換 ( 𝚍𝚜𝚝→𝚜𝚛𝚌 ) であることを意味する省略可能なフラグ WARP_INVERSE_MAP の組み合わせ
borderModeピクセル外挿方法 (cv.BorderTypes を参照)。borderMode = BORDER_TRANSPARENT の場合、入力画像の「外れ値」に対応する出力画像のピクセルがこの関数によって変更されないことを意味する。
borderValue定数境界の場合に使われる値。デフォルトは 0。

行数。

試してみよう

回転

角度 \(\theta\) での画像の回転は、次の形式の変換行列によって実現される

\[M = \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\]

ただし OpenCV は回転中心を調整可能なスケール付き回転を提供しており、好きな任意の位置で回転させることができる。変更後の変換行列は次のように与えられる

\[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot center.x - \beta \cdot center.y \\ - \beta & \alpha & \beta \cdot center.x + (1- \alpha ) \cdot center.y \end{bmatrix}\]

ここで:

\[\begin{array}{l} \alpha = scale \cdot \cos \theta , \\ \beta = scale \cdot \sin \theta \end{array}\]

次の関数を使用する: cv.getRotationMatrix2D (center, angle, scale)

引数
center入力画像における回転の中心。
angle度単位の回転角度。正の値は反時計回りの回転を意味する (座標原点は左上隅にあると想定する)。
scale等方的なスケール係数。

試してみよう

アフィン変換

アフィン変換では、元の画像内のすべての平行線が出力画像でも平行のままとなる。変換行列を求めるには、入力画像からの3点と、それらの出力画像における対応する位置が必要である。すると cv.getAffineTransform が 2x3 行列を作成し、それを cv.warpAffine に渡す。

次の関数を使用する: cv.getAffineTransform (src, dst)

引数
src入力画像からの3点 ([3, 1] サイズで cv.CV_32FC2 型)。
dst出力画像における対応する3点 ([3, 1] サイズで cv.CV_32FC2 型)。

試してみよう

透視変換

透視変換には 3x3 の変換行列が必要である。直線は変換後も直線のままである。この変換行列を求めるには、入力画像上の4点と、出力画像上の対応する点が必要である。これら4点のうち、3点は同一直線上にあってはならない。すると変換行列は関数 cv.getPerspectiveTransform で求めることができる。その後、この 3x3 の変換行列を用いて cv.warpPerspective を適用する。

次の関数を使用する: cv.warpPerspective (src, dst, M, dsize, flags = cv.INTER_LINEAR, borderMode = cv.BORDER_CONSTANT, borderValue = new cv.Scalar())

引数
src入力画像。
dstサイズ dsize を持ち、src と同じ型を持つ出力画像。
Mat3 × 3 の変換行列 (cv.CV_64FC1 型)。
dsize出力画像のサイズ。
flags補間方法 (cv.INTER_LINEAR または cv.INTER_NEAREST) と、M を逆変換 (𝚍𝚜𝚝→𝚜𝚛𝚌) として設定する省略可能なフラグ WARP_INVERSE_MAP の組み合わせ。
borderModeピクセル外挿方法 (cv.BORDER_CONSTANT または cv.BORDER_REPLICATE)。
borderValue定数境界の場合に使われる値。デフォルトは 0。

cv.getPerspectiveTransform (src, dst)

引数
src入力画像における四角形の頂点の座標。
dst出力画像における対応する四角形の頂点の座標。

試してみよう