news 2026/3/13 4:00:52

OpenCVSharp:透视变换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCVSharp:透视变换

概述

透视变换是一种计算机视觉技术,它可以将图像从一个视角转换到另一个视角,通过计算3×3的变换矩阵来实现图像中任意四边形区域到另一个四边形区域的映射。这种变换能够校正图像中的透视畸变,例如将倾斜拍摄的文档"拉直"为正面视图,或者从不同角度观察同一平面物体时的视角转换,广泛应用于文档扫描、建筑摄影校正、图像拼接和增强现实等领域。

效果:

实践

首先按照顺序点击四个点获取这四个点的坐标并在图像上绘制出来:

public void HandleMouseClick(OpenCvSharp.Point position, double actualWidth, double actualHeight) { if (_originalMat == null) return; // 计算缩放比例 // Image控件通常是Uniform Stretch,所以我们需要计算实际显示的图像区域 double imageWidth = _originalMat.Width; double imageHeight = _originalMat.Height; double scaleX = actualWidth / imageWidth; double scaleY = actualHeight / imageHeight; double scale = Math.Min(scaleX, scaleY); // 计算图像在控件中的偏移(居中显示时) double offsetX = (actualWidth - imageWidth * scale) / 2; double offsetY = (actualHeight - imageHeight * scale) / 2; // 转换坐标到图像坐标系 double imgX = (position.X - offsetX) / scale; double imgY = (position.Y - offsetY) / scale; // 检查点击是否在图像范围内 if (imgX >= 0 && imgX < imageWidth && imgY >= 0 && imgY < imageHeight) { AddPoint((float)imgX, (float)imgY); } } private void AddPoint(float x, float y) { if (_points.Count >= 4) return; _points.Add(new Point2f(x, y)); // 在临时Mat上绘制点 Cv2.Circle(_tempMat, (int)x, (int)y, 5, Scalar.Red, -1); // 更新显示图像以显示新绘制的点 DisplayImage = ConvertMatToBitmapImage(_tempMat); if (_points.Count == 4) { PerformPerspectiveTransform(); } }

然后执行透视变换:

private void PerformPerspectiveTransform() { Point2f[] srcPoints = _points.ToArray(); Point2f[] dstPoints = new Point2f[] { new Point2f(0, 0), new Point2f(0, 480), new Point2f(640, 480), new Point2f(640, 0), }; try { usingvar matrix = Cv2.GetPerspectiveTransform(srcPoints, dstPoints); usingvar dst = new Mat(new Size(640, 480), MatType.CV_8UC3); Cv2.WarpPerspective(_originalMat, dst, matrix, dst.Size()); ResultImage = ConvertMatToBitmapImage(dst); } catch (Exception ex) { MessageBox.Show($"变换失败: {ex.Message}"); } }

这个过程主要用到了Cv2.GetPerspectiveTransform与Cv2.WarpPerspective函数,我们只需搞懂这两个函数怎么用就知道怎么使用透视变换了。

先查看Cv2.GetPerspectiveTransform的函数签名:

public static Mat GetPerspectiveTransform(IEnumerable<Point2f> src, IEnumerable<Point2f> dst)

这个函数根据四对对应点计算透视变换矩阵,将源图像中的四边形区域映射到目标图像中的四边形区域。

参数名

类型

说明

src

IEnumerable<Point2f>

源图像中四边形顶点的坐标集合(4个点)

dst

IEnumerable<Point2f>

目标图像中对应四边形顶点的坐标集合(4个点)

现在查看WarpPerspective的函数签名:

public static void WarpPerspective( InputArray src, OutputArray dst, InputArray m, Size dsize, InterpolationFlags flags = InterpolationFlags.Linear, BorderTypes borderMode = BorderTypes.Constant, Scalar? borderValue = null)

这个函数将透视变换应用到输入图像上,根据给定的3×3变换矩阵将图像从一个视角转换到另一个视角。

参数名

类型

说明

src

InputArray

输入图像

dst

OutputArray

输出图像,具有dsize指定的尺寸和与src相同的类型

m

InputArray

3×3透视变换矩阵

dsize

Size

输出图像的尺寸

flags

InterpolationFlags

插值方法组合(INTER_LINEAR或INTER_NEAREST)和可选标志WARP_INVERSE_MAP(设置M为逆变换)

borderMode

BorderTypes

像素外推方法(BORDER_CONSTANT或BORDER_REPLICATE)

borderValue

Scalar?

常数边界时使用的值,默认为0

这样就可以实现透视变换了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 8:23:07

IDEA配置[自动生成jar文件]

自动生成jar文件 搞不懂为什么别人的开发环境会自动生成jar文件,而我的环境不会自动生成,研究了好久没有办法只有用工件来实现这个功能! 本文引用&#xff1a;https://zhuanlan.zhihu.com/p/669542994只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&…

作者头像 李华
网站建设 2026/3/13 4:40:29

10个AI写作工具,专科生轻松搞定论文格式与内容!

10个AI写作工具&#xff0c;专科生轻松搞定论文格式与内容&#xff01; AI 工具让论文写作不再难 对于专科生来说&#xff0c;论文写作不仅是学业的重要环节&#xff0c;也是考验综合能力的关键一步。然而&#xff0c;面对复杂的格式要求、内容逻辑的梳理以及查重率的压力&…

作者头像 李华
网站建设 2026/3/13 11:24:34

CAPL编程项目应用:CANoe中总线监控功能开发

CAPL编程实战&#xff1a;在CANoe中打造智能总线监控系统 你有没有遇到过这样的场景&#xff1f; 测试台上几十个ECU正在通信&#xff0c;Trace窗口里满屏飞舞着CAN报文&#xff0c;而你要从中找出某个偶发的“心跳丢失”或“状态跳变”问题——靠肉眼翻日志&#xff1f;等故障…

作者头像 李华
网站建设 2026/3/13 11:28:52

ESP32 Arduino环境搭建:Soft-AP配置完整示例

手把手教你用ESP32搭建本地Wi-Fi热点&#xff1a;Soft-AP实战全解析你有没有遇到过这样的场景&#xff1f;手里的智能设备还没连上家里的Wi-Fi&#xff0c;怎么给它配网&#xff1f;或者在野外、地下室这种没有路由器的地方&#xff0c;想临时控制一个传感器系统&#xff0c;该…

作者头像 李华
网站建设 2026/3/12 20:53:48

Packet Tracer汉化完整指南:适用于初学者的配置流程

让Packet Tracer说中文&#xff1a;零基础也能搞定的汉化实战指南 你是不是也曾在打开 Packet Tracer 的那一刻&#xff0c;面对满屏英文菜单感到头大&#xff1f;“Simulation Mode”是啥&#xff1f;“Realtime”和“Simulation”切换按钮到底干啥用的&#xff1f;刚学网络…

作者头像 李华
网站建设 2026/3/13 0:43:57

AES 与 SM4 加密算法:深度解析与对比

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

作者头像 李华