分类
标签
.NET 9008 adb android apt asp.net ASP.NET Core audio bug C c++ C++ chrome cmd csharp CSharp css css3 debian debug dotnet dotnet Framework dpkg GDI&GDI+ gdi&gdi+ golang graphics html html5 http java javascript json kali linux linux mci microsoft minimap MSBuild mysql OpenCV PInvoke powershell python QQ rust shell speex sql tutorial ubuntu ui unity vb.net visual studio Visual Studio web Web win32 winapi windows winform WinForm wpf WPF xaml xfce 列表 刷机 前端 加密 反射 反编译 可视化 图像处理 多线程 字符串 安卓 实例 局域网 幻影坦克 库 开发语言 异步 微信 手册 手机 接口 摘要 救砖 数字签名 数字证书 数字音频 数据库 桌面程序 游戏 游戏引擎 源码 爬虫 玩游戏 电脑硬件 笔记 算法 类库 线性代数 编程语言 网络 脚本语言 计算机图形学 计算机基础 设计模式 语音编解码 运维 进制 面向对象编程 音频 音频编码解码
416 字
2 分钟
透视转换, 从一个四边形, 映射到另一个四边形
概述
透视变换用于将在坐标系中的一个四边形映射到另一个四边形. 相较于仿射变换, 透视变换前平行的线, 并不保证再变换后仍然平行. 但直线在变换之后仍然是直线.
一般的, 是通过两四边形的点, 获取一个表示透视变换的矩阵, 对点做乘法, 最后对结果做处理, 即可得到变换之后的点.
不过这里的点, 需要作为三行一列的矩阵传入, 第三行传入 1:
最后变换的结果就是 .
实操
使用 OpenCV, 即可轻松实现. Cv2.GetPerspectiveTransform
传入两个表示四边形点的可迭代对象, 返回一个三行三列的透视变换矩阵:
Mat GetPerspectiveTransform(IEnumerable<Point2f> src, IEnumerable<Point2f> dst);
那么, 假设我们有两个长度为 4 的 Point2f 数组, 每一个数组存储四边形的四个点坐标, 那么通过以下操作, 即可得到透视变换矩阵:
Point2f[] srcQard; // 源四边形
Point2f[] destQard; // 目标四边形
Mat perspectiveTransform = Cv2.GetPerspectiveTransform(srcQard, destQard);
接下来, 假设我们有要进行变换的点的 x y 坐标, 然后构造一个存储该点的矩阵:
double x; // X
double y; // Y
Mat matrixPoint = new Mat<double>(3, 1);
matrixPoint.Set<double>(0, 0, x);
matrixPoint.Set<double>(1, 0, y);
matrixPoint.Set<double>(2, 0, 1);
进行乘法运算, 并取得变换结果:
Mat result = perspectiveTransform * matrixPoint;
double resultX = result.Get<double>(0, 0) / result.Get<double>(2, 0);
double resultY = result.Get<double>(1, 0) / result.Get<double>(2, 0);
透视转换, 从一个四边形, 映射到另一个四边形
https://slimenull.com/posts/202410030308/