如何使用 Python OpenCV 优化圆检测?

2024-03-09

我看过几页关于在 python 中使用 opencv 优化圆检测的页面。所有这些似乎都针对特定图片的具体情况。 cv2.HoughCircles 的每个参数的起点是什么?由于我不确定推荐值是什么,因此我尝试循环范围,但这并没有产生任何有希望的结果。为什么我无法检测到该图像中的任何圆圈?

import cv2
import numpy as np
image = cv2.imread('IMG_stack.png')
output = image.copy()
height, width = image.shape[:2]
maxWidth = int(width/10)
minWidth = int(width/20)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 20,param1=50,param2=50,minRadius=minWidth,maxRadius=maxWidth)


if circles is not None:
    # convert the (x, y) coordinates and radius of the circles to integers
    circlesRound = np.round(circles[0, :]).astype("int")
    # loop over the (x, y) coordinates and radius of the circles
    for (x, y, r) in circlesRound:
        cv2.circle(output, (x, y), r, (0, 255, 0), 4)
    cv2.imwrite(filename = 'test.circleDraw.png', img = output)
    cv2.imwrite(filename = 'test.circleDrawGray.png', img = gray)
else:
    print ('No circles found')

这应该是一个直接的圆检测,但检测到的所有圆都不是很接近。


您应该注意的主要参数是minDist, minRadius and maxRadius.

首先分析半径:您有一个宽 12 个圆、高 8 个圆的图像,这给您的直径大约为width/12对于每个圆,或半径(width/12)/2。您使用的约束允许算法检测比所需更大或更小的圆圈,因此您应该使用更适合您的图像的参数化。在这种情况下,我使用了间隔[0.9 * radius, 1.1 * radius].

由于没有重叠,你可以说两个圆之间的距离至少是直径,所以minDist可以设置为类似的东西2*minRadius.

这个实现与你的基本相同,只是更新了这 3 个参数:

%matplotlib inline
import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('data/balls.jpg')
output = image.copy()
height, width = image.shape[:2]
maxRadius = int(1.1*(width/12)/2)
minRadius = int(0.9*(width/12)/2)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(image=gray, 
                           method=cv2.HOUGH_GRADIENT, 
                           dp=1.2, 
                           minDist=2*minRadius,
                           param1=50,
                           param2=50,
                           minRadius=minRadius,
                           maxRadius=maxRadius                           
                          )

if circles is not None:
    # convert the (x, y) coordinates and radius of the circles to integers
    circlesRound = np.round(circles[0, :]).astype("int")
    # loop over the (x, y) coordinates and radius of the circles
    for (x, y, r) in circlesRound:
        cv2.circle(output, (x, y), r, (0, 255, 0), 4)

    plt.imshow(output)
else:
    print ('No circles found')

结果是:

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

如何使用 Python OpenCV 优化圆检测? 的相关文章

  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30

随机推荐

  • 捕获未通过 QuickFix 验证的传入 FIX 消息

    A Quickfix http www quickfixengine org 客户端使用以下方法验证传入消息XML 规范文件 http www quickfixengine org documentation 如果消息验证失败 quickf
  • 将数据从 UITableViewCell 推送到 UINavigationController

    我有一个 UISearchDisplaycontroller 我必须将信息推送到文本字段 并需要将其链接到导航视图控制器 这是我的代码 void prepareForSegue UIStoryboardSegue segue sender
  • 具有 ADT 和 Aux 模式的类型安全

    我正在使用 ADT 和 Aux 模式设计类型安全代码 并且无法摆脱一些asInstanceOf 这是示例 sealed trait Source case object FileSystem extends Source case obje
  • 如何限制 Phusion Passenger 内存使用?

    有没有办法限制 Phusion Passenger 在提供您的应用程序时使用的内存量 在我获得大量流量后 我的主机过来并终止了该进程 因此我最终提供了空白页面 我能做些什么来表达 嘿 不要使用超过 100Mb 的内存 并且无论网站有多超载
  • 在 Rails 中的多个数据库之间切换而不破坏事务

    我正在设置一个包含多个数据库的 Rails 应用程序 它用ActiveRecord Base establish connection db config在数据库之间切换 所有数据库都在database yml中配置 establish c
  • Arrays.stream().map().sum() 性能不稳定

    我偶然发现了一个对原始数组进行非常简单的映射 归约操作的性能曲线极其不稳定的实例 这是我的 jmh 基准代码 OutputTimeUnit TimeUnit NANOSECONDS BenchmarkMode Mode AverageTim
  • 如何在按钮单击时显示文本区域?

  • 使用python删除html标签?

    我知道可能有一百万个问题 但我想知道如何删除这些标签 而无需导入或使用 HTMLParser 或正则表达式 我尝试了一堆不同的替换语句来尝试删除 包含的部分字符串 但无济于事 基本上我正在处理的是 response urlopen url
  • 动态添加ImageView到View

    我正在制作一个使用 View 类的 Android 游戏 但我没有使用 XML 布局 我所有的图像都是用画布绘制的 现在我的问题是我无法使用位图 我正在尝试将 ImageView 动态添加到我的 View 类中 以使用可触摸事件 为什么是动
  • 反应“捕获”事件处理程序是否总是在本机非捕获处理程序之前触发?

    In 这个讨论线程 https discuss reactjs org t ordering of native and react events 829 2 苏菲 阿尔珀特 https stackoverflow com users 49
  • OAuthException (#368) 尝试的操作已被视为滥用或被禁止

    我正在尝试使用 Graph API 在我的墙上或我的一些朋友的墙上发布提要 我授予了该应用程序所需的所有权限 当我从页面发出请求时允许它们 我拥有有效的访问令牌 但即使发生此异常并且没有发布提要 我的帖子请求看起来不错 已授予权限 我需要做
  • 如何在 jQuery 中选择从当前元素开始的下一个“n”元素?

    如何选择从当前元素开始的下一个 n 元素 我的意思是 this attr 我想做 n 次 以n 4为例 this attr this next attr this next next attr this next next next att
  • 回流类型密封时的满射性检查

    当密封类型上的模式匹配不详尽时 Scala 会发出警告 但是当返回类型被密封时 我们是否可以检查函数是否返回所有情况 例如 考虑以下 ADT sealed trait Foo case object Bar extends Foo case
  • 捆绑包标识符 iOS 配置门户

    我是 iOS 企业计划的团队代理 我正在尝试添加一个新的应用程序 ID 新的应用程序 ID 以前从未在我的帐户中使用过 但可能已被另一个企业帐户使用 但是 提交后 它说 The bundle identifier you have spec
  • 通过 Django 管理站点添加数据时更改大小写(大写/小写)

    我正在配置我的新项目的管理站点 我有点怀疑我应该怎么做 通过管理站点添加数据时点击 保存 所有内容都转换为大写 编辑 好的 我知道 upper 属性 并且我做了一个视图 我知道该怎么做 但我想知道管理站点上是否有任何可用于字段配置的属性 P
  • 针对 Windows Phone 7 Internet Explorer 9 的条件注释

    Problem 条件注释 例如 p All other browsers p 不工作在 Windows Phone 7 上 或者 至少不是我的 Question 有谁知道如何使用这些评论 并且有测试了他们前 WP7 上的 IE 9 是否支持
  • Java Socket 编程不适用于 10,000 个客户端

    我可以创建多个线程来支持套接字编程中的多客户端功能 工作正常 但如果有 10 000 个客户端想要连接 我的服务器就无法创建这么多线程 如何管理线程以便我可以同时监听所有这些客户端 另外 如果在这种情况下服务器想要向特定客户端发送某些内容
  • 是否可以使用 .NET Remoting + TLS 1.2(或 1.1)?

    最近我们的 PCI DSS 扫描失败 并要求我们禁用 TLS 1 0 并启用 TLS 1 1 或 1 2 我在 Windows Server 2008 R2 盒子上找到了如何执行此操作的说明 但我们有一个使用 NET 远程处理的旧应用程序
  • ActiveSupport::Memoizes 指的是哪种 Ruby memoize 模式?

    因此在 Rails 3 2 中 ActiveSupport Memoizes 已被弃用 消息内容如下 DEPRECATION WARNING ActiveSupport Memoizable is deprecated and will b
  • 如何使用 Python OpenCV 优化圆检测?

    我看过几页关于在 python 中使用 opencv 优化圆检测的页面 所有这些似乎都针对特定图片的具体情况 cv2 HoughCircles 的每个参数的起点是什么 由于我不确定推荐值是什么 因此我尝试循环范围 但这并没有产生任何有希望的