OpenCV画像のアフィン変換

OpenCV 画像の回転は画像のアフィン変換によって実現され、画像の回転は 3 つのステップに分割されます。

ステップ 1: 回転角度と回転中心を決定します。

ステップ 2: 回転行列を決定します。getRotationMatrix2D 関数によって計算されます。

ステップ 3: アフィン変換によって回転します。warpAffine関数で実現します。

1.getRotationMatrix2D関数

プロトタイプ

CV_EXPORTS_W Mat getRotationMatrix2D(Point2f center, double angle, double scale);

機能: 2 次元の回転アフィン行列を計算します。

連続変数を作成します:
[ [ α β ( 1 − α ) ⋅ center.x − β ⋅ center.y − β α β ⋅ center.x + ( 1 − α ) ⋅ center.y ] ] [\begin{bmatrix } \alpha & \beta & (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta & \alpha & \beta \cdot \texttt{ center .x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}][ [ある bbある( 1_センター.xbセンター.ybセンター.x+( 1_センター.y] ]
プロパティ:
[ α = スケール ⋅ cos ⁡ 角度 、 β = スケール ⋅ sin ⁡ 角度 ] [\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \ \ \beta = \texttt{スケール} \cdot \sin \texttt{角度} \end{配列}][ある=規模コス角度b=規模角度]
変形マッピング 回転中心は中心そのものです。これがターゲットでない場合はオフセットを調整します。

パラメータの解釈

  • パラメータ center ソース画像の回転の中心
  • パラメータの angle は読み値で表される回転角度で、正の値は反時計回り(座標原点は左上隅とします)を示します。
  • パラメータ スケール 両方の軸の等方性スケール係数。1 はスケーリングなしを意味します。

参考 getAffineTransform, warpAffine, transform

2、warpAffine関数

プロトタイプ:

CV_EXPORTS_W void warpAffine( InputArray src, OutputArray dst,
                              InputArray M, Size dsize,
                              int flags = INTER_LINEAR,
                              int borderMode = BORDER_CONSTANT,
                              const Scalar& borderValue = Scalar());

機能: 画像にアフィン変換を実装します。

WARP_INVERSE_MAP フラグが設定されている場合、関数 warpAffine は次の行列を使用してアフィン変換を実装します:
[ dst ( x , y ) = src ( M 11 x + M 12 y + M 13 , M 21 x + M 22 y + M 23 ) ] [\texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _ { 13}、\texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23})][ dst ( x ,y )=src ( M1 1バツ+M1 2y+M1 3M2 1バツ+M2 2y+M2 3それ以外の場合
、変換は最初に invertAffineTransform を使用して逆変換され、次に上記の式の M に代入され、関数をインプレースで変換することはできません。

パラメータの解釈

  • パラメータ src 入力画像。
  • パラメータ dst は画像を出力し、サイズは dszie で、型は src と同じです。
  • パラメータ M 2*3 の変換行列。
  • パラメータ dsize 出力画像サイズ。
  • パラメーター フラグの内挿方法 ( InterpolationFlagsを参照) とオプションのフラグWARP_INVERSE_MAPの組み合わせは、M が逆変換であることを意味します。
  • パラメータ borderMode ピクセル外挿 ( BorderTypesを参照);
    borderMode=#BORDER_TRANSPARENT の場合、ターゲット イメージのピクセルが元のイメージの「外れ値」に対応し、関数で変更できないことを意味します。
  • パラメータ borderValue は固定エッジケースの値で、デフォルトは 0 です。

warpPerspectiveresizeremapgetRectSubPixtransformを参照

3. ソースコード例

1.回転

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    
    
	Mat src = imread("D:\\OpenCVtest\\images\\juice.png", 1);
	if (src.empty())
	{
    
    
		cout << "could not load image..." << endl;
		return -1;
	}

	double rotate_angle = 15;                              //设置旋转的角度
	Point2f rotate_center(src.rows / 2, src.cols / 2);     // 设置旋转中心
	Mat rotate_matrix = getRotationMatrix2D(rotate_center, rotate_angle, 1);     //计算旋转矩阵
	Size dstSize(src.cols, src.rows);
	Mat image_dst;
	warpAffine(src, image_dst, rotate_matrix, dstSize );    // 仿射变换
	imshow("源图像", src);
	imshow("仿射变换0", image_dst);

	waitKey();
	return 0;
}

操作結果:

ここに画像の説明を挿入

2. 3 点マッピング

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    
    
	Mat src = imread("D:\\OpenCVtest\\images\\juice.png", 1);
	if (src.empty())
	{
    
    
		cout << "could not load image..." << endl;
		return -1;
	}
	Size dstSize(src.cols, src.rows);
	
	//  定义三个点
	Point2f srcPoints[3];
	Point2f dstPoints[3];
	srcPoints[0] = Point2f(0, 0);
	srcPoints[1] = Point2f(0, (float)(src.cols-1));
	srcPoints[2] = Point2f(float(src.rows-1), (float)(src.cols - 1));

	// 变换后的三个点
	dstPoints[0] = Point2f((float)(src.rows)*0.15, (float)(src.cols)*0.25);
	dstPoints[1] = Point2f((float)(src.rows) * 0.25, (float)(src.cols) * 0.65);
	dstPoints[2] = Point2f((float)(src.rows) * 0.70, (float)(src.cols) * 0.70);

	// 根据对应点求仿射矩阵
	Mat rotate_matrx_1 = getAffineTransform(srcPoints, dstPoints);
	Mat image_warp;
	warpAffine(src, image_warp, rotate_matrx_1, dstSize);
	imshow("源图像", src);
	imshow("三点映射仿射变换", image_warp);

	waitKey();
	return 0;
}

操作結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/jndingxin/article/details/120670489