目录
1、概念
仿射变换:一个任意的仿射变换都能表示为 乘以一个矩阵(线性变换)接着在加上一个向量(平移)。
旋转 =》线性变换
平移 =》向量加
缩放操作 =》线性变换
2、如何获取仿射变换
仿射变换基本表示的就是两张图之间的联系。
a、已知两张图有联系,求解矩阵M
3、例程
步骤1、加载一幅图片
2、对这幅图片应用仿射变换,这个变换是从源图像和目标图像的两组三个点之间的联系获取的,这一步我们使用函数warpAffine算子实现。
3、仿射变换结束后在进行旋转操作,旋转是绕图像中心进行旋转。
4、等待推出程序。
4、代码
/*OpenCvSharp 4.0*/
/*加载图片并使用仿射变换扭曲图片*/
public static void loadMat()
{
SourceMat = Cv2.ImRead(Path);
Cv2.ImShow("原始图片",SourceMat);
DestMat = new Mat(SourceMat.Size(), MatType.CV_8UC3);
Cv2.CopyTo(SourceMat, DestMat);
Point2f[] sourcePoints = new Point2f[3];
Point2f[] destPoints = new Point2f[3];
sourcePoints[0] = new Point2f(0, 0);
sourcePoints[1] = new Point2f(SourceMat.Size().Width, 0);
sourcePoints[2] = new Point2f(0, SourceMat.Size().Height);
destPoints[0] = new Point2f(DestMat.Cols*(float)0.2, (float)(DestMat.Rows * 0.3));
destPoints[1] = new Point2f((float)(DestMat.Cols*0.85), (float)(DestMat.Rows * 0.25));
destPoints[2] = new Point2f((float)(DestMat.Cols * 0.15), (float)(DestMat.Rows * 0.7));
Mat affineMat= Cv2.GetAffineTransform(sourcePoints, destPoints);
Cv2.WarpAffine(SourceMat, DestMat, affineMat, SourceMat.Size());
Cv2.ImShow("扭曲图片",DestMat);
}
/*旋转和缩放图像*/
public static void RotationMat(Mat TransMat,Point2f center)
{
Mat rotationMat= Cv2.GetRotationMatrix2D(center,-50, 0.6);
Mat outmat = new Mat(TransMat.Size(), MatType.CV_8UC3);
Cv2.WarpAffine(TransMat, outmat, rotationMat, TransMat.Size());
Cv2.ImShow("旋转图片",outmat);
}
源图(素材来自网络如有雷同请联系作者删除)
仿射变换
旋转缩放
5、常用算子
获取仿射变换算子
Imread();加载图片
ImShow();显示图片
getAffineTransForm():求得扭曲变换
getRotationMatrix2D():求得旋转缩放区镇矩阵
获取仿射变换
warp_mat = getAffineTransform( srcTri, dstTri );
获取旋转矩阵:
rot_mat = getRotationMatrix2D( center, angle, scale );
修正图片:
warpAffine( src, warp_dst, warp_mat, warp_dst.size() );