仿射变换是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。
我们通常使用2x3的矩阵来表示仿射变换。
我们一般使用getRotationMatrix2D来获取旋转矩阵。
函数: Imgproc.getRotationMatrix2D(Point center, double angle, double scale)
参数说明:
center:源图像的旋转中心
angle:旋转角度
scale:缩放因子
仿射变换函数:
Imgproc.warpAffine(Mat src, Mat dst, Mat M, Size dsize, int flags, int borderMode, Scalar borderValue)
参数说明:
src:源图像
dst:目标图像
M:2x3旋转矩阵
dsize:输出图像的大小
flags:插值方式,默认INTER_LINEAR
borderMode:边界像素模式,默认BORDER_CONSTANT
borderValue:在恒定的边界情况下取的值,默认Scalar(),即0
示例代码
方法一:
public Mat rotate2(Mat splitImage, double angle)
{
Mat imgDst = splitImage.clone();
Point pt = new Point(splitImage.cols() / 2, splitImage.rows() / 2);
Mat affineTrans = Imgproc.getRotationMatrix2D(pt, angle, 1.0);
Imgproc.warpAffine(splitImage, imgDst, affineTrans, imgDst.size(),
Imgproc.INTER_CUBIC | Imgproc.WARP_FILL_OUTLIERS);
return imgDst;
}
方法二
public Mat rotate3(Mat splitImage, double angle)
{
double thera = angle * Math.PI / 180;
double a = Math.sin(thera);
double b = Math.cos(thera);
int wsrc = splitImage.width();
int hsrc = splitImage.height();
int wdst = (int) (hsrc * Math.abs(a) + wsrc * Math.abs(b));
int hdst = (int) (wsrc * Math.abs(a) + hsrc * Math.abs(b));
Mat imgDst = new Mat(hdst, wdst, splitImage.type());
Point pt = new Point(splitImage.cols() / 2, splitImage.rows() / 2);
// 获取仿射变换矩阵
Mat affineTrans = Imgproc.getRotationMatrix2D(pt, angle, 1.0);
System.out.println(affineTrans.dump());
// 改变变换矩阵第三列的值
affineTrans.put(0, 2, affineTrans.get(0, 2)[0] + (wdst - wsrc) / 2);
affineTrans.put(1, 2, affineTrans.get(1, 2)[0] + (hdst - hsrc) / 2);
Imgproc.warpAffine(splitImage, imgDst, affineTrans, imgDst.size(),
Imgproc.INTER_CUBIC | Imgproc.WARP_FILL_OUTLIERS);
return imgDst;
}
源图片:
方法一结果:
方法二结果: