您的位置:首页 > 编程语言 > Java开发

Java+opencv3.2.0之仿射变换

2017-08-17 17:50 519 查看
仿射变换是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。

我们通常使用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;
}


源图片:



方法一结果:



方法二结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: