编程获取图像中的圆半径

2023-11-18

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

即将推出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 Mat
        kernel = 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/UruseiBest
        Dim contours As New VectorOfVectorOfPoint
        Dim hierarchy As New VectorOfRect

        CvInvoke.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/UruseiBest
        For i As Integer = 0 To contours.Size - 1
            Dim carea As VectorOfPoint = contours(i)
            '获得轮廓面积
            Dim area As Double = CvInvoke.ContourArea(carea, False)
            '符合条件时,绘制轮廓,排除圆形,只保留十字线 
            '本图中圆形面积为2449,直线面积为8,需要根据实际情况调整
            If area < 200 Then
                CvInvoke.DrawContours(m2, contours, i, New MCvScalar(255), 0.4)
            Else
                '得到圆形,图像中只有三个轮廓:2个交叉十字线段、1个圆形
                '这里简化操作,否则在多个轮廓情况下,应获取最大面积的轮廓判断为圆形
                contourCircle = contours(i)

                '获取轮廓周长
                perimeter = CvInvoke.ArcLength(contourCircle, True)
            End If
        Next
        ImageBox1.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 lines
            CvInvoke.Line(m3, line.P1, line.P2, New MCvScalar(0, 255, 0), 2)
        Next

        ImageBox2.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 lines
            Dim angle As Double = Math.Atan2(line.P2.Y - line.P1.Y, line.P2.X - line.P1.X) * 180 / Math.PI
            If angle < 0 Then angle += 180

            If angle > 60 AndAlso angle < 120 Then
                verticalLines.Add(line)
            ElseIf angle > 150 OrElse angle < 30 Then
                horizontalLines.Add(line)
            End If
        Next

        '对垂直和水平直线进行匹配,并计算十字中心点的位置:
        Dim intersections As New List(Of PointF)

        '得到两个相交点 https://blog.csdn.net/UruseiBest
        For Each verticalLine As LineSegment2D In verticalLines
            For Each horizontalLine As LineSegment2D In horizontalLines
                '基于图像中两条直线真实相交,
                '如果垂直线的中点X坐标在水平线两端点X坐标之间
                '那么,这条垂直线段和这条水平线段相交
                Dim centerX As Single = (verticalLine.P1.X + verticalLine.P2.X) / 2
                If horizontalLine.P1.X < horizontalLine.P2.X Then
                    If centerX > horizontalLine.P1.X And centerX < horizontalLine.P2.X Then
                        Dim 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 If
                Else
                    If centerX > horizontalLine.P2.X And centerX < horizontalLine.P1.X Then
                        Dim 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 If
                End If
            Next
        Next

        If intersections.Count <> 2 Then
            MessageBox.Show("未能获得两个十字线的交叉点")
            Exit Sub
        End If
        CvInvoke.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 CircleF
        cf = CvInvoke.MinEnclosingCircle(contourCircle)
        '获得外接圆形 https://blog.csdn.net/UruseiBest
        CvInvoke.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 Double
        realradius1 = proportion * cf.Radius


        '以下是基于轮廓周长来计算实际圆半径
        '实际圆周长
        Dim realperimeter As Double = perimeter * proportion

        '图像中的圆半径 https://blog.csdn.net/UruseiBest
        Dim radius As Double
        radius = (perimeter / Math.PI) / 2

        '实际圆半径
        Dim realradius2 As Double
        realradius2 = proportion * radius

        MessageBox.Show("最小外接圆来计算实际圆半径:" & realradius1 & ControlChars.CrLf &
                        "基于轮廓周长来计算实际圆半径:" & realradius2)

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程获取图像中的圆半径 的相关文章

  • Python中使用cv2获取当前视频播放位置

    我正在尝试使用 CV2 和 Python 从播放视频中获取当前播放时间位置 如果可能 以毫秒为单位 目前我正在使用此示例代码来播放视频文件 import cv2 import numpy as np file name 2 mp4 wind
  • Opencv中内存Mat表示

    我知道在内存中opencv将Mat对象表示为一个大数组 因此 如果我有 3 个尺寸为 200x200 的通道垫 那么在内存中它将将该垫存储在尺寸为 3x200x200 的数组中 或者更一般地说 内存中的任何 Mat 都将存储为channel
  • ECC 导致多光谱图像的图像对齐失败

    我正在尝试将 RGB 图像与 IR 图像 单通道 对齐 目标是创建 4 通道图像 R G B IR 为了做到这一点 我正在使用cv2 findTransformECC如中所述这个非常简洁的指南 https learnopencv com i
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • 使用 Unity3D 解决 PnP

    我有一个真实 物理的棍子 上面连接有红外摄像头和一些红外 LED 它们形成了我正在使用的模式 以便使虚拟棍子以与物理棍子相同的方式移动 为此 我在 Python 中使用 OpenCV 并将由solvePnP 计算的旋转和平移向量发送到 Un
  • OpenCV非旋转图像拼接

    我正在 OpenCV 中进行图像拼接 从不同位置拍摄平面场景的照片并尝试构图全景图 我修改了缝合示例以满足我的需要 openCV 拼接管道的问题是 它假设相机纯粹旋转 但对我来说情况并非如此 当拍摄的照片与场景完全正交时 没有相机旋转 只是
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 有没有办法检测图像是否模糊? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否有一种方法可以通过分析图像数据来确定图像是否模糊 估计图像清晰度的另一种非常简单的方法是使用拉普拉斯 或 LoG 滤波器并
  • Pyinstaller“无法执行脚本 pyi_rth_pkgres”并且缺少软件包

    这是我第一次在这里发布问题 因为我的大部分问题已经被其他人回答了 我正在 python 中开发 GUI 应用程序 并尝试使用 pyinstaller 将其打包到单个文件夹和 exe 中 以便于移植 目前 我使用 Windows 10 和 a
  • 如何计算立体视觉的基本矩阵

    我正在尝试编写一些代码来计算基本矩阵以确定立体图像之间的关系 我从大多数人推荐的 Hartley 和 Zisserman 书开始 但它没有任何实际示例 并且示例代码是在 MATLAB 中 而我没有 然后我切换到这个比较实用 里面有实际例子
  • 如何将 opencv mat 图像转换为 gdi 位图

    我想将 openCV Mat 文件转换为 GDI 位图图像 我找不到任何有关如何执行此操作的信息 我认为没有直接的方法可以做到这一点 但我希望它不涉及将其写入文件并读回 http opencv users 1802565 n2 nabble
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • 如何在 opencv 3.0 Beta 中从文件读取 UMat?

    我想用UMat所以我的代码可以使用 OpenCL OpenCV 3 0 0 Beta 在 GPU 和 CPU 上运行 但我找不到将图像文件读入的方法UMat或转换一个Mat to UMat 如何将图像读入UMat 样品用于Mat to UM
  • GrabCut - bgdModel 和 fgdModel 为空 - 断言错误

    我正在尝试使用 OpenCV2 1 C 中的 GrabCut 算法进行图像分割 这是我的代码 Mat rgbWorkImage imread argv 1 Mat mask mask Scalar 0 Mat bgdModel fgdMod
  • 在 Python 中使用音频流 RTMP 通过管道和 OpenCV 到 FFmpeg

    我正在尝试使用音频流式传输 FFmpeg 我将在下面展示我的代码 导入模块 import subprocess as sp 创建变量 rtmpUrl rtmp a rtmp youtube com live2 key camera path
  • 从凸点获取角点

    我编写了算法来提取图像中显示的点 它们形成凸形 我知道它们的顺序 如何从这些点中提取角点 顶部 3 个和底部 3 个 我正在使用opencv 如果你已经有了物体的凸包 并且该包包含角点 那么你需要做的就是简化包直到它只有 6 个点 有很多方

随机推荐

  • 一个程序员的现状

    前一阵子读了 Java夜未眠 有一个系列是说台湾程序员的的生活现状的 看后还真是有够感慨的 于是就想把自己的现状整理一下 再结合自己的工作经历 看看是否能反映出我们这一批程序员的普遍的生存状态 一 从专业说起 论程序员的出身专业 那无非就两
  • twaver html5 如何设置节点不可拖动

    解决思路 1 创建一个不可移动的图层 layer 2 设置不可拖动的节点node 的图层为 layer 见代码 var box new twaver ElementBox var network new twaver vector Netw
  • Debug Hacks学习笔记-1

    大多数Linux发行版关闭了内存转储功能 使用ulimit命令查看当前的内存转储是否有效 ulimit c 如果为0则关闭了 使用ulimit c unlimited或者设置一个上限可开启内核转储 当发生问题时进程的内存就会全部转储到内存转
  • mobaxterm设置中文界面显示_Adobe系列2020如何更改界面显示语言

    关于这个问题 网上有很多教程 最近几年版本的Adobe全家桶将界面显示语言设置放在了 AMT 文件夹下的 application xml 文件内 但我照着这些方法找了半天 发现application xml文件里根本就没有 zh CN 或
  • 目标检测之YOLOv1算法分析

    网络结构 卷积层 池化层 全连接层 输入 448 448 448 448 448 448大小的图片 输出 7 7
  • 王垠

    4 相关链接 王垠的Email shredderyin gmail com 王垠的自建博客 http www yinwang org 王垠的新浪博客 http blog sina com cn yinwang0 知乎上的 王垠 话题 htt
  • Windows脚本导入导出Mongodb数据库文件实现备份与恢复

    导出指定时间范围的数据 echo off setlocal rem 提前将MongoDB安装的bin路径加到系统环境变量PATH里面 方便直接运行mongodump命令 if not exist D MongoDB backup goto
  • js 原生导出 excel 文件

    const data name 张三 age 18 name 李四 age 20 const list 名字 t年龄 data map i gt i name t i age const blob new Blob list join n
  • quartz石英任务

    定时任务 quartz 的几大核心概念 Job 任务 我们需要完成的事情 要炸大本营 JobDetail 任务详情 任务怎么做 谁来做 执行任务需要的对象 数据信息等 张三 50吨TNT quartz 为了并发执行 Job 定义任务怎么执行
  • 安川服务器显示fn001,安川伺服辅助功能参数一览表

    辅助功能一览表 监视模式一览表 用户参数一览表 报警显示一览表 辅助功能一览表 Fn000 显示警报追踪备份数据 Fn001 设定在线自动调谐时的刚性 Fn002 微动 JOD 模式运行 Fn003 原点检索模式 Fn004 预约参数 请勿
  • Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx

    本人刚刚入手cv 见解浅陋 如有不对请多多包含 根据从网上查找的资料 遇到这种情况一般有以下几种解决方法 1 在程序运行的前面添加如下代码 os environ FLAGS eager delete tensor gb 0 0 但是对我好像
  • 你也可以构建私有区块链网络

    这是我如何构建私有区块链网络的一篇文章 你也可以 没有什么比自己构建区块链更能帮助理解区块链了 以下是我们将在这篇文章中完成的内容 下图我们以前可能见过 但基本上以太坊区块链网络只是很多EVM 以太坊虚拟机 或连接到每个其他节点的 节点 来
  • DDcGAN:用于多分辨率图像融合的双判别器生成对抗网络

    目录 论文下载地址 代码下载地址 论文作者 模型讲解 背景介绍 论文解读 DDcGAN总体结构 损失函数 网络具体结构 生成器 判别器 医学影像的融合 结果分析 数据集以及参数设置 训练细节 评估指标 红外与可见光图像融合的结果与分析 对比
  • 2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书

    2023安徽省 中银杯 职业技能大赛 网络安全 项目比赛任务书 2023安徽省 中银杯 职业技能大赛 网络安全 项目比赛任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 Windows Linux A 2 Nginx安全
  • 论文纠错(一)

    说说最近读的几篇论文的问题 果然有的论文还是不能细细地去读 一读就发现有问题 第一个是MSPCA里面的公式 7 到公式 8 那个Sr前面的2是不应该有的 也就是推导的时候出错了 第二个是GPUTENSOR里面的Gpu product的算法
  • BeyondCompare4破解

    转自 跳不出循环了 原文链接 https blog csdn net weixin 39298366 article details 84390224 将以下操作保存为bat文件 然后双击运行即可 reg delete HKEY CURRE
  • Flask数据库插件安装与配置教程

    Flask数据库插件安装与配置教程 数据插件安装 Flask使用数据库之前需要在python中安装额外的插件 这里主要用到Flask script 命令扩展解释器 PyMySQL 数据库驱动 Flask SQLAchemy ORM映射 和F
  • 【python实现网络爬虫22】唯品会商品信息实战步骤详解

    唯品会商品信息实战 1 目标网址和页面解析 2 爬虫初探 3 爬虫实操 3 1 进行商品id信息的爬取 3 2 商品id数据url构造 3 3 商品id数据格式转化及数量验证 3 4 商品详细信息获取 4 全部代码 手动反爬虫 原博地址 知
  • 可以用filament的示例material_sandbox来调整obj的pbr渲染参数,也有个gltf_viewer读取gltf模型

    如题 说不准以后导出文件就不用cesiumlab了 具体待查
  • 编程获取图像中的圆半径

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 即将推出EmguCV的教程 请大家还稍作等待 之前网友咨询如何获得图像中圆形的半径 其中有两个十字作为标定 十字之间距离为100mm 如下