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
示例代码
方法一:
方法二
源图片:
方法一结果:
方法二结果:
我们通常使用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; }
源图片:
方法一结果:
方法二结果:
相关文章推荐
- Java+opencv3.2.0之canny算子
- Java+opencv3.2.0之人脸检测
- Java+opencv3.2.0之hough圆检测
- Java+opencv3.2.0之删除最小连通区域
- Java+opencv3.2.0之灰度化
- Java+opencv3.2.0之Laplacian算子
- Java+opencv3.2.0实现人脸检测功能
- Java+opencv3.2.0之中值滤波
- Java+opencv3.2.0实现hough直线检测
- Java+opencv3.2.0之scharr滤波器
- Java+opencv3.2.0实现hough圆检测功能
- Java+opencv3.2.0实现模板匹配
- Java+opencv3.2.0之直方图均衡详解
- Java+opencv3.2.0之sobel算子
- Java+opencv3.2.0之直方图均衡
- Java+opencv3.2.0之均值滤波
- opencv 3.0 仿射变换 图形旋转 getRotationMatrix2D warpAffine
- Opencv学习之仿射变换、直方图均衡化
- vs2017 配置 OpenCV3.2.0
- 用opencv中的warpAffine获取仿射变换图片保存