透视变换
概念: 透视令换(Perspeclive Transfornation)将图片投影到一个新的视平面,也称作投影映射;
要找到4个点,其中任意三个不共线;透视变换焰阵 M 大小为 3*3;
主要函数:
- Imgproc.getPerspectivelransform(Mat src, Mat dst);
- Imgproc.warpPerspective(Mat src, Mat dst, Mat M, Size dsizc, int flags);
原图:
变化图
代码如下:
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class WrapofflinePrespectivePoint {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
// 读取图像-->旋转
Mat imread = Imgcodecs.imread(
"D:\Users\WorkWaiting\HelloOpenCv\res" +
"\page.jpg");
HighGui.imshow("page",imread); //1280 X 720
HighGui.waitKey(0);
//定义两个变换的矩阵点
Point[] points1 = new Point[4]; //输入图像点
points1[0] = new Point(200,120);
points1[1] = new Point(400,240);
points1[2] = new Point(180,480);
points1[3] = new Point(460,460);
Point[] points2 = new Point[4]; //输出图像点
points2[0] = new Point(0,0);
points2[1] = new Point(240,0);
points2[2] = new Point(0,240);
points2[3] = new Point(240,240);
// 变换点->面
MatOfPoint2f matOfPoint2f1 = new MatOfPoint2f(points1);
MatOfPoint2f matOfPoint2f2 = new MatOfPoint2f(points2);
// 变换三角形图像
Mat dst = new Mat();
Mat affineTransform = Imgproc.getPerspectiveTransform(matOfPoint2f1, matOfPoint2f2);
Imgproc.warpPerspective(imread, dst, affineTransform, new Size(240,240));
//显示图像 按键盘Enter键进行切换旋转图像
HighGui.imshow("page", dst);
//退出图像显示程序0
HighGui.waitKey(0);
System.out.println("OK-->END Windows");
}
}