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−)_⋅センター.x−b⋅センター.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 3、M2 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 です。
warpPerspective、resize、remap、getRectSubPix、transformを参照
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;
}
操作結果: