news 2026/7/20 16:11:47

基于 OpenCV C# 的直线卡尺工具源码分享

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 OpenCV C# 的直线卡尺工具源码分享

基于Opencv C# 开发的直线卡尺工具源码,可以求直线交点,代码运行正常,由实际运行项目中剥离,含测试图片,包含一个强大的视觉控件源码,控件仿halcon,支持平移,无损缩放,显示各种自定义图形工具,鼠标拖动,简单方便。

最近在项目中搞出了个基于 OpenCV C# 开发的直线卡尺工具,现在把它剥离出来分享给大家。这工具不仅能求直线交点,还带了个超强大的视觉控件源码,运行稳稳的,实测有效。

先说说这个直线交点的求解功能。在代码里,我们会用到一些基本的几何计算和 OpenCV 的相关方法。比如下面这段核心代码(伪代码示例):

// 假设已经检测到两条直线,用两个点来表示每条直线 Point line1Start = new Point(10, 10); Point line1End = new Point(100, 100); Point line2Start = new Point(50, 10); Point line2End = new Point(50, 150); // 计算直线交点的方法 Point IntersectPoint(Point l1s, Point l1e, Point l2s, Point l2e) { float a1 = l1e.Y - l1s.Y; float b1 = l1s.X - l1e.X; float c1 = a1 * l1s.X + b1 * l1s.Y; float a2 = l2e.Y - l2s.Y; float b2 = l2s.X - l2e.X; float c2 = a2 * l2s.X + b2 * l2s.Y; float determinant = a1 * b2 - a2 * b1; if (determinant == 0) { // 平行直线,无交点 return Point.Empty; } else { int x = (int)((b2 * c1 - b1 * c2) / determinant); int y = (int)((a1 * c2 - a2 * c1) / determinant); return new Point(x, y); } } Point intersection = IntersectPoint(line1Start, line1End, line2Start, line2End); if (intersection!= Point.Empty) { Console.WriteLine($"交点坐标: ({intersection.X}, {intersection.Y})"); } else { Console.WriteLine("两条直线平行,无交点"); }

在这段代码里,我们先定义了两条直线的起止点。然后通过IntersectPoint方法来计算它们的交点。这里用到了线性代数的知识,将直线方程转化为一般式ax + by = c,通过求解方程组来得到交点坐标。如果行列式determinant为 0,说明两条直线平行,就不存在交点啦。

再看看这个仿 Halcon 的视觉控件。它支持平移、无损缩放,还能显示各种自定义图形工具,鼠标拖动操作也非常方便。以下是一些简单的代码片段展示如何实现平移功能:

// 鼠标按下事件处理 private void visualControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { startPoint = e.Location; isDragging = true; } } // 鼠标移动事件处理 private void visualControl_MouseMove(object sender, MouseEventArgs e) { if (isDragging) { int dx = e.X - startPoint.X; int dy = e.Y - startPoint.Y; // 这里更新图像显示的位置,假设图像有个位移变量 imageOffset imageOffset.X += dx; imageOffset.Y += dy; startPoint = e.Location; // 重绘控件以显示新位置 visualControl.Invalidate(); } } // 鼠标释放事件处理 private void visualControl_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isDragging = false; } }

在上面的代码中,当鼠标左键按下时,记录起始点并标记为拖动状态。鼠标移动过程中,计算鼠标移动的偏移量并更新图像的显示位置,最后重绘控件展示新位置。鼠标释放时,取消拖动状态。

这个工具还包含了测试图片,方便大家上手测试和调试。总的来说,无论是用于学习 OpenCV 在 C# 中的应用,还是在实际项目中作为基础功能模块,这个直线卡尺工具源码都非常实用。希望大家能喜欢并从中获得一些灵感。如果有什么问题或者改进建议,欢迎在评论区留言交流~

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

【计算机毕业设计案例】基于JAVA白云山景点门票销售管理系统智能门票销售管理系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/20 8:49:25

【计算机毕业设计案例】基于JAVAweb的校园订餐系统基于JAVA的学院校内订餐系统的实现(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/18 20:47:11

【计算机毕业设计案例】基于Java的scratch少儿编程学习网站系统的设计与实现青少儿编程辅导教学平台(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/19 11:43:17

【计算机毕业设计案例】基于springboot公务员考试课程复习助学系统的微信小程序基于springboot+微信小程序的公务员助学系统小程序的设计与实现(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/17 20:51:15

Ubuntu Autoinstall Generator:自动化部署Ubuntu安装的终极解决方案

还在为重复的Ubuntu系统安装而烦恼吗?Ubuntu Autoinstall Generator 就是你的救星!这个神奇的工具能够帮你创建完全自动化的Ubuntu安装ISO,实现真正的"无人值守"部署体验。想象一下,从开机到系统就绪,全程无…

作者头像 李华